@mcptoolshop/registry-stats 0.4.0 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.es.md +110 -60
- package/README.fr.md +151 -63
- package/README.hi.md +113 -63
- package/README.it.md +111 -61
- package/README.ja.md +109 -59
- package/README.md +37 -3
- package/README.pt-BR.md +107 -57
- package/README.zh.md +109 -59
- package/assets/logo.png +0 -0
- package/package.json +1 -1
package/README.hi.md
CHANGED
|
@@ -3,78 +3,97 @@
|
|
|
3
3
|
</p>
|
|
4
4
|
|
|
5
5
|
<p align="center">
|
|
6
|
-
<img src="
|
|
6
|
+
<img src="https://raw.githubusercontent.com/mcp-tool-shop-org/brand/main/logos/registry-stats/readme.png" alt="registry-stats logo" width="400" />
|
|
7
7
|
</p>
|
|
8
8
|
|
|
9
|
-
<
|
|
9
|
+
<p align="center">
|
|
10
|
+
One command. Five registries. All your download stats.
|
|
11
|
+
</p>
|
|
10
12
|
|
|
11
13
|
<p align="center">
|
|
12
|
-
|
|
14
|
+
<a href="https://github.com/mcp-tool-shop-org/registry-stats/actions/workflows/pages.yml"><img src="https://github.com/mcp-tool-shop-org/registry-stats/actions/workflows/pages.yml/badge.svg" alt="CI"></a>
|
|
15
|
+
<a href="https://opensource.org/licenses/MIT"><img src="https://img.shields.io/badge/License-MIT-yellow.svg" alt="MIT License"></a>
|
|
16
|
+
<a href="https://www.npmjs.com/package/@mcptoolshop/registry-stats"><img src="https://img.shields.io/npm/v/@mcptoolshop/registry-stats" alt="npm version"></a>
|
|
17
|
+
<a href="https://mcp-tool-shop-org.github.io/registry-stats/"><img src="https://img.shields.io/badge/Landing_Page-live-blue" alt="Landing Page"></a>
|
|
13
18
|
</p>
|
|
14
19
|
|
|
15
20
|
<p align="center">
|
|
16
|
-
<a href="https://mcp-tool-shop-org.github.io/registry-stats/"
|
|
17
|
-
<a href="
|
|
21
|
+
<a href="https://mcp-tool-shop-org.github.io/registry-stats/">Docs</a> ·
|
|
22
|
+
<a href="#install">Install</a> ·
|
|
18
23
|
<a href="#cli">CLI</a> ·
|
|
19
|
-
<a href="
|
|
20
|
-
<a href="
|
|
21
|
-
<a href="#rest-api
|
|
22
|
-
<a href="
|
|
24
|
+
<a href="#config-file">Config</a> ·
|
|
25
|
+
<a href="#programmatic-api">API</a> ·
|
|
26
|
+
<a href="#rest-api-server">REST Server</a> ·
|
|
27
|
+
<a href="#license">License</a>
|
|
23
28
|
</p>
|
|
24
29
|
|
|
25
30
|
---
|
|
26
31
|
|
|
27
|
-
यदि आप npm, PyPI, NuGet, VS Code
|
|
32
|
+
यदि आप npm, PyPI, NuGet, VS Code मार्केटप्लेस या डॉकर हब पर कुछ प्रकाशित करते हैं, तो वर्तमान में आपको "इस महीने मुझे कितने डाउनलोड मिले?" यह जानने के लिए पांच अलग-अलग एपीआई की आवश्यकता होती है। यह लाइब्रेरी आपको सभी के लिए एक ही इंटरफ़ेस प्रदान करती है - या तो कमांड-लाइन इंटरफ़ेस (CLI) के रूप में या प्रोग्रामेटिक एपीआई के रूप में।
|
|
28
33
|
|
|
29
|
-
शून्य निर्भरता।
|
|
34
|
+
शून्य निर्भरता। यह मूल `fetch()` का उपयोग करता है। Node 18 या उससे ऊपर।
|
|
30
35
|
|
|
31
|
-
## इंस्टॉल
|
|
36
|
+
## इंस्टॉल करें
|
|
32
37
|
|
|
33
38
|
```bash
|
|
34
39
|
npm install @mcptoolshop/registry-stats
|
|
35
40
|
```
|
|
36
41
|
|
|
37
|
-
## CLI
|
|
42
|
+
## कमांड-लाइन इंटरफ़ेस (CLI)
|
|
38
43
|
|
|
39
44
|
```bash
|
|
40
|
-
#
|
|
45
|
+
# Query a single registry
|
|
41
46
|
registry-stats express -r npm
|
|
47
|
+
# npm | express
|
|
48
|
+
# month: 283,472,710 week: 67,367,773 day: 11,566,113
|
|
42
49
|
|
|
43
|
-
#
|
|
50
|
+
# Query all registries at once
|
|
44
51
|
registry-stats express
|
|
45
52
|
|
|
46
|
-
#
|
|
53
|
+
# Time series with monthly breakdown + trend
|
|
47
54
|
registry-stats express -r npm --range 2025-01-01:2025-06-30
|
|
55
|
+
# 2025-01 142,359,021
|
|
56
|
+
# 2025-02 147,522,528
|
|
57
|
+
# ...
|
|
58
|
+
# Total: 448,383,383 Avg/day: 4,982,038 Trend: flat (-0.46%)
|
|
48
59
|
|
|
49
|
-
# JSON
|
|
60
|
+
# Raw JSON output
|
|
50
61
|
registry-stats express -r npm --json
|
|
51
62
|
|
|
52
|
-
#
|
|
63
|
+
# Other registries
|
|
53
64
|
registry-stats requests -r pypi
|
|
54
65
|
registry-stats Newtonsoft.Json -r nuget
|
|
55
66
|
registry-stats esbenp.prettier-vscode -r vscode
|
|
56
67
|
registry-stats library/node -r docker
|
|
57
68
|
|
|
58
|
-
#
|
|
69
|
+
# Create a config file
|
|
59
70
|
registry-stats --init
|
|
60
71
|
|
|
61
|
-
#
|
|
72
|
+
# Run with config — fetches all tracked packages
|
|
62
73
|
registry-stats
|
|
63
74
|
|
|
64
|
-
#
|
|
75
|
+
# Compare across registries
|
|
65
76
|
registry-stats express --compare
|
|
66
|
-
|
|
67
|
-
#
|
|
77
|
+
# express — comparison
|
|
78
|
+
#
|
|
79
|
+
# Metric npm pypi
|
|
80
|
+
# ─────────────────────────────────
|
|
81
|
+
# Total - -
|
|
82
|
+
# Month 283,472 47,201
|
|
83
|
+
# Week 67,367 11,800
|
|
84
|
+
# Day 11,566 1,686
|
|
85
|
+
|
|
86
|
+
# Export as CSV or chart-friendly JSON
|
|
68
87
|
registry-stats express -r npm --range 2025-01-01:2025-06-30 --format csv
|
|
69
88
|
registry-stats express -r npm --range 2025-01-01:2025-06-30 --format chart
|
|
70
89
|
|
|
71
|
-
# REST API
|
|
90
|
+
# Start a REST API server
|
|
72
91
|
registry-stats serve --port 3000
|
|
73
92
|
```
|
|
74
93
|
|
|
75
|
-
##
|
|
94
|
+
## कॉन्फ़िगरेशन फ़ाइल
|
|
76
95
|
|
|
77
|
-
अपने प्रोजेक्ट रूट में `registry-stats.config.json`
|
|
96
|
+
अपने प्रोजेक्ट के रूट में `registry-stats.config.json` फ़ाइल बनाएं (या `registry-stats --init` कमांड चलाएं):
|
|
78
97
|
|
|
79
98
|
```json
|
|
80
99
|
{
|
|
@@ -95,85 +114,104 @@ registry-stats serve --port 3000
|
|
|
95
114
|
}
|
|
96
115
|
```
|
|
97
116
|
|
|
98
|
-
बिना तर्क के `registry-stats`
|
|
117
|
+
सभी कॉन्फ़िगर किए गए पैकेजों के आंकड़े प्राप्त करने के लिए बिना किसी तर्क के `registry-stats` कमांड चलाएं। CLI, कॉन्फ़िगरेशन फ़ाइल ढूंढने के लिए वर्तमान कार्यशील निर्देशिका (cwd) से ऊपर की ओर खोज करता है।
|
|
118
|
+
|
|
119
|
+
कॉन्फ़िगरेशन प्रोग्रामेटिक रूप से भी उपलब्ध है:
|
|
120
|
+
|
|
121
|
+
```typescript
|
|
122
|
+
import { loadConfig, defaultConfig, starterConfig } from '@mcptoolshop/registry-stats';
|
|
123
|
+
|
|
124
|
+
const config = loadConfig(); // finds nearest config file, or null
|
|
125
|
+
const defaults = defaultConfig(); // returns default Config object
|
|
126
|
+
const template = starterConfig(); // returns starter JSON string
|
|
127
|
+
```
|
|
99
128
|
|
|
100
|
-
##
|
|
129
|
+
## प्रोग्रामेटिक एपीआई
|
|
101
130
|
|
|
102
131
|
```typescript
|
|
103
132
|
import { stats, calc, createCache } from '@mcptoolshop/registry-stats';
|
|
104
133
|
|
|
105
|
-
//
|
|
134
|
+
// Single registry
|
|
106
135
|
const npm = await stats('npm', 'express');
|
|
107
136
|
const pypi = await stats('pypi', 'requests');
|
|
137
|
+
const nuget = await stats('nuget', 'Newtonsoft.Json');
|
|
138
|
+
const vscode = await stats('vscode', 'esbenp.prettier-vscode');
|
|
139
|
+
const docker = await stats('docker', 'library/node');
|
|
108
140
|
|
|
109
|
-
//
|
|
141
|
+
// All registries at once (uses Promise.allSettled — never throws)
|
|
110
142
|
const all = await stats.all('express');
|
|
111
143
|
|
|
112
|
-
//
|
|
144
|
+
// Bulk — multiple packages, concurrency-limited (default: 5)
|
|
113
145
|
const bulk = await stats.bulk('npm', ['express', 'koa', 'fastify']);
|
|
114
146
|
|
|
115
|
-
//
|
|
147
|
+
// Time series (npm + pypi only)
|
|
116
148
|
const daily = await stats.range('npm', 'express', '2025-01-01', '2025-06-30');
|
|
117
149
|
|
|
118
|
-
//
|
|
119
|
-
calc.total(daily); //
|
|
120
|
-
calc.avg(daily); //
|
|
150
|
+
// Calculations
|
|
151
|
+
calc.total(daily); // sum of all downloads
|
|
152
|
+
calc.avg(daily); // daily average
|
|
153
|
+
calc.groupTotals(calc.monthly(daily)); // { '2025-01': 134982, ... }
|
|
121
154
|
calc.trend(daily); // { direction: 'up', changePercent: 8.3 }
|
|
122
|
-
calc.movingAvg(daily, 7); // 7
|
|
123
|
-
calc.popularity(daily); // 0-100
|
|
155
|
+
calc.movingAvg(daily, 7); // 7-day moving average
|
|
156
|
+
calc.popularity(daily); // 0-100 log-scale score
|
|
124
157
|
|
|
125
|
-
//
|
|
126
|
-
calc.toCSV(daily); //
|
|
127
|
-
calc.toChartData(daily, 'express'); // { labels: [...], datasets: [
|
|
158
|
+
// Export formats
|
|
159
|
+
calc.toCSV(daily); // "date,downloads\n2025-01-01,1234\n..."
|
|
160
|
+
calc.toChartData(daily, 'express'); // { labels: [...], datasets: [{ label, data }] }
|
|
128
161
|
|
|
129
|
-
//
|
|
162
|
+
// Comparison — same package across registries
|
|
130
163
|
const comparison = await stats.compare('express');
|
|
131
|
-
|
|
164
|
+
// → { package: 'express', registries: { npm: {...}, pypi: {...} }, fetchedAt: '...' }
|
|
165
|
+
await stats.compare('express', ['npm', 'pypi']); // specific registries only
|
|
132
166
|
|
|
133
|
-
//
|
|
167
|
+
// Caching (5 min TTL, in-memory)
|
|
134
168
|
const cache = createCache();
|
|
135
|
-
await stats('npm', 'express', { cache });
|
|
169
|
+
await stats('npm', 'express', { cache }); // fetches
|
|
170
|
+
await stats('npm', 'express', { cache }); // cache hit
|
|
136
171
|
```
|
|
137
172
|
|
|
138
|
-
## रजिस्ट्री
|
|
173
|
+
## रजिस्ट्री समर्थन
|
|
139
174
|
|
|
140
|
-
| रजिस्ट्री | पैकेज
|
|
141
|
-
|
|
142
|
-
| `npm` | `express`, `@scope/pkg` | हाँ (549 दिन) |
|
|
143
|
-
| `pypi` | `requests` | हाँ (180 दिन) |
|
|
144
|
-
| `nuget` | `Newtonsoft.Json` |
|
|
145
|
-
| `vscode` | `publisher.extension` |
|
|
146
|
-
| `docker` | `namespace/repo` |
|
|
175
|
+
| रजिस्ट्री | पैकेज प्रारूप | समय श्रृंखला | उपलब्ध डेटा |
|
|
176
|
+
| ---------- | --------------- | ------------- | ---------------- |
|
|
177
|
+
| `npm` | `express`, `@scope/pkg` | हाँ (549 दिन) | अंतिम दिन, अंतिम सप्ताह, अंतिम महीना |
|
|
178
|
+
| `pypi` | `requests` | हाँ (180 दिन) | अंतिम दिन, अंतिम सप्ताह, अंतिम महीना, कुल |
|
|
179
|
+
| `nuget` | `Newtonsoft.Json` | No | कुल |
|
|
180
|
+
| `vscode` | `publisher.extension` | No | कुल (इंस्टॉलेशन), रेटिंग, रुझान |
|
|
181
|
+
| `docker` | `namespace/repo` | No | कुल (डाउनलोड), सितारे |
|
|
147
182
|
|
|
148
|
-
##
|
|
183
|
+
## अंतर्निहित विश्वसनीयता
|
|
149
184
|
|
|
150
|
-
- 429/5xx त्रुटियों पर
|
|
151
|
-
- `Retry-After` हेडर का सम्मान
|
|
152
|
-
- बल्क अनुरोधों के लिए
|
|
153
|
-
- वैकल्पिक TTL कैश (
|
|
185
|
+
- 429/5xx त्रुटियों पर स्वचालित पुनः प्रयास, जिसमें घातीय बैकऑफ़ शामिल है।
|
|
186
|
+
- `Retry-After` हेडर का सम्मान करता है।
|
|
187
|
+
- बल्क अनुरोधों के लिए समवर्ती सीमा।
|
|
188
|
+
- वैकल्पिक TTL कैश (प्लग करने योग्य - `StatsCache` इंटरफ़ेस के माध्यम से अपना Redis/फ़ाइल बैकएंड प्रदान करें)।
|
|
154
189
|
|
|
155
|
-
## REST
|
|
190
|
+
## REST एपीआई सर्वर
|
|
156
191
|
|
|
157
|
-
माइक्रोसर्विस के रूप में
|
|
192
|
+
इसे एक माइक्रोसर्विस के रूप में चलाएं या इसे अपने सर्वर में एम्बेड करें:
|
|
158
193
|
|
|
159
194
|
```bash
|
|
195
|
+
# CLI
|
|
160
196
|
registry-stats serve --port 3000
|
|
161
197
|
```
|
|
162
198
|
|
|
163
199
|
```
|
|
164
|
-
GET /stats/:package #
|
|
165
|
-
GET /stats/:registry/:package #
|
|
200
|
+
GET /stats/:package # all registries
|
|
201
|
+
GET /stats/:registry/:package # single registry
|
|
166
202
|
GET /compare/:package?registries=npm,pypi
|
|
167
203
|
GET /range/:registry/:package?start=YYYY-MM-DD&end=YYYY-MM-DD&format=json|csv|chart
|
|
168
204
|
```
|
|
169
205
|
|
|
206
|
+
कस्टम सर्वरों या सर्वरलेस वातावरण के लिए प्रोग्रामेटिक उपयोग:
|
|
207
|
+
|
|
170
208
|
```typescript
|
|
171
209
|
import { createHandler, serve } from '@mcptoolshop/registry-stats';
|
|
172
210
|
|
|
173
|
-
//
|
|
211
|
+
// Option 1: Quick start
|
|
174
212
|
serve({ port: 3000 });
|
|
175
213
|
|
|
176
|
-
//
|
|
214
|
+
// Option 2: Bring your own server
|
|
177
215
|
import { createServer } from 'node:http';
|
|
178
216
|
const handler = createHandler();
|
|
179
217
|
createServer(handler).listen(3000);
|
|
@@ -202,6 +240,18 @@ registerProvider(cargo);
|
|
|
202
240
|
await stats('cargo', 'serde');
|
|
203
241
|
```
|
|
204
242
|
|
|
243
|
+
## वेबसाइट
|
|
244
|
+
|
|
245
|
+
दस्तावेज़/लैंडिंग पृष्ठ `site/` में स्थित है।
|
|
246
|
+
|
|
247
|
+
- विकास: `npm run site:dev`
|
|
248
|
+
- बिल्ड: `npm run site:build`
|
|
249
|
+
- पूर्वावलोकन: `npm run site:preview`
|
|
250
|
+
|
|
205
251
|
## लाइसेंस
|
|
206
252
|
|
|
207
253
|
MIT
|
|
254
|
+
|
|
255
|
+
---
|
|
256
|
+
|
|
257
|
+
यह <a href="https://mcp-tool-shop.github.io/">MCP Tool Shop</a> द्वारा बनाया गया है।
|
package/README.it.md
CHANGED
|
@@ -3,30 +3,35 @@
|
|
|
3
3
|
</p>
|
|
4
4
|
|
|
5
5
|
<p align="center">
|
|
6
|
-
<img src="
|
|
6
|
+
<img src="https://raw.githubusercontent.com/mcp-tool-shop-org/brand/main/logos/registry-stats/readme.png" alt="registry-stats logo" width="400" />
|
|
7
7
|
</p>
|
|
8
8
|
|
|
9
|
-
<
|
|
9
|
+
<p align="center">
|
|
10
|
+
One command. Five registries. All your download stats.
|
|
11
|
+
</p>
|
|
10
12
|
|
|
11
13
|
<p align="center">
|
|
12
|
-
|
|
14
|
+
<a href="https://github.com/mcp-tool-shop-org/registry-stats/actions/workflows/pages.yml"><img src="https://github.com/mcp-tool-shop-org/registry-stats/actions/workflows/pages.yml/badge.svg" alt="CI"></a>
|
|
15
|
+
<a href="https://opensource.org/licenses/MIT"><img src="https://img.shields.io/badge/License-MIT-yellow.svg" alt="MIT License"></a>
|
|
16
|
+
<a href="https://www.npmjs.com/package/@mcptoolshop/registry-stats"><img src="https://img.shields.io/npm/v/@mcptoolshop/registry-stats" alt="npm version"></a>
|
|
17
|
+
<a href="https://mcp-tool-shop-org.github.io/registry-stats/"><img src="https://img.shields.io/badge/Landing_Page-live-blue" alt="Landing Page"></a>
|
|
13
18
|
</p>
|
|
14
19
|
|
|
15
20
|
<p align="center">
|
|
16
21
|
<a href="https://mcp-tool-shop-org.github.io/registry-stats/">Docs</a> ·
|
|
17
|
-
<a href="#
|
|
22
|
+
<a href="#install">Install</a> ·
|
|
18
23
|
<a href="#cli">CLI</a> ·
|
|
19
|
-
<a href="#file
|
|
20
|
-
<a href="#api
|
|
21
|
-
<a href="#
|
|
22
|
-
<a href="#
|
|
24
|
+
<a href="#config-file">Config</a> ·
|
|
25
|
+
<a href="#programmatic-api">API</a> ·
|
|
26
|
+
<a href="#rest-api-server">REST Server</a> ·
|
|
27
|
+
<a href="#license">License</a>
|
|
23
28
|
</p>
|
|
24
29
|
|
|
25
30
|
---
|
|
26
31
|
|
|
27
|
-
Se
|
|
32
|
+
Se pubblicate su npm, PyPI, NuGet, VS Code Marketplace o Docker Hub, attualmente avete bisogno di cinque API diverse per rispondere alla domanda "quanti download ho avuto questo mese?". Questa libreria vi offre un'unica interfaccia per tutte, sia come interfaccia a riga di comando (CLI) che come API programmatica.
|
|
28
33
|
|
|
29
|
-
|
|
34
|
+
Nessuna dipendenza. Utilizza la funzione nativa `fetch()`. Node 18 o superiore.
|
|
30
35
|
|
|
31
36
|
## Installazione
|
|
32
37
|
|
|
@@ -34,47 +39,61 @@ Zero dipendenze. Usa `fetch()` nativo. Node 18+.
|
|
|
34
39
|
npm install @mcptoolshop/registry-stats
|
|
35
40
|
```
|
|
36
41
|
|
|
37
|
-
## CLI
|
|
42
|
+
## CLI (Interfaccia a riga di comando)
|
|
38
43
|
|
|
39
44
|
```bash
|
|
40
|
-
#
|
|
45
|
+
# Query a single registry
|
|
41
46
|
registry-stats express -r npm
|
|
47
|
+
# npm | express
|
|
48
|
+
# month: 283,472,710 week: 67,367,773 day: 11,566,113
|
|
42
49
|
|
|
43
|
-
#
|
|
50
|
+
# Query all registries at once
|
|
44
51
|
registry-stats express
|
|
45
52
|
|
|
46
|
-
#
|
|
53
|
+
# Time series with monthly breakdown + trend
|
|
47
54
|
registry-stats express -r npm --range 2025-01-01:2025-06-30
|
|
55
|
+
# 2025-01 142,359,021
|
|
56
|
+
# 2025-02 147,522,528
|
|
57
|
+
# ...
|
|
58
|
+
# Total: 448,383,383 Avg/day: 4,982,038 Trend: flat (-0.46%)
|
|
48
59
|
|
|
49
|
-
#
|
|
60
|
+
# Raw JSON output
|
|
50
61
|
registry-stats express -r npm --json
|
|
51
62
|
|
|
52
|
-
#
|
|
63
|
+
# Other registries
|
|
53
64
|
registry-stats requests -r pypi
|
|
54
65
|
registry-stats Newtonsoft.Json -r nuget
|
|
55
66
|
registry-stats esbenp.prettier-vscode -r vscode
|
|
56
67
|
registry-stats library/node -r docker
|
|
57
68
|
|
|
58
|
-
#
|
|
69
|
+
# Create a config file
|
|
59
70
|
registry-stats --init
|
|
60
71
|
|
|
61
|
-
#
|
|
72
|
+
# Run with config — fetches all tracked packages
|
|
62
73
|
registry-stats
|
|
63
74
|
|
|
64
|
-
#
|
|
75
|
+
# Compare across registries
|
|
65
76
|
registry-stats express --compare
|
|
66
|
-
|
|
67
|
-
#
|
|
77
|
+
# express — comparison
|
|
78
|
+
#
|
|
79
|
+
# Metric npm pypi
|
|
80
|
+
# ─────────────────────────────────
|
|
81
|
+
# Total - -
|
|
82
|
+
# Month 283,472 47,201
|
|
83
|
+
# Week 67,367 11,800
|
|
84
|
+
# Day 11,566 1,686
|
|
85
|
+
|
|
86
|
+
# Export as CSV or chart-friendly JSON
|
|
68
87
|
registry-stats express -r npm --range 2025-01-01:2025-06-30 --format csv
|
|
69
88
|
registry-stats express -r npm --range 2025-01-01:2025-06-30 --format chart
|
|
70
89
|
|
|
71
|
-
#
|
|
90
|
+
# Start a REST API server
|
|
72
91
|
registry-stats serve --port 3000
|
|
73
92
|
```
|
|
74
93
|
|
|
75
|
-
## File di
|
|
94
|
+
## File di configurazione
|
|
76
95
|
|
|
77
|
-
|
|
96
|
+
Create un file `registry-stats.config.json` nella directory principale del vostro progetto (oppure eseguite `registry-stats --init`):
|
|
78
97
|
|
|
79
98
|
```json
|
|
80
99
|
{
|
|
@@ -95,91 +114,110 @@ Crea un `registry-stats.config.json` nella root del progetto (o esegui `registry
|
|
|
95
114
|
}
|
|
96
115
|
```
|
|
97
116
|
|
|
98
|
-
|
|
117
|
+
Eseguite `registry-stats` senza argomenti per ottenere le statistiche per tutti i pacchetti configurati. La CLI cerca il file di configurazione a partire dalla directory corrente.
|
|
118
|
+
|
|
119
|
+
La configurazione è disponibile anche tramite API programmatica:
|
|
120
|
+
|
|
121
|
+
```typescript
|
|
122
|
+
import { loadConfig, defaultConfig, starterConfig } from '@mcptoolshop/registry-stats';
|
|
123
|
+
|
|
124
|
+
const config = loadConfig(); // finds nearest config file, or null
|
|
125
|
+
const defaults = defaultConfig(); // returns default Config object
|
|
126
|
+
const template = starterConfig(); // returns starter JSON string
|
|
127
|
+
```
|
|
99
128
|
|
|
100
|
-
## API
|
|
129
|
+
## API programmatica
|
|
101
130
|
|
|
102
131
|
```typescript
|
|
103
132
|
import { stats, calc, createCache } from '@mcptoolshop/registry-stats';
|
|
104
133
|
|
|
105
|
-
//
|
|
134
|
+
// Single registry
|
|
106
135
|
const npm = await stats('npm', 'express');
|
|
107
136
|
const pypi = await stats('pypi', 'requests');
|
|
137
|
+
const nuget = await stats('nuget', 'Newtonsoft.Json');
|
|
138
|
+
const vscode = await stats('vscode', 'esbenp.prettier-vscode');
|
|
139
|
+
const docker = await stats('docker', 'library/node');
|
|
108
140
|
|
|
109
|
-
//
|
|
141
|
+
// All registries at once (uses Promise.allSettled — never throws)
|
|
110
142
|
const all = await stats.all('express');
|
|
111
143
|
|
|
112
|
-
//
|
|
144
|
+
// Bulk — multiple packages, concurrency-limited (default: 5)
|
|
113
145
|
const bulk = await stats.bulk('npm', ['express', 'koa', 'fastify']);
|
|
114
146
|
|
|
115
|
-
//
|
|
147
|
+
// Time series (npm + pypi only)
|
|
116
148
|
const daily = await stats.range('npm', 'express', '2025-01-01', '2025-06-30');
|
|
117
149
|
|
|
118
|
-
//
|
|
119
|
-
calc.total(daily); //
|
|
120
|
-
calc.avg(daily); //
|
|
150
|
+
// Calculations
|
|
151
|
+
calc.total(daily); // sum of all downloads
|
|
152
|
+
calc.avg(daily); // daily average
|
|
153
|
+
calc.groupTotals(calc.monthly(daily)); // { '2025-01': 134982, ... }
|
|
121
154
|
calc.trend(daily); // { direction: 'up', changePercent: 8.3 }
|
|
122
|
-
calc.movingAvg(daily, 7); //
|
|
123
|
-
calc.popularity(daily); //
|
|
155
|
+
calc.movingAvg(daily, 7); // 7-day moving average
|
|
156
|
+
calc.popularity(daily); // 0-100 log-scale score
|
|
124
157
|
|
|
125
|
-
//
|
|
126
|
-
calc.toCSV(daily); //
|
|
127
|
-
calc.toChartData(daily, 'express'); // { labels: [...], datasets: [
|
|
158
|
+
// Export formats
|
|
159
|
+
calc.toCSV(daily); // "date,downloads\n2025-01-01,1234\n..."
|
|
160
|
+
calc.toChartData(daily, 'express'); // { labels: [...], datasets: [{ label, data }] }
|
|
128
161
|
|
|
129
|
-
//
|
|
162
|
+
// Comparison — same package across registries
|
|
130
163
|
const comparison = await stats.compare('express');
|
|
131
|
-
|
|
164
|
+
// → { package: 'express', registries: { npm: {...}, pypi: {...} }, fetchedAt: '...' }
|
|
165
|
+
await stats.compare('express', ['npm', 'pypi']); // specific registries only
|
|
132
166
|
|
|
133
|
-
//
|
|
167
|
+
// Caching (5 min TTL, in-memory)
|
|
134
168
|
const cache = createCache();
|
|
135
|
-
await stats('npm', 'express', { cache });
|
|
169
|
+
await stats('npm', 'express', { cache }); // fetches
|
|
170
|
+
await stats('npm', 'express', { cache }); // cache hit
|
|
136
171
|
```
|
|
137
172
|
|
|
138
|
-
## Supporto
|
|
173
|
+
## Supporto per i registri
|
|
139
174
|
|
|
140
|
-
| Registro | Formato pacchetto | Serie
|
|
141
|
-
|
|
142
|
-
| `npm` | `express`, `@scope/pkg` | Sì (549 giorni) |
|
|
143
|
-
| `pypi` | `requests` | Sì (180 giorni) |
|
|
144
|
-
| `nuget` | `Newtonsoft.Json` | No |
|
|
145
|
-
| `vscode` | `publisher.extension` | No |
|
|
146
|
-
| `docker` | `namespace/repo` | No |
|
|
175
|
+
| Registro | Formato del pacchetto | Serie temporali | Dati disponibili |
|
|
176
|
+
| ---------- | --------------- | ------------- | ---------------- |
|
|
177
|
+
| `npm` | `express`, `@scope/pkg` | Sì (549 giorni) | giorno precedente, settimana precedente, mese precedente |
|
|
178
|
+
| `pypi` | `requests` | Sì (180 giorni) | giorno precedente, settimana precedente, mese precedente, totale |
|
|
179
|
+
| `nuget` | `Newtonsoft.Json` | No | totale |
|
|
180
|
+
| `vscode` | `publisher.extension` | No | totale (installazioni), valutazione, tendenze |
|
|
181
|
+
| `docker` | `namespace/repo` | No | totale (download), stelle |
|
|
147
182
|
|
|
148
|
-
## Affidabilità
|
|
183
|
+
## Affidabilità integrata
|
|
149
184
|
|
|
150
|
-
-
|
|
185
|
+
- Tentativi automatici con backoff esponenziale in caso di errori 429/5xx
|
|
151
186
|
- Rispetta le intestazioni `Retry-After`
|
|
152
|
-
- Limitazione della concorrenza per richieste
|
|
153
|
-
- Cache TTL opzionale (
|
|
187
|
+
- Limitazione della concorrenza per richieste di massa
|
|
188
|
+
- Cache TTL opzionale (configurabile: potete fornire la vostra implementazione Redis/file tramite l'interfaccia `StatsCache`)
|
|
154
189
|
|
|
155
|
-
## Server REST
|
|
190
|
+
## Server API REST
|
|
156
191
|
|
|
157
|
-
|
|
192
|
+
Eseguite come microservizio o integrate nel vostro server:
|
|
158
193
|
|
|
159
194
|
```bash
|
|
195
|
+
# CLI
|
|
160
196
|
registry-stats serve --port 3000
|
|
161
197
|
```
|
|
162
198
|
|
|
163
199
|
```
|
|
164
|
-
GET /stats/:package #
|
|
165
|
-
GET /stats/:registry/:package #
|
|
200
|
+
GET /stats/:package # all registries
|
|
201
|
+
GET /stats/:registry/:package # single registry
|
|
166
202
|
GET /compare/:package?registries=npm,pypi
|
|
167
203
|
GET /range/:registry/:package?start=YYYY-MM-DD&end=YYYY-MM-DD&format=json|csv|chart
|
|
168
204
|
```
|
|
169
205
|
|
|
206
|
+
Utilizzo programmatica per server personalizzati o serverless:
|
|
207
|
+
|
|
170
208
|
```typescript
|
|
171
209
|
import { createHandler, serve } from '@mcptoolshop/registry-stats';
|
|
172
210
|
|
|
173
|
-
//
|
|
211
|
+
// Option 1: Quick start
|
|
174
212
|
serve({ port: 3000 });
|
|
175
213
|
|
|
176
|
-
//
|
|
214
|
+
// Option 2: Bring your own server
|
|
177
215
|
import { createServer } from 'node:http';
|
|
178
216
|
const handler = createHandler();
|
|
179
217
|
createServer(handler).listen(3000);
|
|
180
218
|
```
|
|
181
219
|
|
|
182
|
-
## Registri
|
|
220
|
+
## Registri personalizzati
|
|
183
221
|
|
|
184
222
|
```typescript
|
|
185
223
|
import { registerProvider, type RegistryProvider } from '@mcptoolshop/registry-stats';
|
|
@@ -202,6 +240,18 @@ registerProvider(cargo);
|
|
|
202
240
|
await stats('cargo', 'serde');
|
|
203
241
|
```
|
|
204
242
|
|
|
243
|
+
## Sito web
|
|
244
|
+
|
|
245
|
+
Il sito web e la documentazione si trovano nella directory `site/`.
|
|
246
|
+
|
|
247
|
+
- Sviluppo: `npm run site:dev`
|
|
248
|
+
- Build: `npm run site:build`
|
|
249
|
+
- Anteprima: `npm run site:preview`
|
|
250
|
+
|
|
205
251
|
## Licenza
|
|
206
252
|
|
|
207
253
|
MIT
|
|
254
|
+
|
|
255
|
+
---
|
|
256
|
+
|
|
257
|
+
Creato da <a href="https://mcp-tool-shop.github.io/">MCP Tool Shop</a>
|