nept-metrics-core 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.md +54 -0
- package/dist/clickhouse.d.ts +14 -0
- package/dist/clickhouse.d.ts.map +1 -0
- package/dist/clickhouse.js +132 -0
- package/dist/clickhouse.js.map +1 -0
- package/dist/index.d.ts +28 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +182 -0
- package/dist/index.js.map +1 -0
- package/dist/models/index.d.ts +32 -0
- package/dist/models/index.d.ts.map +1 -0
- package/dist/models/index.js +3 -0
- package/dist/models/index.js.map +1 -0
- package/dist/test.d.ts +2 -0
- package/dist/test.d.ts.map +1 -0
- package/dist/test.js +129 -0
- package/dist/test.js.map +1 -0
- package/dist/types/index.d.ts +9 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +3 -0
- package/dist/types/index.js.map +1 -0
- package/package.json +28 -0
package/README.md
ADDED
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
# nept-metrics-core
|
|
2
|
+
|
|
3
|
+
A dedicated, type-safe Node.js module for handling NEPT metrics, backed by ClickHouse.
|
|
4
|
+
|
|
5
|
+
## Features
|
|
6
|
+
|
|
7
|
+
- **Type-Safe**: Built with TypeScript and Zod for robust data validation.
|
|
8
|
+
- **ClickHouse Integration**: Direct ingestion and querying using `@clickhouse/client`.
|
|
9
|
+
- **Distributed**: Designed to be used across multiple microservices.
|
|
10
|
+
|
|
11
|
+
## Installation
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
npm install nept-metrics-core
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
## Usage
|
|
18
|
+
|
|
19
|
+
```typescript
|
|
20
|
+
import { NeptMetrics } from "nept-metrics-core";
|
|
21
|
+
|
|
22
|
+
// Initialize client
|
|
23
|
+
const metrics = new NeptMetrics(
|
|
24
|
+
"http://localhost:8123",
|
|
25
|
+
"default",
|
|
26
|
+
"password",
|
|
27
|
+
"nept_metrics",
|
|
28
|
+
);
|
|
29
|
+
|
|
30
|
+
// Ingest a log
|
|
31
|
+
await metrics.ingestLog({
|
|
32
|
+
id: crypto.randomUUID(),
|
|
33
|
+
timestamp: new Date().toISOString(),
|
|
34
|
+
level: "info",
|
|
35
|
+
message: "User logged in",
|
|
36
|
+
source: "auth-service",
|
|
37
|
+
projectId: "project-123",
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
// Query metrics
|
|
41
|
+
const requestVolume = await metrics.getRequestVolume(
|
|
42
|
+
"project-123",
|
|
43
|
+
new Date("2023-01-01"),
|
|
44
|
+
new Date(),
|
|
45
|
+
);
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
## Data Models
|
|
49
|
+
|
|
50
|
+
- **Logs**
|
|
51
|
+
- **Request Metrics** (Volume)
|
|
52
|
+
- **Latency Metrics**
|
|
53
|
+
- **Bandwidth Metrics**
|
|
54
|
+
- **Asset Distribution**
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { ClickHouseClient } from "@clickhouse/client";
|
|
2
|
+
import { LogEntry } from "./types";
|
|
3
|
+
export declare class MetricsClient {
|
|
4
|
+
private client;
|
|
5
|
+
constructor(host: string, username?: string, password?: string, database?: string);
|
|
6
|
+
getClient(): ClickHouseClient;
|
|
7
|
+
insertMetrics(table: string, metrics: any[]): Promise<void>;
|
|
8
|
+
queryMetrics<T>(query: string, params?: Record<string, unknown>): Promise<T[]>;
|
|
9
|
+
insertLogs(table: string, logs: LogEntry[]): Promise<void>;
|
|
10
|
+
queryLogs(query: string, params?: Record<string, unknown>): Promise<LogEntry[]>;
|
|
11
|
+
clearTables(): Promise<void>;
|
|
12
|
+
initTables(): Promise<void>;
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=clickhouse.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"clickhouse.d.ts","sourceRoot":"","sources":["../src/clickhouse.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAgB,MAAM,oBAAoB,CAAC;AACpE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAEnC,qBAAa,aAAa;IACxB,OAAO,CAAC,MAAM,CAAmB;gBAG/B,IAAI,EAAE,MAAM,EACZ,QAAQ,GAAE,MAAkB,EAC5B,QAAQ,CAAC,EAAE,MAAM,EACjB,QAAQ,GAAE,MAAkB;IAUvB,SAAS,IAAI,gBAAgB;IAIvB,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAU3D,YAAY,CAAC,CAAC,EACzB,KAAK,EAAE,MAAM,EACb,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC/B,OAAO,CAAC,CAAC,EAAE,CAAC;IAUF,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAe1D,SAAS,CACpB,KAAK,EAAE,MAAM,EACb,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC/B,OAAO,CAAC,QAAQ,EAAE,CAAC;IAIT,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC;IAiB5B,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;CAiEzC"}
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.MetricsClient = void 0;
|
|
4
|
+
const client_1 = require("@clickhouse/client");
|
|
5
|
+
class MetricsClient {
|
|
6
|
+
constructor(host, username = "default", password, database = "default") {
|
|
7
|
+
this.client = (0, client_1.createClient)({
|
|
8
|
+
url: host,
|
|
9
|
+
username: username,
|
|
10
|
+
password: password,
|
|
11
|
+
database: database,
|
|
12
|
+
});
|
|
13
|
+
}
|
|
14
|
+
getClient() {
|
|
15
|
+
return this.client;
|
|
16
|
+
}
|
|
17
|
+
async insertMetrics(table, metrics) {
|
|
18
|
+
if (!metrics.length)
|
|
19
|
+
return;
|
|
20
|
+
await this.client.insert({
|
|
21
|
+
table: table,
|
|
22
|
+
values: metrics,
|
|
23
|
+
format: "JSONEachRow",
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
async queryMetrics(query, params) {
|
|
27
|
+
const resultSet = await this.client.query({
|
|
28
|
+
query: query,
|
|
29
|
+
format: "JSONEachRow",
|
|
30
|
+
query_params: params,
|
|
31
|
+
});
|
|
32
|
+
const dataset = await resultSet.json();
|
|
33
|
+
return dataset;
|
|
34
|
+
}
|
|
35
|
+
async insertLogs(table, logs) {
|
|
36
|
+
if (!logs.length)
|
|
37
|
+
return;
|
|
38
|
+
const preparedLogs = logs.map((log) => ({
|
|
39
|
+
...log,
|
|
40
|
+
timestamp: log.timestamp || Math.floor(Date.now() / 1000),
|
|
41
|
+
}));
|
|
42
|
+
await this.client.insert({
|
|
43
|
+
table: table,
|
|
44
|
+
values: preparedLogs,
|
|
45
|
+
format: "JSONEachRow",
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
async queryLogs(query, params) {
|
|
49
|
+
return this.queryMetrics(query, params);
|
|
50
|
+
}
|
|
51
|
+
async clearTables() {
|
|
52
|
+
const tables = [
|
|
53
|
+
"logs",
|
|
54
|
+
"request_metrics",
|
|
55
|
+
"latency_metrics",
|
|
56
|
+
"bandwidth_metrics",
|
|
57
|
+
"asset_distribution",
|
|
58
|
+
"log_entries",
|
|
59
|
+
];
|
|
60
|
+
for (const table of tables) {
|
|
61
|
+
await this.client.command({
|
|
62
|
+
query: `DROP TABLE IF EXISTS ${table}`,
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
async initTables() {
|
|
67
|
+
const tableQueries = [
|
|
68
|
+
`
|
|
69
|
+
CREATE TABLE IF NOT EXISTS logs (
|
|
70
|
+
id UUID,
|
|
71
|
+
timestamp DateTime64(3, 'UTC'),
|
|
72
|
+
level Enum('info' = 1, 'warn' = 2, 'error' = 3, 'debug' = 4),
|
|
73
|
+
message String,
|
|
74
|
+
source String,
|
|
75
|
+
statusCode Nullable(UInt16),
|
|
76
|
+
latency Nullable(UInt32),
|
|
77
|
+
projectId UUID
|
|
78
|
+
) ENGINE = MergeTree()
|
|
79
|
+
ORDER BY (projectId, timestamp)
|
|
80
|
+
`,
|
|
81
|
+
`
|
|
82
|
+
CREATE TABLE IF NOT EXISTS request_metrics (
|
|
83
|
+
timestamp DateTime64(3, 'UTC'),
|
|
84
|
+
value Float64,
|
|
85
|
+
projectId UUID
|
|
86
|
+
) ENGINE = MergeTree()
|
|
87
|
+
ORDER BY (projectId, timestamp)
|
|
88
|
+
`,
|
|
89
|
+
`
|
|
90
|
+
CREATE TABLE IF NOT EXISTS latency_metrics (
|
|
91
|
+
timestamp DateTime64(3, 'UTC'),
|
|
92
|
+
ms Float64,
|
|
93
|
+
projectId UUID
|
|
94
|
+
) ENGINE = MergeTree()
|
|
95
|
+
ORDER BY (projectId, timestamp)
|
|
96
|
+
`,
|
|
97
|
+
`
|
|
98
|
+
CREATE TABLE IF NOT EXISTS bandwidth_metrics (
|
|
99
|
+
timestamp DateTime64(3, 'UTC'),
|
|
100
|
+
value Float64,
|
|
101
|
+
projectId UUID
|
|
102
|
+
) ENGINE = MergeTree()
|
|
103
|
+
ORDER BY (projectId, timestamp)
|
|
104
|
+
`,
|
|
105
|
+
`
|
|
106
|
+
CREATE TABLE IF NOT EXISTS asset_distribution (
|
|
107
|
+
name String,
|
|
108
|
+
value Float64,
|
|
109
|
+
projectId UUID,
|
|
110
|
+
timestamp DateTime64(3, 'UTC')
|
|
111
|
+
) ENGINE = MergeTree()
|
|
112
|
+
ORDER BY (projectId, timestamp)
|
|
113
|
+
`,
|
|
114
|
+
`
|
|
115
|
+
CREATE TABLE IF NOT EXISTS log_entries (
|
|
116
|
+
timestamp UInt32,
|
|
117
|
+
level Enum('info' = 1, 'error' = 2, 'warning' = 3, 'debug' = 4, 'run' = 5),
|
|
118
|
+
message String,
|
|
119
|
+
status Nullable(Enum('completed' = 1, 'in-progress' = 2, 'failed' = 3))
|
|
120
|
+
) ENGINE = MergeTree()
|
|
121
|
+
ORDER BY timestamp
|
|
122
|
+
`,
|
|
123
|
+
];
|
|
124
|
+
for (const query of tableQueries) {
|
|
125
|
+
await this.client.command({
|
|
126
|
+
query,
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
exports.MetricsClient = MetricsClient;
|
|
132
|
+
//# sourceMappingURL=clickhouse.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"clickhouse.js","sourceRoot":"","sources":["../src/clickhouse.ts"],"names":[],"mappings":";;;AAAA,+CAAoE;AAGpE,MAAa,aAAa;IAGxB,YACE,IAAY,EACZ,WAAmB,SAAS,EAC5B,QAAiB,EACjB,WAAmB,SAAS;QAE5B,IAAI,CAAC,MAAM,GAAG,IAAA,qBAAY,EAAC;YACzB,GAAG,EAAE,IAAI;YACT,QAAQ,EAAE,QAAQ;YAClB,QAAQ,EAAE,QAAQ;YAClB,QAAQ,EAAE,QAAQ;SACnB,CAAC,CAAC;IACL,CAAC;IAEM,SAAS;QACd,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;IAEM,KAAK,CAAC,aAAa,CAAC,KAAa,EAAE,OAAc;QACtD,IAAI,CAAC,OAAO,CAAC,MAAM;YAAE,OAAO;QAE5B,MAAM,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC;YACvB,KAAK,EAAE,KAAK;YACZ,MAAM,EAAE,OAAO;YACf,MAAM,EAAE,aAAa;SACtB,CAAC,CAAC;IACL,CAAC;IAEM,KAAK,CAAC,YAAY,CACvB,KAAa,EACb,MAAgC;QAEhC,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC;YACxC,KAAK,EAAE,KAAK;YACZ,MAAM,EAAE,aAAa;YACrB,YAAY,EAAE,MAAM;SACrB,CAAC,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,SAAS,CAAC,IAAI,EAAE,CAAC;QACvC,OAAO,OAAc,CAAC;IACxB,CAAC;IAEM,KAAK,CAAC,UAAU,CAAC,KAAa,EAAE,IAAgB;QACrD,IAAI,CAAC,IAAI,CAAC,MAAM;YAAE,OAAO;QAEzB,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;YACtC,GAAG,GAAG;YACN,SAAS,EAAE,GAAG,CAAC,SAAS,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;SAC1D,CAAC,CAAC,CAAC;QAEJ,MAAM,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC;YACvB,KAAK,EAAE,KAAK;YACZ,MAAM,EAAE,YAAY;YACpB,MAAM,EAAE,aAAa;SACtB,CAAC,CAAC;IACL,CAAC;IAEM,KAAK,CAAC,SAAS,CACpB,KAAa,EACb,MAAgC;QAEhC,OAAO,IAAI,CAAC,YAAY,CAAW,KAAK,EAAE,MAAM,CAAC,CAAC;IACpD,CAAC;IAEM,KAAK,CAAC,WAAW;QACtB,MAAM,MAAM,GAAG;YACb,MAAM;YACN,iBAAiB;YACjB,iBAAiB;YACjB,mBAAmB;YACnB,oBAAoB;YACpB,aAAa;SACd,CAAC;QAEF,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC3B,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC;gBACxB,KAAK,EAAE,wBAAwB,KAAK,EAAE;aACvC,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAEM,KAAK,CAAC,UAAU;QACrB,MAAM,YAAY,GAAG;YACnB;;;;;;;;;;;;OAYC;YACD;;;;;;;OAOC;YACD;;;;;;;OAOC;YACD;;;;;;;OAOC;YACD;;;;;;;;OAQC;YACD;;;;;;;;OAQC;SACF,CAAC;QAEF,KAAK,MAAM,KAAK,IAAI,YAAY,EAAE,CAAC;YACjC,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC;gBACxB,KAAK;aACN,CAAC,CAAC;QACL,CAAC;IACH,CAAC;CACF;AApJD,sCAoJC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { Log, RequestMetric, LatencyMetric, BandwidthMetric, AssetDistribution } from "./models";
|
|
2
|
+
export * from "./types";
|
|
3
|
+
import { LogEntry } from "./types";
|
|
4
|
+
export declare class NeptMetrics {
|
|
5
|
+
private client;
|
|
6
|
+
constructor(host: string, username?: string, password?: string, database?: string);
|
|
7
|
+
init(): Promise<void>;
|
|
8
|
+
clear(): Promise<void>;
|
|
9
|
+
private cleanTimestamp;
|
|
10
|
+
ingestLog(log: Log): Promise<void>;
|
|
11
|
+
ingestLogs(logs: Log[]): Promise<void>;
|
|
12
|
+
ingestRequestMetric(metric: RequestMetric): Promise<void>;
|
|
13
|
+
ingestRequestMetrics(metrics: RequestMetric[]): Promise<void>;
|
|
14
|
+
ingestLatencyMetric(metric: LatencyMetric): Promise<void>;
|
|
15
|
+
ingestLatencyMetrics(metrics: LatencyMetric[]): Promise<void>;
|
|
16
|
+
ingestBandwidthMetric(metric: BandwidthMetric): Promise<void>;
|
|
17
|
+
ingestBandwidthMetrics(metrics: BandwidthMetric[]): Promise<void>;
|
|
18
|
+
ingestAssetDistribution(metrics: AssetDistribution[]): Promise<void>;
|
|
19
|
+
ingestLogEntry(log: LogEntry): Promise<void>;
|
|
20
|
+
ingestLogEntries(logs: LogEntry[]): Promise<void>;
|
|
21
|
+
getLogs(projectId: string, startDate: Date, endDate: Date, limit?: number): Promise<Log[]>;
|
|
22
|
+
getLogEntries(startDate: Date, endDate: Date, limit?: number): Promise<LogEntry[]>;
|
|
23
|
+
getRequestVolume(projectId: string, startDate: Date, endDate: Date): Promise<RequestMetric[]>;
|
|
24
|
+
getLatencyStats(projectId: string, startDate: Date, endDate: Date): Promise<LatencyMetric[]>;
|
|
25
|
+
getBandwidthUsage(projectId: string, startDate: Date, endDate: Date): Promise<BandwidthMetric[]>;
|
|
26
|
+
getAssetDistribution(projectId: string, startDate: Date, endDate: Date): Promise<AssetDistribution[]>;
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,GAAG,EACH,aAAa,EACb,aAAa,EACb,eAAe,EACf,iBAAiB,EAClB,MAAM,UAAU,CAAC;AAElB,cAAc,SAAS,CAAC;AACxB,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAEnC,qBAAa,WAAW;IACtB,OAAO,CAAC,MAAM,CAAgB;gBAG5B,IAAI,EAAE,MAAM,EACZ,QAAQ,CAAC,EAAE,MAAM,EACjB,QAAQ,CAAC,EAAE,MAAM,EACjB,QAAQ,CAAC,EAAE,MAAM;IAKN,IAAI;IAIJ,KAAK;IAMlB,OAAO,CAAC,cAAc;IAIT,SAAS,CAAC,GAAG,EAAE,GAAG;IAQlB,UAAU,CAAC,IAAI,EAAE,GAAG,EAAE;IAQtB,mBAAmB,CAAC,MAAM,EAAE,aAAa;IAQzC,oBAAoB,CAAC,OAAO,EAAE,aAAa,EAAE;IAQ7C,mBAAmB,CAAC,MAAM,EAAE,aAAa;IAQzC,oBAAoB,CAAC,OAAO,EAAE,aAAa,EAAE;IAQ7C,qBAAqB,CAAC,MAAM,EAAE,eAAe;IAQ7C,sBAAsB,CAAC,OAAO,EAAE,eAAe,EAAE;IAQjD,uBAAuB,CAAC,OAAO,EAAE,iBAAiB,EAAE;IAQpD,cAAc,CAAC,GAAG,EAAE,QAAQ;IAI5B,gBAAgB,CAAC,IAAI,EAAE,QAAQ,EAAE;IAMjC,OAAO,CAClB,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,IAAI,EACf,OAAO,EAAE,IAAI,EACb,KAAK,GAAE,MAAY,GAClB,OAAO,CAAC,GAAG,EAAE,CAAC;IAkBJ,aAAa,CACxB,SAAS,EAAE,IAAI,EACf,OAAO,EAAE,IAAI,EACb,KAAK,GAAE,MAAY,GAClB,OAAO,CAAC,QAAQ,EAAE,CAAC;IAgBT,gBAAgB,CAC3B,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,IAAI,EACf,OAAO,EAAE,IAAI,GACZ,OAAO,CAAC,aAAa,EAAE,CAAC;IAwBd,eAAe,CAC1B,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,IAAI,EACf,OAAO,EAAE,IAAI,GACZ,OAAO,CAAC,aAAa,EAAE,CAAC;IAYd,iBAAiB,CAC5B,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,IAAI,EACf,OAAO,EAAE,IAAI,GACZ,OAAO,CAAC,eAAe,EAAE,CAAC;IAYhB,oBAAoB,CAC/B,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,IAAI,EACf,OAAO,EAAE,IAAI,GACZ,OAAO,CAAC,iBAAiB,EAAE,CAAC;CAWhC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
exports.NeptMetrics = void 0;
|
|
18
|
+
const clickhouse_1 = require("./clickhouse");
|
|
19
|
+
__exportStar(require("./types"), exports);
|
|
20
|
+
class NeptMetrics {
|
|
21
|
+
constructor(host, username, password, database) {
|
|
22
|
+
this.client = new clickhouse_1.MetricsClient(host, username, password, database);
|
|
23
|
+
}
|
|
24
|
+
async init() {
|
|
25
|
+
await this.client.initTables();
|
|
26
|
+
}
|
|
27
|
+
async clear() {
|
|
28
|
+
await this.client.clearTables();
|
|
29
|
+
}
|
|
30
|
+
// --- Ingestion ---
|
|
31
|
+
cleanTimestamp(timestamp) {
|
|
32
|
+
return timestamp.replace("Z", "");
|
|
33
|
+
}
|
|
34
|
+
async ingestLog(log) {
|
|
35
|
+
const clean = {
|
|
36
|
+
...log,
|
|
37
|
+
timestamp: this.cleanTimestamp(log.timestamp),
|
|
38
|
+
};
|
|
39
|
+
await this.client.insertMetrics("logs", [clean]);
|
|
40
|
+
}
|
|
41
|
+
async ingestLogs(logs) {
|
|
42
|
+
const clean = logs.map((l) => ({
|
|
43
|
+
...l,
|
|
44
|
+
timestamp: this.cleanTimestamp(l.timestamp),
|
|
45
|
+
}));
|
|
46
|
+
await this.client.insertMetrics("logs", clean);
|
|
47
|
+
}
|
|
48
|
+
async ingestRequestMetric(metric) {
|
|
49
|
+
const clean = {
|
|
50
|
+
...metric,
|
|
51
|
+
timestamp: this.cleanTimestamp(metric.timestamp),
|
|
52
|
+
};
|
|
53
|
+
await this.client.insertMetrics("request_metrics", [clean]);
|
|
54
|
+
}
|
|
55
|
+
async ingestRequestMetrics(metrics) {
|
|
56
|
+
const clean = metrics.map((m) => ({
|
|
57
|
+
...m,
|
|
58
|
+
timestamp: this.cleanTimestamp(m.timestamp),
|
|
59
|
+
}));
|
|
60
|
+
await this.client.insertMetrics("request_metrics", clean);
|
|
61
|
+
}
|
|
62
|
+
async ingestLatencyMetric(metric) {
|
|
63
|
+
const clean = {
|
|
64
|
+
...metric,
|
|
65
|
+
timestamp: this.cleanTimestamp(metric.timestamp),
|
|
66
|
+
};
|
|
67
|
+
await this.client.insertMetrics("latency_metrics", [clean]);
|
|
68
|
+
}
|
|
69
|
+
async ingestLatencyMetrics(metrics) {
|
|
70
|
+
const clean = metrics.map((m) => ({
|
|
71
|
+
...m,
|
|
72
|
+
timestamp: this.cleanTimestamp(m.timestamp),
|
|
73
|
+
}));
|
|
74
|
+
await this.client.insertMetrics("latency_metrics", clean);
|
|
75
|
+
}
|
|
76
|
+
async ingestBandwidthMetric(metric) {
|
|
77
|
+
const clean = {
|
|
78
|
+
...metric,
|
|
79
|
+
timestamp: this.cleanTimestamp(metric.timestamp),
|
|
80
|
+
};
|
|
81
|
+
await this.client.insertMetrics("bandwidth_metrics", [clean]);
|
|
82
|
+
}
|
|
83
|
+
async ingestBandwidthMetrics(metrics) {
|
|
84
|
+
const clean = metrics.map((m) => ({
|
|
85
|
+
...m,
|
|
86
|
+
timestamp: this.cleanTimestamp(m.timestamp),
|
|
87
|
+
}));
|
|
88
|
+
await this.client.insertMetrics("bandwidth_metrics", clean);
|
|
89
|
+
}
|
|
90
|
+
async ingestAssetDistribution(metrics) {
|
|
91
|
+
const clean = metrics.map((m) => ({
|
|
92
|
+
...m,
|
|
93
|
+
timestamp: this.cleanTimestamp(m.timestamp),
|
|
94
|
+
}));
|
|
95
|
+
await this.client.insertMetrics("asset_distribution", clean);
|
|
96
|
+
}
|
|
97
|
+
async ingestLogEntry(log) {
|
|
98
|
+
await this.client.insertLogs("log_entries", [log]);
|
|
99
|
+
}
|
|
100
|
+
async ingestLogEntries(logs) {
|
|
101
|
+
await this.client.insertLogs("log_entries", logs);
|
|
102
|
+
}
|
|
103
|
+
// --- Queries ---
|
|
104
|
+
async getLogs(projectId, startDate, endDate, limit = 100) {
|
|
105
|
+
const query = `
|
|
106
|
+
SELECT * FROM logs
|
|
107
|
+
WHERE projectId = {projectId:String}
|
|
108
|
+
AND timestamp >= {startDate:DateTime64(3)}
|
|
109
|
+
AND timestamp <= {endDate:DateTime64(3)}
|
|
110
|
+
ORDER BY timestamp DESC
|
|
111
|
+
LIMIT {limit:UInt32}
|
|
112
|
+
`;
|
|
113
|
+
const params = {
|
|
114
|
+
projectId,
|
|
115
|
+
startDate: this.cleanTimestamp(startDate.toISOString()),
|
|
116
|
+
endDate: this.cleanTimestamp(endDate.toISOString()),
|
|
117
|
+
limit,
|
|
118
|
+
};
|
|
119
|
+
return this.client.queryMetrics(query, params);
|
|
120
|
+
}
|
|
121
|
+
async getLogEntries(startDate, endDate, limit = 100) {
|
|
122
|
+
const query = `
|
|
123
|
+
SELECT * FROM log_entries
|
|
124
|
+
WHERE timestamp >= {startDate:UInt32}
|
|
125
|
+
AND timestamp <= {endDate:UInt32}
|
|
126
|
+
ORDER BY timestamp DESC
|
|
127
|
+
LIMIT {limit:UInt32}
|
|
128
|
+
`;
|
|
129
|
+
const params = {
|
|
130
|
+
startDate: Math.floor(startDate.getTime() / 1000),
|
|
131
|
+
endDate: Math.floor(endDate.getTime() / 1000),
|
|
132
|
+
limit,
|
|
133
|
+
};
|
|
134
|
+
return this.client.queryLogs(query, params);
|
|
135
|
+
}
|
|
136
|
+
async getRequestVolume(projectId, startDate, endDate) {
|
|
137
|
+
/*
|
|
138
|
+
const query = `
|
|
139
|
+
SELECT toStartOfHour(timestamp) as timestamp, count() as value
|
|
140
|
+
FROM logs
|
|
141
|
+
WHERE projectId = {projectId:String}
|
|
142
|
+
AND timestamp >= {startDate:DateTime64(3)}
|
|
143
|
+
AND timestamp <= {endDate:DateTime64(3)}
|
|
144
|
+
GROUP BY timestamp
|
|
145
|
+
ORDER BY timestamp ASC
|
|
146
|
+
`;
|
|
147
|
+
*/
|
|
148
|
+
const params = {
|
|
149
|
+
projectId,
|
|
150
|
+
startDate: this.cleanTimestamp(startDate.toISOString()),
|
|
151
|
+
endDate: this.cleanTimestamp(endDate.toISOString()),
|
|
152
|
+
};
|
|
153
|
+
// Let's assume we read from the dedicated request_metrics table for pre-aggregated stats
|
|
154
|
+
return this.client.queryMetrics(`SELECT * FROM request_metrics WHERE projectId = {projectId:String} AND timestamp >= {startDate:DateTime64(3)} AND timestamp <= {endDate:DateTime64(3)} ORDER BY timestamp ASC`, params);
|
|
155
|
+
}
|
|
156
|
+
async getLatencyStats(projectId, startDate, endDate) {
|
|
157
|
+
const params = {
|
|
158
|
+
projectId,
|
|
159
|
+
startDate: this.cleanTimestamp(startDate.toISOString()),
|
|
160
|
+
endDate: this.cleanTimestamp(endDate.toISOString()),
|
|
161
|
+
};
|
|
162
|
+
return this.client.queryMetrics(`SELECT * FROM latency_metrics WHERE projectId = {projectId:String} AND timestamp >= {startDate:DateTime64(3)} AND timestamp <= {endDate:DateTime64(3)} ORDER BY timestamp ASC`, params);
|
|
163
|
+
}
|
|
164
|
+
async getBandwidthUsage(projectId, startDate, endDate) {
|
|
165
|
+
const params = {
|
|
166
|
+
projectId,
|
|
167
|
+
startDate: this.cleanTimestamp(startDate.toISOString()),
|
|
168
|
+
endDate: this.cleanTimestamp(endDate.toISOString()),
|
|
169
|
+
};
|
|
170
|
+
return this.client.queryMetrics(`SELECT * FROM bandwidth_metrics WHERE projectId = {projectId:String} AND timestamp >= {startDate:DateTime64(3)} AND timestamp <= {endDate:DateTime64(3)} ORDER BY timestamp ASC`, params);
|
|
171
|
+
}
|
|
172
|
+
async getAssetDistribution(projectId, startDate, endDate) {
|
|
173
|
+
const params = {
|
|
174
|
+
projectId,
|
|
175
|
+
startDate: this.cleanTimestamp(startDate.toISOString()),
|
|
176
|
+
endDate: this.cleanTimestamp(endDate.toISOString()),
|
|
177
|
+
};
|
|
178
|
+
return this.client.queryMetrics(`SELECT * FROM asset_distribution WHERE projectId = {projectId:String} AND timestamp >= {startDate:DateTime64(3)} AND timestamp <= {endDate:DateTime64(3)} ORDER BY timestamp ASC`, params);
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
exports.NeptMetrics = NeptMetrics;
|
|
182
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
export interface Log {
|
|
2
|
+
id: string;
|
|
3
|
+
timestamp: string;
|
|
4
|
+
level: "info" | "warn" | "error" | "debug";
|
|
5
|
+
message: string;
|
|
6
|
+
source: string;
|
|
7
|
+
statusCode?: number;
|
|
8
|
+
latency?: number;
|
|
9
|
+
projectId: string;
|
|
10
|
+
}
|
|
11
|
+
export interface RequestMetric {
|
|
12
|
+
timestamp: string;
|
|
13
|
+
value: number;
|
|
14
|
+
projectId: string;
|
|
15
|
+
}
|
|
16
|
+
export interface LatencyMetric {
|
|
17
|
+
timestamp: string;
|
|
18
|
+
ms: number;
|
|
19
|
+
projectId: string;
|
|
20
|
+
}
|
|
21
|
+
export interface BandwidthMetric {
|
|
22
|
+
timestamp: string;
|
|
23
|
+
value: number;
|
|
24
|
+
projectId: string;
|
|
25
|
+
}
|
|
26
|
+
export interface AssetDistribution {
|
|
27
|
+
name: string;
|
|
28
|
+
value: number;
|
|
29
|
+
projectId: string;
|
|
30
|
+
timestamp: string;
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/models/index.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,GAAG;IAClB,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,OAAO,CAAC;IAC3C,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/models/index.ts"],"names":[],"mappings":""}
|
package/dist/test.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test.d.ts","sourceRoot":"","sources":["../src/test.ts"],"names":[],"mappings":""}
|
package/dist/test.js
ADDED
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const index_1 = require("./index");
|
|
4
|
+
const node_crypto_1 = require("node:crypto");
|
|
5
|
+
const dotenv_1 = require("dotenv");
|
|
6
|
+
(0, dotenv_1.config)();
|
|
7
|
+
async function runTest() {
|
|
8
|
+
console.log("Starting NeptMetrics Test...");
|
|
9
|
+
const metrics = new index_1.NeptMetrics(process.env.CLICKHOUSE_HOST || "http://localhost:8123", process.env.CLICKHOUSE_USER || "default", process.env.CLICKHOUSE_PASSWORD || "", process.env.CLICKHOUSE_DB || "default");
|
|
10
|
+
console.log("Initializing tables...");
|
|
11
|
+
await metrics.clear();
|
|
12
|
+
await metrics.init();
|
|
13
|
+
console.log("Tables initialized.");
|
|
14
|
+
const now = new Date();
|
|
15
|
+
const projectId = (0, node_crypto_1.randomUUID)();
|
|
16
|
+
const oneHourAgo = new Date(now.getTime() - 60 * 60 * 1000);
|
|
17
|
+
// --- Ingestion Tests ---
|
|
18
|
+
console.log("Ingesting Log...");
|
|
19
|
+
await metrics.ingestLog({
|
|
20
|
+
id: (0, node_crypto_1.randomUUID)(),
|
|
21
|
+
timestamp: now.toISOString(),
|
|
22
|
+
level: "info",
|
|
23
|
+
message: "Test log message",
|
|
24
|
+
source: "test-script",
|
|
25
|
+
projectId: projectId,
|
|
26
|
+
statusCode: 200,
|
|
27
|
+
latency: 50,
|
|
28
|
+
});
|
|
29
|
+
console.log("Ingesting Request Metric...");
|
|
30
|
+
await metrics.ingestRequestMetric({
|
|
31
|
+
timestamp: now.toISOString(),
|
|
32
|
+
value: 1,
|
|
33
|
+
projectId: projectId,
|
|
34
|
+
});
|
|
35
|
+
console.log("Ingesting Latency Metric...");
|
|
36
|
+
await metrics.ingestLatencyMetric({
|
|
37
|
+
timestamp: now.toISOString(),
|
|
38
|
+
ms: 120,
|
|
39
|
+
projectId: projectId,
|
|
40
|
+
});
|
|
41
|
+
console.log("Ingesting Bandwidth Metric...");
|
|
42
|
+
await metrics.ingestBandwidthMetric({
|
|
43
|
+
timestamp: now.toISOString(),
|
|
44
|
+
value: 1024 * 1024, // 1MB
|
|
45
|
+
projectId: projectId,
|
|
46
|
+
});
|
|
47
|
+
console.log("Ingesting Asset Distribution...");
|
|
48
|
+
await metrics.ingestAssetDistribution([
|
|
49
|
+
{
|
|
50
|
+
name: "image.png",
|
|
51
|
+
value: 500,
|
|
52
|
+
projectId: projectId,
|
|
53
|
+
timestamp: now.toISOString(),
|
|
54
|
+
},
|
|
55
|
+
]);
|
|
56
|
+
console.log("Ingesting Bulk Request Metrics...");
|
|
57
|
+
await metrics.ingestRequestMetrics([
|
|
58
|
+
{
|
|
59
|
+
timestamp: now.toISOString(),
|
|
60
|
+
value: 2,
|
|
61
|
+
projectId: projectId,
|
|
62
|
+
},
|
|
63
|
+
{
|
|
64
|
+
timestamp: now.toISOString(),
|
|
65
|
+
value: 3,
|
|
66
|
+
projectId: projectId,
|
|
67
|
+
},
|
|
68
|
+
]);
|
|
69
|
+
console.log("Ingesting Bulk Latency Metrics...");
|
|
70
|
+
await metrics.ingestLatencyMetrics([
|
|
71
|
+
{
|
|
72
|
+
timestamp: now.toISOString(),
|
|
73
|
+
ms: 150,
|
|
74
|
+
projectId: projectId,
|
|
75
|
+
},
|
|
76
|
+
{
|
|
77
|
+
timestamp: now.toISOString(),
|
|
78
|
+
ms: 200,
|
|
79
|
+
projectId: projectId,
|
|
80
|
+
},
|
|
81
|
+
]);
|
|
82
|
+
console.log("Ingesting Bulk Bandwidth Metrics...");
|
|
83
|
+
await metrics.ingestBandwidthMetrics([
|
|
84
|
+
{
|
|
85
|
+
timestamp: now.toISOString(),
|
|
86
|
+
value: 2048 * 1024, // 2MB
|
|
87
|
+
projectId: projectId,
|
|
88
|
+
},
|
|
89
|
+
{
|
|
90
|
+
timestamp: now.toISOString(),
|
|
91
|
+
value: 512 * 1024, // 0.5MB
|
|
92
|
+
projectId: projectId,
|
|
93
|
+
},
|
|
94
|
+
]);
|
|
95
|
+
console.log("Ingesting LogEntry...");
|
|
96
|
+
await metrics.ingestLogEntry({
|
|
97
|
+
timestamp: Math.floor(now.getTime() / 1000),
|
|
98
|
+
level: "info",
|
|
99
|
+
message: "Test LogEntry message",
|
|
100
|
+
status: "completed",
|
|
101
|
+
});
|
|
102
|
+
// --- Query Tests ---
|
|
103
|
+
console.log("Waiting for data ingestion (1s)...");
|
|
104
|
+
await new Promise((resolve) => setTimeout(resolve, 1000));
|
|
105
|
+
console.log("Querying Logs...");
|
|
106
|
+
const logs = await metrics.getLogs(projectId, oneHourAgo, new Date());
|
|
107
|
+
console.log(`Found ${logs.length} logs.`);
|
|
108
|
+
console.log("Querying Request Volume...");
|
|
109
|
+
const requests = await metrics.getRequestVolume(projectId, oneHourAgo, new Date());
|
|
110
|
+
console.log(`Found ${requests.length} request metrics.`);
|
|
111
|
+
console.log("Querying Latency Stats...");
|
|
112
|
+
const latency = await metrics.getLatencyStats(projectId, oneHourAgo, new Date());
|
|
113
|
+
console.log(`Found ${latency.length} latency metrics.`);
|
|
114
|
+
console.log("Querying Bandwidth Usage...");
|
|
115
|
+
const bandwidth = await metrics.getBandwidthUsage(projectId, oneHourAgo, new Date());
|
|
116
|
+
console.log(`Found ${bandwidth.length} bandwidth metrics.`);
|
|
117
|
+
console.log("Querying Asset Distribution...");
|
|
118
|
+
const assets = await metrics.getAssetDistribution(projectId, oneHourAgo, new Date());
|
|
119
|
+
console.log(`Found ${assets.length} asset distribution metrics.`);
|
|
120
|
+
console.log("Querying LogEntries...");
|
|
121
|
+
const logEntries = await metrics.getLogEntries(oneHourAgo, new Date());
|
|
122
|
+
console.log(`Found ${logEntries.length} log entries.`);
|
|
123
|
+
console.log("Test Complete.");
|
|
124
|
+
}
|
|
125
|
+
runTest().catch((err) => {
|
|
126
|
+
console.error("Test Failed:", err);
|
|
127
|
+
process.exit(1);
|
|
128
|
+
});
|
|
129
|
+
//# sourceMappingURL=test.js.map
|
package/dist/test.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test.js","sourceRoot":"","sources":["../src/test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export type LogLevel = "info" | "error" | "warning" | "debug" | "run";
|
|
2
|
+
export interface LogEntry {
|
|
3
|
+
/** Unix timestamp in seconds */
|
|
4
|
+
timestamp?: number;
|
|
5
|
+
level: LogLevel;
|
|
6
|
+
message: string;
|
|
7
|
+
status?: "completed" | "in-progress" | "failed";
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,QAAQ,GAAG,MAAM,GAAG,OAAO,GAAG,SAAS,GAAG,OAAO,GAAG,KAAK,CAAC;AAEtE,MAAM,WAAW,QAAQ;IACvB,gCAAgC;IAChC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,QAAQ,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,WAAW,GAAG,aAAa,GAAG,QAAQ,CAAC;CACjD"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":""}
|
package/package.json
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "nept-metrics-core",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "Core metrics client for NEPT services backed by ClickHouse",
|
|
5
|
+
"main": "dist/index.js",
|
|
6
|
+
"types": "dist/index.d.ts",
|
|
7
|
+
"files": [
|
|
8
|
+
"dist"
|
|
9
|
+
],
|
|
10
|
+
"scripts": {
|
|
11
|
+
"build": "tsc",
|
|
12
|
+
"prepublishOnly": "npm run build"
|
|
13
|
+
},
|
|
14
|
+
"keywords": [
|
|
15
|
+
"nept",
|
|
16
|
+
"metrics",
|
|
17
|
+
"clickhouse"
|
|
18
|
+
],
|
|
19
|
+
"author": "",
|
|
20
|
+
"license": "ISC",
|
|
21
|
+
"devDependencies": {
|
|
22
|
+
"@clickhouse/client": "^1.17.0",
|
|
23
|
+
"@types/node": "^25.2.3",
|
|
24
|
+
"dotenv": "^17.3.1",
|
|
25
|
+
"tsup": "^8.5.1",
|
|
26
|
+
"typescript": "^5.9.3"
|
|
27
|
+
}
|
|
28
|
+
}
|