@ctrl/sabnzbd 0.0.1
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/LICENSE +21 -0
- package/README.md +207 -0
- package/dist/src/index.d.ts +4 -0
- package/dist/src/index.js +4 -0
- package/dist/src/normalizeUsenetData.d.ts +7 -0
- package/dist/src/normalizeUsenetData.js +231 -0
- package/dist/src/sabnzbd.d.ts +328 -0
- package/dist/src/sabnzbd.js +774 -0
- package/dist/src/types.d.ts +444 -0
- package/dist/src/types.js +1 -0
- package/package.json +61 -0
|
@@ -0,0 +1,444 @@
|
|
|
1
|
+
import type { LiteralUnion } from 'type-fest';
|
|
2
|
+
export type SabStatus = 'Grabbing' | 'Queued' | 'Paused' | 'Checking' | 'Downloading' | 'QuickCheck' | 'Verifying' | 'Repairing' | 'Fetching' | 'Extracting' | 'Moving' | 'Running' | 'Completed' | 'Failed' | 'Deleted' | 'Propagating';
|
|
3
|
+
/**
|
|
4
|
+
* Raw SABnzbd job status value from queue/history payloads.
|
|
5
|
+
*
|
|
6
|
+
* Use the documented `SabStatus` union when you want exhaustiveness over known
|
|
7
|
+
* values. Raw payload fields remain open to unknown statuses so newer SABnzbd
|
|
8
|
+
* releases do not become type-incompatible.
|
|
9
|
+
*/
|
|
10
|
+
export type SabRawStatus = LiteralUnion<SabStatus, string>;
|
|
11
|
+
/**
|
|
12
|
+
* Documented queue status filter values accepted by `mode=queue`.
|
|
13
|
+
*/
|
|
14
|
+
export type SabQueueStatusFilter = 'Checking' | 'Downloading' | 'Fetching' | 'Grabbing' | 'Paused' | 'Propagating' | 'Queued';
|
|
15
|
+
/**
|
|
16
|
+
* Documented history status filter values accepted by `mode=history`.
|
|
17
|
+
*/
|
|
18
|
+
export type SabHistoryStatusFilter = 'Completed' | 'Extracting' | 'Failed' | 'Fetching' | 'Moving' | 'Queued' | 'QuickCheck' | 'Repairing' | 'Running' | 'Verifying';
|
|
19
|
+
/**
|
|
20
|
+
* Documented SABnzbd numeric priority values.
|
|
21
|
+
*/
|
|
22
|
+
export type SabPriorityValue = -100 | -4 | -3 | -2 | -1 | 0 | 1 | 2;
|
|
23
|
+
/**
|
|
24
|
+
* Raw SABnzbd priority value from payloads, which may be numeric or stringified.
|
|
25
|
+
*/
|
|
26
|
+
export type SabRawPriorityValue = SabPriorityValue | `${SabPriorityValue}`;
|
|
27
|
+
/**
|
|
28
|
+
* Documented SABnzbd queue post-processing values.
|
|
29
|
+
*/
|
|
30
|
+
export type SabPostProcessValue = -1 | 0 | 1 | 2 | 3;
|
|
31
|
+
/**
|
|
32
|
+
* Raw SABnzbd queue post-processing value from payloads.
|
|
33
|
+
*/
|
|
34
|
+
export type SabRawPostProcessValue = SabPostProcessValue | `${SabPostProcessValue}`;
|
|
35
|
+
/**
|
|
36
|
+
* Documented SABnzbd history post-processing status codes.
|
|
37
|
+
*/
|
|
38
|
+
export type SabHistoryPostProcessValue = 'R' | 'U' | 'D';
|
|
39
|
+
/**
|
|
40
|
+
* File status values documented by SABnzbd.
|
|
41
|
+
*/
|
|
42
|
+
export type SabFileStatus = LiteralUnion<'finished' | 'active' | 'queued', string>;
|
|
43
|
+
export interface SabBooleanResponse {
|
|
44
|
+
/**
|
|
45
|
+
* True/False status returned by command-style endpoints.
|
|
46
|
+
*
|
|
47
|
+
* SAB docs note some endpoints may still return `true` even when the operation failed.
|
|
48
|
+
*/
|
|
49
|
+
status: boolean;
|
|
50
|
+
/**
|
|
51
|
+
* Optional list of affected queue ids (`nzo_id` values), when provided by SAB.
|
|
52
|
+
*/
|
|
53
|
+
nzo_ids?: string[];
|
|
54
|
+
error?: string;
|
|
55
|
+
}
|
|
56
|
+
export interface SabAuthResponse {
|
|
57
|
+
/**
|
|
58
|
+
* Authentication mode information returned by `mode=auth`.
|
|
59
|
+
*/
|
|
60
|
+
auth: string;
|
|
61
|
+
}
|
|
62
|
+
export interface SabVersionResponse {
|
|
63
|
+
/**
|
|
64
|
+
* SABnzbd version string returned by `mode=version`.
|
|
65
|
+
*/
|
|
66
|
+
version: string;
|
|
67
|
+
}
|
|
68
|
+
export type SabWarningType = LiteralUnion<'WARNING' | 'ERROR', string>;
|
|
69
|
+
export interface SabWarning {
|
|
70
|
+
text: string;
|
|
71
|
+
type: SabWarningType;
|
|
72
|
+
time: number;
|
|
73
|
+
}
|
|
74
|
+
export interface SabWarningsResponse {
|
|
75
|
+
warnings: SabWarning[];
|
|
76
|
+
}
|
|
77
|
+
export interface SabCategoriesResponse {
|
|
78
|
+
/**
|
|
79
|
+
* Configured category names returned by `mode=get_cats`.
|
|
80
|
+
*/
|
|
81
|
+
categories: string[];
|
|
82
|
+
}
|
|
83
|
+
export interface SabScriptsResponse {
|
|
84
|
+
/**
|
|
85
|
+
* Configured script names returned by `mode=get_scripts`.
|
|
86
|
+
*/
|
|
87
|
+
scripts: string[];
|
|
88
|
+
}
|
|
89
|
+
export interface SabAddResponse {
|
|
90
|
+
/**
|
|
91
|
+
* True/False status for add operations (`mode=addurl` / `mode=addfile`).
|
|
92
|
+
*/
|
|
93
|
+
status: boolean;
|
|
94
|
+
/**
|
|
95
|
+
* Added queue ids (`nzo_id` values). SAB docs describe this as the add result payload.
|
|
96
|
+
*/
|
|
97
|
+
nzo_ids: string[];
|
|
98
|
+
error?: string;
|
|
99
|
+
}
|
|
100
|
+
export interface SabSwitchResponse {
|
|
101
|
+
result?: {
|
|
102
|
+
/**
|
|
103
|
+
* Job priority after move/switch.
|
|
104
|
+
*/
|
|
105
|
+
priority: number;
|
|
106
|
+
/**
|
|
107
|
+
* Job position after move/switch.
|
|
108
|
+
*/
|
|
109
|
+
position: number;
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
export interface SabPositionResponse {
|
|
113
|
+
/**
|
|
114
|
+
* Queue position returned by priority updates, when provided by SAB.
|
|
115
|
+
*/
|
|
116
|
+
position?: number;
|
|
117
|
+
}
|
|
118
|
+
export interface SabStatusConnection {
|
|
119
|
+
thrdnum: number;
|
|
120
|
+
nzo_name?: string;
|
|
121
|
+
nzf_name?: string;
|
|
122
|
+
art_name?: string;
|
|
123
|
+
}
|
|
124
|
+
export interface SabStatusServer {
|
|
125
|
+
servername: string;
|
|
126
|
+
servertotalconn: number;
|
|
127
|
+
serverssl: number;
|
|
128
|
+
serveractiveconn: number;
|
|
129
|
+
serveroptional: number;
|
|
130
|
+
serveractive: boolean;
|
|
131
|
+
servererror: string;
|
|
132
|
+
serverpriority: number;
|
|
133
|
+
serverbps: string;
|
|
134
|
+
serverconnections: SabStatusConnection[];
|
|
135
|
+
}
|
|
136
|
+
export interface SabQueueSlot {
|
|
137
|
+
status: SabRawStatus;
|
|
138
|
+
index: number;
|
|
139
|
+
timeleft: string;
|
|
140
|
+
/**
|
|
141
|
+
* Total size in MB.
|
|
142
|
+
*/
|
|
143
|
+
mb: string | number;
|
|
144
|
+
filename: string;
|
|
145
|
+
priority: SabRawPriorityValue;
|
|
146
|
+
cat: string;
|
|
147
|
+
/**
|
|
148
|
+
* Remaining size in MB.
|
|
149
|
+
*/
|
|
150
|
+
mbleft: string | number;
|
|
151
|
+
percentage: string | number;
|
|
152
|
+
nzo_id: string;
|
|
153
|
+
/**
|
|
154
|
+
* Optional UNIX timestamp when the job was added.
|
|
155
|
+
*/
|
|
156
|
+
time_added?: number | string;
|
|
157
|
+
script?: string;
|
|
158
|
+
/**
|
|
159
|
+
* Optional labels such as duplicate or propagation indicators.
|
|
160
|
+
*/
|
|
161
|
+
labels?: string[];
|
|
162
|
+
/**
|
|
163
|
+
* Post-processing setting for the job.
|
|
164
|
+
*/
|
|
165
|
+
pp?: SabRawPostProcessValue;
|
|
166
|
+
/**
|
|
167
|
+
* Post-processing options value.
|
|
168
|
+
*/
|
|
169
|
+
unpackopts?: string;
|
|
170
|
+
}
|
|
171
|
+
export interface SabQueue {
|
|
172
|
+
status: SabRawStatus;
|
|
173
|
+
paused: boolean;
|
|
174
|
+
timeleft: string;
|
|
175
|
+
/**
|
|
176
|
+
* Current speed display value.
|
|
177
|
+
*/
|
|
178
|
+
speed?: string;
|
|
179
|
+
kbpersec?: string | number;
|
|
180
|
+
mb?: string | number;
|
|
181
|
+
mbleft?: string | number;
|
|
182
|
+
/**
|
|
183
|
+
* Number of jobs in the current response.
|
|
184
|
+
*/
|
|
185
|
+
noofslots?: string | number;
|
|
186
|
+
/**
|
|
187
|
+
* Total number of queue jobs.
|
|
188
|
+
*/
|
|
189
|
+
noofslots_total?: string | number;
|
|
190
|
+
/**
|
|
191
|
+
* Start index used for paged queue responses.
|
|
192
|
+
*/
|
|
193
|
+
start?: string | number;
|
|
194
|
+
/**
|
|
195
|
+
* Limit used for paged queue responses.
|
|
196
|
+
*/
|
|
197
|
+
limit?: string | number;
|
|
198
|
+
/**
|
|
199
|
+
* Speed limit percentage configured by SAB.
|
|
200
|
+
*/
|
|
201
|
+
speedlimit?: string | number;
|
|
202
|
+
/**
|
|
203
|
+
* Absolute speed limit in bytes per second.
|
|
204
|
+
*/
|
|
205
|
+
speedlimit_abs?: string | number;
|
|
206
|
+
slots: SabQueueSlot[];
|
|
207
|
+
[key: string]: unknown;
|
|
208
|
+
}
|
|
209
|
+
export interface SabHistorySlot {
|
|
210
|
+
fail_message?: string;
|
|
211
|
+
bytes: string | number;
|
|
212
|
+
category?: string;
|
|
213
|
+
nzb_name?: string;
|
|
214
|
+
download_time?: string | number;
|
|
215
|
+
storage?: string;
|
|
216
|
+
completed?: string | number;
|
|
217
|
+
/**
|
|
218
|
+
* UNIX timestamp when the job was added.
|
|
219
|
+
*/
|
|
220
|
+
time_added?: string | number;
|
|
221
|
+
/**
|
|
222
|
+
* Duplicate matching key generated by SAB.
|
|
223
|
+
*/
|
|
224
|
+
duplicate_key?: string;
|
|
225
|
+
script?: string;
|
|
226
|
+
/**
|
|
227
|
+
* History post-processing status code (`R`, `U`, `D`).
|
|
228
|
+
*/
|
|
229
|
+
pp?: SabHistoryPostProcessValue;
|
|
230
|
+
/**
|
|
231
|
+
* Temporary destination path.
|
|
232
|
+
*/
|
|
233
|
+
path?: string;
|
|
234
|
+
status: SabRawStatus;
|
|
235
|
+
nzo_id: string;
|
|
236
|
+
name: string;
|
|
237
|
+
[key: string]: unknown;
|
|
238
|
+
}
|
|
239
|
+
export interface SabHistory {
|
|
240
|
+
/**
|
|
241
|
+
* Bytes downloaded in the current day.
|
|
242
|
+
*/
|
|
243
|
+
day?: string | number;
|
|
244
|
+
/**
|
|
245
|
+
* Bytes downloaded in the current week.
|
|
246
|
+
*/
|
|
247
|
+
week?: string | number;
|
|
248
|
+
/**
|
|
249
|
+
* Bytes downloaded in the current month.
|
|
250
|
+
*/
|
|
251
|
+
month?: string | number;
|
|
252
|
+
/**
|
|
253
|
+
* Total bytes downloaded.
|
|
254
|
+
*/
|
|
255
|
+
total?: string | number;
|
|
256
|
+
slots: SabHistorySlot[];
|
|
257
|
+
[key: string]: unknown;
|
|
258
|
+
}
|
|
259
|
+
export interface SabFullStatus {
|
|
260
|
+
localipv4?: string;
|
|
261
|
+
ipv6?: string | null;
|
|
262
|
+
publicipv4?: string | null;
|
|
263
|
+
dnslookup?: string;
|
|
264
|
+
folders?: string[];
|
|
265
|
+
cpumodel?: string;
|
|
266
|
+
pystone?: number;
|
|
267
|
+
loadavg?: string;
|
|
268
|
+
downloaddir?: string;
|
|
269
|
+
downloaddirspeed?: number;
|
|
270
|
+
completedir?: string;
|
|
271
|
+
completedirspeed?: number;
|
|
272
|
+
loglevel?: string;
|
|
273
|
+
logfile?: string;
|
|
274
|
+
configfn?: string;
|
|
275
|
+
nt?: boolean;
|
|
276
|
+
darwin?: boolean;
|
|
277
|
+
confighelpuri?: string;
|
|
278
|
+
uptime?: string;
|
|
279
|
+
color_scheme?: string;
|
|
280
|
+
webdir?: string;
|
|
281
|
+
active_lang?: string;
|
|
282
|
+
restart_req?: boolean;
|
|
283
|
+
power_options?: boolean;
|
|
284
|
+
pp_pause_event?: boolean;
|
|
285
|
+
pid?: number;
|
|
286
|
+
weblogfile?: string | null;
|
|
287
|
+
new_release?: boolean;
|
|
288
|
+
new_rel_url?: string | null;
|
|
289
|
+
have_warnings?: boolean | number | string;
|
|
290
|
+
warnings?: SabWarning[];
|
|
291
|
+
servers?: SabStatusServer[];
|
|
292
|
+
[key: string]: unknown;
|
|
293
|
+
}
|
|
294
|
+
export interface SabFile {
|
|
295
|
+
nzf_id: string;
|
|
296
|
+
filename: string;
|
|
297
|
+
/**
|
|
298
|
+
* File state in a job (`finished`, `active`, `queued`).
|
|
299
|
+
*/
|
|
300
|
+
status?: SabFileStatus;
|
|
301
|
+
/**
|
|
302
|
+
* File age display string.
|
|
303
|
+
*/
|
|
304
|
+
age?: string;
|
|
305
|
+
/**
|
|
306
|
+
* Par2 set id when applicable.
|
|
307
|
+
*/
|
|
308
|
+
set?: string;
|
|
309
|
+
mbleft?: string | number;
|
|
310
|
+
mb?: string | number;
|
|
311
|
+
bytes?: string | number;
|
|
312
|
+
[key: string]: unknown;
|
|
313
|
+
}
|
|
314
|
+
export interface SabFilesResponse {
|
|
315
|
+
files: SabFile[];
|
|
316
|
+
}
|
|
317
|
+
export interface SabServerStatsServer {
|
|
318
|
+
/**
|
|
319
|
+
* Bytes downloaded in the current day.
|
|
320
|
+
*/
|
|
321
|
+
day: number;
|
|
322
|
+
/**
|
|
323
|
+
* Bytes downloaded in the current week.
|
|
324
|
+
*/
|
|
325
|
+
week: number;
|
|
326
|
+
/**
|
|
327
|
+
* Bytes downloaded in the current month.
|
|
328
|
+
*/
|
|
329
|
+
month: number;
|
|
330
|
+
/**
|
|
331
|
+
* Total bytes downloaded.
|
|
332
|
+
*/
|
|
333
|
+
total: number;
|
|
334
|
+
/**
|
|
335
|
+
* Per-day byte totals keyed by `YYYY-MM-DD`.
|
|
336
|
+
*/
|
|
337
|
+
daily: Record<string, number>;
|
|
338
|
+
/**
|
|
339
|
+
* Number of articles requested from this server.
|
|
340
|
+
*/
|
|
341
|
+
articles_tried: number;
|
|
342
|
+
/**
|
|
343
|
+
* Number of successful article downloads from this server.
|
|
344
|
+
*/
|
|
345
|
+
articles_success: number;
|
|
346
|
+
}
|
|
347
|
+
export interface SabServerStats {
|
|
348
|
+
/**
|
|
349
|
+
* Bytes downloaded in the current day.
|
|
350
|
+
*/
|
|
351
|
+
day: number;
|
|
352
|
+
/**
|
|
353
|
+
* Bytes downloaded in the current week.
|
|
354
|
+
*/
|
|
355
|
+
week: number;
|
|
356
|
+
/**
|
|
357
|
+
* Bytes downloaded in the current month.
|
|
358
|
+
*/
|
|
359
|
+
month: number;
|
|
360
|
+
/**
|
|
361
|
+
* Total bytes downloaded.
|
|
362
|
+
*/
|
|
363
|
+
total: number;
|
|
364
|
+
/**
|
|
365
|
+
* Per-server transfer stats keyed by server name.
|
|
366
|
+
*/
|
|
367
|
+
servers: Record<string, SabServerStatsServer>;
|
|
368
|
+
}
|
|
369
|
+
export interface SabQueueQuery {
|
|
370
|
+
/**
|
|
371
|
+
* Index of the first queue job to return.
|
|
372
|
+
*/
|
|
373
|
+
start?: number;
|
|
374
|
+
/**
|
|
375
|
+
* Number of queue jobs to return.
|
|
376
|
+
*/
|
|
377
|
+
limit?: number;
|
|
378
|
+
/**
|
|
379
|
+
* Queue name filter.
|
|
380
|
+
*/
|
|
381
|
+
search?: string;
|
|
382
|
+
/**
|
|
383
|
+
* Category filter (`cat`/`category`).
|
|
384
|
+
*/
|
|
385
|
+
category?: string | string[];
|
|
386
|
+
/**
|
|
387
|
+
* Priority filter.
|
|
388
|
+
*/
|
|
389
|
+
priority?: SabPriorityValue | SabPriorityValue[];
|
|
390
|
+
/**
|
|
391
|
+
* Queue status filter.
|
|
392
|
+
*/
|
|
393
|
+
status?: SabQueueStatusFilter | SabQueueStatusFilter[];
|
|
394
|
+
/**
|
|
395
|
+
* Filter by one or more queue ids (`nzo_ids`).
|
|
396
|
+
*/
|
|
397
|
+
nzoIds?: string | string[];
|
|
398
|
+
}
|
|
399
|
+
export interface SabHistoryQuery {
|
|
400
|
+
/**
|
|
401
|
+
* Index of the first history item to return.
|
|
402
|
+
*/
|
|
403
|
+
start?: number;
|
|
404
|
+
/**
|
|
405
|
+
* Number of history items to return.
|
|
406
|
+
*/
|
|
407
|
+
limit?: number;
|
|
408
|
+
/**
|
|
409
|
+
* History name filter.
|
|
410
|
+
*/
|
|
411
|
+
search?: string;
|
|
412
|
+
/**
|
|
413
|
+
* Category filter (`cat`/`category`).
|
|
414
|
+
*/
|
|
415
|
+
category?: string | string[];
|
|
416
|
+
/**
|
|
417
|
+
* History status filter.
|
|
418
|
+
*/
|
|
419
|
+
status?: SabHistoryStatusFilter | SabHistoryStatusFilter[];
|
|
420
|
+
/**
|
|
421
|
+
* Filter by one or more ids (`nzo_ids`).
|
|
422
|
+
*/
|
|
423
|
+
nzoIds?: string | string[];
|
|
424
|
+
/**
|
|
425
|
+
* Only include failed items.
|
|
426
|
+
*/
|
|
427
|
+
failedOnly?: boolean;
|
|
428
|
+
/**
|
|
429
|
+
* Select archived history output.
|
|
430
|
+
*/
|
|
431
|
+
archived?: boolean;
|
|
432
|
+
/**
|
|
433
|
+
* Return full output only when history changed since this value.
|
|
434
|
+
*/
|
|
435
|
+
lastHistoryUpdate?: number | string;
|
|
436
|
+
}
|
|
437
|
+
export interface SabAddOptions {
|
|
438
|
+
category?: string;
|
|
439
|
+
script?: string;
|
|
440
|
+
priority?: SabPriorityValue;
|
|
441
|
+
postProcess?: SabPostProcessValue;
|
|
442
|
+
name?: string;
|
|
443
|
+
password?: string;
|
|
444
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
package/package.json
ADDED
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@ctrl/sabnzbd",
|
|
3
|
+
"version": "0.0.1",
|
|
4
|
+
"description": "TypeScript api wrapper for SABnzbd using ofetch",
|
|
5
|
+
"keywords": [
|
|
6
|
+
"sabnzbd",
|
|
7
|
+
"typescript"
|
|
8
|
+
],
|
|
9
|
+
"homepage": "https://sabnzbd.ep.workers.dev",
|
|
10
|
+
"license": "MIT",
|
|
11
|
+
"author": "Scott Cooper <scttcper@gmail.com>",
|
|
12
|
+
"repository": {
|
|
13
|
+
"type": "git",
|
|
14
|
+
"url": "git+https://github.com/scttcper/sabnzbd.git"
|
|
15
|
+
},
|
|
16
|
+
"files": [
|
|
17
|
+
"dist/src"
|
|
18
|
+
],
|
|
19
|
+
"type": "module",
|
|
20
|
+
"sideEffects": false,
|
|
21
|
+
"main": "./dist/src/index.js",
|
|
22
|
+
"types": "./dist/src/index.d.ts",
|
|
23
|
+
"publishConfig": {
|
|
24
|
+
"access": "public"
|
|
25
|
+
},
|
|
26
|
+
"scripts": {
|
|
27
|
+
"lint": "oxfmt --check && oxlint .",
|
|
28
|
+
"lint:fix": "oxfmt && oxlint . --fix",
|
|
29
|
+
"prepare": "npm run build",
|
|
30
|
+
"build": "tsc",
|
|
31
|
+
"build:docs": "typedoc",
|
|
32
|
+
"test": "vitest run",
|
|
33
|
+
"test:watch": "vitest"
|
|
34
|
+
},
|
|
35
|
+
"dependencies": {
|
|
36
|
+
"@ctrl/shared-usenet": "^0.0.1",
|
|
37
|
+
"node-fetch-native": "^1.6.7",
|
|
38
|
+
"ofetch": "^1.5.1",
|
|
39
|
+
"type-fest": "^5.5.0",
|
|
40
|
+
"ufo": "^1.6.3"
|
|
41
|
+
},
|
|
42
|
+
"devDependencies": {
|
|
43
|
+
"@ctrl/oxlint-config": "1.4.2",
|
|
44
|
+
"@sindresorhus/tsconfig": "8.1.0",
|
|
45
|
+
"@types/node": "25.5.0",
|
|
46
|
+
"oxfmt": "0.42.0",
|
|
47
|
+
"oxlint": "1.57.0",
|
|
48
|
+
"typedoc": "0.28.18",
|
|
49
|
+
"typescript": "6.0.2",
|
|
50
|
+
"vitest": "4.1.2"
|
|
51
|
+
},
|
|
52
|
+
"release": {
|
|
53
|
+
"branches": [
|
|
54
|
+
"main"
|
|
55
|
+
]
|
|
56
|
+
},
|
|
57
|
+
"engines": {
|
|
58
|
+
"node": ">=18"
|
|
59
|
+
},
|
|
60
|
+
"packageManager": "pnpm@10.33.0"
|
|
61
|
+
}
|