ytgrab 0.1.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.
Files changed (64) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +142 -0
  3. package/bin/ytgrab.js +194 -0
  4. package/dist/downloader/common.d.ts +22 -0
  5. package/dist/downloader/common.d.ts.map +1 -0
  6. package/dist/downloader/common.js +125 -0
  7. package/dist/downloader/common.js.map +1 -0
  8. package/dist/downloader/hls.d.ts +11 -0
  9. package/dist/downloader/hls.d.ts.map +1 -0
  10. package/dist/downloader/hls.js +134 -0
  11. package/dist/downloader/hls.js.map +1 -0
  12. package/dist/downloader/http.d.ts +10 -0
  13. package/dist/downloader/http.d.ts.map +1 -0
  14. package/dist/downloader/http.js +132 -0
  15. package/dist/downloader/http.js.map +1 -0
  16. package/dist/downloader/index.d.ts +10 -0
  17. package/dist/downloader/index.d.ts.map +1 -0
  18. package/dist/downloader/index.js +24 -0
  19. package/dist/downloader/index.js.map +1 -0
  20. package/dist/extractor/common.d.ts +48 -0
  21. package/dist/extractor/common.d.ts.map +1 -0
  22. package/dist/extractor/common.js +324 -0
  23. package/dist/extractor/common.js.map +1 -0
  24. package/dist/extractor/nsig.d.ts +17 -0
  25. package/dist/extractor/nsig.d.ts.map +1 -0
  26. package/dist/extractor/nsig.js +200 -0
  27. package/dist/extractor/nsig.js.map +1 -0
  28. package/dist/extractor/youtube.d.ts +51 -0
  29. package/dist/extractor/youtube.d.ts.map +1 -0
  30. package/dist/extractor/youtube.js +1113 -0
  31. package/dist/extractor/youtube.js.map +1 -0
  32. package/dist/index.d.ts +36 -0
  33. package/dist/index.d.ts.map +1 -0
  34. package/dist/index.js +72 -0
  35. package/dist/index.js.map +1 -0
  36. package/dist/networking/index.d.ts +33 -0
  37. package/dist/networking/index.d.ts.map +1 -0
  38. package/dist/networking/index.js +171 -0
  39. package/dist/networking/index.js.map +1 -0
  40. package/dist/postprocessor/common.d.ts +21 -0
  41. package/dist/postprocessor/common.d.ts.map +1 -0
  42. package/dist/postprocessor/common.js +42 -0
  43. package/dist/postprocessor/common.js.map +1 -0
  44. package/dist/postprocessor/ffmpeg.d.ts +44 -0
  45. package/dist/postprocessor/ffmpeg.d.ts.map +1 -0
  46. package/dist/postprocessor/ffmpeg.js +286 -0
  47. package/dist/postprocessor/ffmpeg.js.map +1 -0
  48. package/dist/types.d.ts +157 -0
  49. package/dist/types.d.ts.map +1 -0
  50. package/dist/types.js +3 -0
  51. package/dist/types.js.map +1 -0
  52. package/dist/utils/index.d.ts +57 -0
  53. package/dist/utils/index.d.ts.map +1 -0
  54. package/dist/utils/index.js +403 -0
  55. package/dist/utils/index.js.map +1 -0
  56. package/dist/utils/traversal.d.ts +22 -0
  57. package/dist/utils/traversal.d.ts.map +1 -0
  58. package/dist/utils/traversal.js +112 -0
  59. package/dist/utils/traversal.js.map +1 -0
  60. package/dist/ytgrab.d.ts +48 -0
  61. package/dist/ytgrab.d.ts.map +1 -0
  62. package/dist/ytgrab.js +450 -0
  63. package/dist/ytgrab.js.map +1 -0
  64. package/package.json +45 -0
package/dist/ytgrab.js ADDED
@@ -0,0 +1,450 @@
1
+ "use strict";
2
+ /**
3
+ * YtGrab - Main orchestrator class
4
+ * Ported from yt_dlp/YoutubeDL.py
5
+ *
6
+ * Coordinates extractors, downloaders, and post-processors.
7
+ */
8
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
9
+ if (k2 === undefined) k2 = k;
10
+ var desc = Object.getOwnPropertyDescriptor(m, k);
11
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
12
+ desc = { enumerable: true, get: function() { return m[k]; } };
13
+ }
14
+ Object.defineProperty(o, k2, desc);
15
+ }) : (function(o, m, k, k2) {
16
+ if (k2 === undefined) k2 = k;
17
+ o[k2] = m[k];
18
+ }));
19
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
20
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
21
+ }) : function(o, v) {
22
+ o["default"] = v;
23
+ });
24
+ var __importStar = (this && this.__importStar) || (function () {
25
+ var ownKeys = function(o) {
26
+ ownKeys = Object.getOwnPropertyNames || function (o) {
27
+ var ar = [];
28
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
29
+ return ar;
30
+ };
31
+ return ownKeys(o);
32
+ };
33
+ return function (mod) {
34
+ if (mod && mod.__esModule) return mod;
35
+ var result = {};
36
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
37
+ __setModuleDefault(result, mod);
38
+ return result;
39
+ };
40
+ })();
41
+ Object.defineProperty(exports, "__esModule", { value: true });
42
+ exports.YtGrab = void 0;
43
+ const fs = __importStar(require("node:fs"));
44
+ const path = __importStar(require("node:path"));
45
+ const youtube_js_1 = require("./extractor/youtube.js");
46
+ const index_js_1 = require("./downloader/index.js");
47
+ const ffmpeg_js_1 = require("./postprocessor/ffmpeg.js");
48
+ const index_js_2 = require("./utils/index.js");
49
+ const index_js_3 = require("./networking/index.js");
50
+ class YtGrab {
51
+ params;
52
+ _extractors = [];
53
+ _postProcessors = [];
54
+ _progressHooks = [];
55
+ constructor(options = {}) {
56
+ this.params = {
57
+ format: 'best',
58
+ output: '%(title)s [%(id)s].%(ext)s',
59
+ quiet: false,
60
+ verbose: false,
61
+ retries: 10,
62
+ ...options,
63
+ };
64
+ // Register extractors
65
+ this._extractors = [
66
+ new youtube_js_1.YoutubeIE(),
67
+ new youtube_js_1.YoutubePlaylistIE(),
68
+ new youtube_js_1.YoutubeSearchIE(),
69
+ ];
70
+ for (const ie of this._extractors) {
71
+ ie.setDownloader(this);
72
+ }
73
+ // Register progress hooks
74
+ if (options.progressHooks) {
75
+ this._progressHooks.push(...options.progressHooks);
76
+ }
77
+ // Set up post-processors based on options
78
+ this._setupPostProcessors();
79
+ }
80
+ _setupPostProcessors() {
81
+ if (this.params.extractAudio) {
82
+ this._postProcessors.push(new ffmpeg_js_1.FFmpegExtractAudioPP(this, this.params.audioFormat || 'mp3', this.params.audioQuality || '5'));
83
+ }
84
+ if (this.params.mergeOutputFormat) {
85
+ this._postProcessors.push(new ffmpeg_js_1.FFmpegVideoConvertorPP(this, this.params.mergeOutputFormat));
86
+ }
87
+ if (this.params.embedSubtitles) {
88
+ this._postProcessors.push(new ffmpeg_js_1.FFmpegEmbedSubtitlePP(this));
89
+ }
90
+ if (this.params.embedMetadata) {
91
+ this._postProcessors.push(new ffmpeg_js_1.FFmpegMetadataPP(this));
92
+ }
93
+ }
94
+ // --- Public API ---
95
+ /**
96
+ * Extract info from a URL without downloading.
97
+ */
98
+ async getInfo(url) {
99
+ return this.extractInfo(url, false);
100
+ }
101
+ /**
102
+ * Extract info and download.
103
+ */
104
+ async download(urls) {
105
+ const urlList = Array.isArray(urls) ? urls : [urls];
106
+ const results = [];
107
+ for (const url of urlList) {
108
+ const info = await this.extractInfo(url, true);
109
+ if (info._type === 'playlist' && Array.isArray(info.entries)) {
110
+ for (const entry of info.entries) {
111
+ if (entry._type === 'url' && entry.url) {
112
+ const videoInfo = await this.extractInfo(entry.url, true);
113
+ results.push(videoInfo);
114
+ }
115
+ else {
116
+ results.push(entry);
117
+ }
118
+ }
119
+ }
120
+ else {
121
+ results.push(info);
122
+ }
123
+ }
124
+ return results;
125
+ }
126
+ /**
127
+ * List available formats for a URL.
128
+ */
129
+ async listFormats(url) {
130
+ const info = await this.getInfo(url);
131
+ return info.formats || [];
132
+ }
133
+ /**
134
+ * List available subtitles for a URL.
135
+ */
136
+ async listSubtitles(url) {
137
+ const info = await this.getInfo(url);
138
+ return {
139
+ subtitles: info.subtitles || {},
140
+ automatic_captions: info.automatic_captions || {},
141
+ };
142
+ }
143
+ // --- Core logic ---
144
+ async extractInfo(url, download = true) {
145
+ const ie = this._findExtractor(url);
146
+ if (!ie)
147
+ throw new index_js_2.UnsupportedError(url);
148
+ const info = await ie.extract(url);
149
+ if (download && !this.params.simulate && !this.params.skipDownload) {
150
+ if (info._type === 'playlist') {
151
+ return info; // Caller handles playlist entries
152
+ }
153
+ await this.processInfo(info);
154
+ }
155
+ return info;
156
+ }
157
+ async processInfo(info) {
158
+ if (!info.formats || info.formats.length === 0) {
159
+ this.toScreen(`[ytgrab] ${info.id}: No formats available`);
160
+ return;
161
+ }
162
+ // List formats if requested
163
+ if (this.params.listFormats) {
164
+ this._printFormats(info.formats);
165
+ return;
166
+ }
167
+ // List subtitles if requested
168
+ if (this.params.listSubtitles) {
169
+ this._printSubtitles(info);
170
+ return;
171
+ }
172
+ // Select format
173
+ const selectedFormat = this._selectFormat(info.formats, this.params.format || 'best');
174
+ if (!selectedFormat) {
175
+ throw new index_js_2.ExtractorError('No suitable format found');
176
+ }
177
+ // Prepare filename
178
+ const filename = this._prepareFilename(info, selectedFormat);
179
+ info.filepath = filename;
180
+ info.ext = selectedFormat.ext;
181
+ info.format = `${selectedFormat.format_id} - ${selectedFormat.height || '?'}p`;
182
+ info.format_id = selectedFormat.format_id;
183
+ // Write info JSON
184
+ if (this.params.writeInfoJson) {
185
+ await this._writeInfoJson(info, filename);
186
+ }
187
+ // Write description
188
+ if (this.params.writeDescription && info.description) {
189
+ const descPath = filename.replace(/\.[^.]+$/, '.description');
190
+ fs.writeFileSync(descPath, info.description, 'utf-8');
191
+ this.toScreen(`[info] Writing description to: ${descPath}`);
192
+ }
193
+ // Download thumbnails
194
+ if (this.params.writeThumbnail && info.thumbnails?.length) {
195
+ await this._downloadThumbnail(info, filename);
196
+ }
197
+ // Download subtitles
198
+ if ((this.params.writeSubtitles || this.params.writeAutoSubtitles) && info.subtitles) {
199
+ await this._downloadSubtitles(info, filename);
200
+ }
201
+ // Download the video
202
+ this.toScreen(`[download] ${info.title}`);
203
+ this.toScreen(`[download] Format: ${selectedFormat.format_id} (${selectedFormat.ext}, ${selectedFormat.height || '?'}p)`);
204
+ const downloader = (0, index_js_1.getSuitableDownloader)(selectedFormat, this);
205
+ const infoForDownload = {
206
+ ...info,
207
+ url: selectedFormat.url,
208
+ http_headers: selectedFormat.http_headers,
209
+ };
210
+ await downloader.realDownload(filename, infoForDownload);
211
+ // Run post-processors
212
+ let currentInfo = { ...info, filepath: filename };
213
+ const filesToDelete = [];
214
+ for (const pp of this._postProcessors) {
215
+ try {
216
+ const [toDelete, modifiedInfo] = await pp.run(currentInfo);
217
+ filesToDelete.push(...toDelete);
218
+ currentInfo = modifiedInfo;
219
+ }
220
+ catch (err) {
221
+ this.reportWarning(`Post-processor ${pp.PP_NAME} failed: ${err.message}`);
222
+ }
223
+ }
224
+ // Clean up temp files
225
+ for (const f of filesToDelete) {
226
+ try {
227
+ fs.unlinkSync(f);
228
+ }
229
+ catch { /* ignore */ }
230
+ }
231
+ }
232
+ // --- Format selection ---
233
+ _selectFormat(formats, formatSpec) {
234
+ if (formats.length === 0)
235
+ return null;
236
+ // Filter out formats without URLs
237
+ const available = formats.filter(f => f.url);
238
+ if (available.length === 0)
239
+ return null;
240
+ switch (formatSpec) {
241
+ case 'best':
242
+ case 'bestvideo+bestaudio':
243
+ return available[available.length - 1]; // Already sorted
244
+ case 'worst':
245
+ return available[0];
246
+ case 'bestaudio':
247
+ return available
248
+ .filter(f => f.acodec && f.acodec !== 'none')
249
+ .sort((a, b) => (a.abr || a.tbr || 0) - (b.abr || b.tbr || 0))
250
+ .pop() || available[available.length - 1];
251
+ case 'bestvideo':
252
+ return available
253
+ .filter(f => f.vcodec && f.vcodec !== 'none')
254
+ .sort((a, b) => (a.height || 0) - (b.height || 0))
255
+ .pop() || available[available.length - 1];
256
+ default: {
257
+ // Try format_id match
258
+ const byId = available.find(f => f.format_id === formatSpec);
259
+ if (byId)
260
+ return byId;
261
+ // Try height match like "720" or "1080p"
262
+ const heightMatch = formatSpec.match(/^(\d+)p?$/);
263
+ if (heightMatch) {
264
+ const targetHeight = parseInt(heightMatch[1]);
265
+ // Find closest format with video
266
+ const withVideo = available.filter(f => f.height && f.vcodec !== 'none');
267
+ if (withVideo.length > 0) {
268
+ withVideo.sort((a, b) => Math.abs((a.height || 0) - targetHeight) - Math.abs((b.height || 0) - targetHeight));
269
+ return withVideo[0];
270
+ }
271
+ }
272
+ return available[available.length - 1]; // Fallback to best
273
+ }
274
+ }
275
+ }
276
+ // --- Filename preparation ---
277
+ _prepareFilename(info, format) {
278
+ let template = this.params.output || '%(title)s [%(id)s].%(ext)s';
279
+ const fields = {
280
+ id: info.id,
281
+ title: (0, index_js_2.sanitizeFilename)(info.title || 'Unknown'),
282
+ ext: format.ext || 'mp4',
283
+ uploader: (0, index_js_2.sanitizeFilename)(info.uploader || 'Unknown'),
284
+ channel: (0, index_js_2.sanitizeFilename)(info.channel || 'Unknown'),
285
+ upload_date: info.upload_date || '',
286
+ duration: info.duration ? String(info.duration) : '',
287
+ view_count: info.view_count ? String(info.view_count) : '',
288
+ height: format.height ? String(format.height) : '',
289
+ width: format.width ? String(format.width) : '',
290
+ format_id: format.format_id || '',
291
+ resolution: format.height ? `${format.width || '?'}x${format.height}` : '',
292
+ };
293
+ let filename = template;
294
+ for (const [key, val] of Object.entries(fields)) {
295
+ filename = filename.replace(new RegExp(`%\\(${key}\\)s`, 'g'), val);
296
+ }
297
+ // Handle output paths
298
+ const outputDir = this.params.paths?.home || process.cwd();
299
+ return path.join(outputDir, filename);
300
+ }
301
+ // --- Subtitle download ---
302
+ async _downloadSubtitles(info, filename) {
303
+ const languages = this.params.subtitleLanguages || ['en'];
304
+ const format = this.params.subtitleFormat || 'srt';
305
+ // Determine which subtitles to download
306
+ let subsToDownload = {};
307
+ if (this.params.writeSubtitles && info.subtitles) {
308
+ for (const lang of languages) {
309
+ if (info.subtitles[lang]) {
310
+ subsToDownload[lang] = info.subtitles[lang];
311
+ }
312
+ }
313
+ }
314
+ if (this.params.writeAutoSubtitles && info.automatic_captions) {
315
+ for (const lang of languages) {
316
+ if (!subsToDownload[lang] && info.automatic_captions[lang]) {
317
+ subsToDownload[lang] = info.automatic_captions[lang];
318
+ }
319
+ }
320
+ }
321
+ const subtitleFiles = [];
322
+ for (const [lang, subs] of Object.entries(subsToDownload)) {
323
+ // Find the preferred format
324
+ const sub = subs.find(s => s.ext === format) || subs[0];
325
+ if (!sub?.url)
326
+ continue;
327
+ const subPath = filename.replace(/\.[^.]+$/, `.${lang}.${sub.ext}`);
328
+ this.toScreen(`[info] Downloading subtitles: ${lang} (${sub.ext})`);
329
+ try {
330
+ const subDir = path.dirname(subPath);
331
+ if (!fs.existsSync(subDir))
332
+ fs.mkdirSync(subDir, { recursive: true });
333
+ // Use got-scraping for subtitle downloads (handles TLS fingerprinting)
334
+ let subContent = '';
335
+ try {
336
+ const { gotScraping } = await import('got-scraping');
337
+ const subResp = await gotScraping({
338
+ url: sub.url,
339
+ headerGeneratorOptions: {
340
+ browsers: [{ name: 'chrome', minVersion: 120 }],
341
+ locales: ['en-US'],
342
+ operatingSystems: ['windows'],
343
+ },
344
+ });
345
+ subContent = subResp.body;
346
+ }
347
+ catch {
348
+ // Fallback to Node.js HTTP
349
+ const resp = await (0, index_js_3.makeRequest)(sub.url);
350
+ subContent = resp.text();
351
+ }
352
+ fs.writeFileSync(subPath, subContent, 'utf-8');
353
+ subtitleFiles.push(subPath);
354
+ }
355
+ catch (err) {
356
+ this.reportWarning(`Failed to download ${lang} subtitles: ${err.message}`);
357
+ }
358
+ }
359
+ // Store for subtitle embedding post-processor
360
+ info.__subtitle_files = subtitleFiles;
361
+ }
362
+ // --- Thumbnail download ---
363
+ async _downloadThumbnail(info, filename) {
364
+ const thumbnails = info.thumbnails || [];
365
+ // Get the best quality thumbnail
366
+ const thumb = thumbnails[thumbnails.length - 1];
367
+ if (!thumb?.url)
368
+ return;
369
+ const thumbPath = filename.replace(/\.[^.]+$/, '.jpg');
370
+ this.toScreen(`[info] Downloading thumbnail`);
371
+ try {
372
+ const resp = await (0, index_js_3.makeRequest)(thumb.url);
373
+ fs.writeFileSync(thumbPath, resp.body);
374
+ }
375
+ catch (err) {
376
+ this.reportWarning(`Failed to download thumbnail: ${err.message}`);
377
+ }
378
+ }
379
+ // --- Info JSON ---
380
+ async _writeInfoJson(info, filename) {
381
+ const jsonPath = filename.replace(/\.[^.]+$/, '.info.json');
382
+ const { filepath, ...infoWithoutFilepath } = info;
383
+ fs.writeFileSync(jsonPath, JSON.stringify(infoWithoutFilepath, null, 2), 'utf-8');
384
+ this.toScreen(`[info] Writing info JSON to: ${jsonPath}`);
385
+ }
386
+ // --- Output ---
387
+ _printFormats(formats) {
388
+ console.log('\nAvailable formats:');
389
+ console.log('─'.repeat(100));
390
+ console.log('ID'.padEnd(12) +
391
+ 'EXT'.padEnd(6) +
392
+ 'RESOLUTION'.padEnd(14) +
393
+ 'FPS'.padEnd(6) +
394
+ 'FILESIZE'.padEnd(12) +
395
+ 'TBR'.padEnd(8) +
396
+ 'VCODEC'.padEnd(14) +
397
+ 'ACODEC'.padEnd(14) +
398
+ 'NOTE');
399
+ console.log('─'.repeat(100));
400
+ for (const f of formats) {
401
+ const resolution = f.height ? `${f.width || '?'}x${f.height}` : 'audio only';
402
+ console.log((f.format_id || '?').padEnd(12) +
403
+ (f.ext || '?').padEnd(6) +
404
+ resolution.padEnd(14) +
405
+ (f.fps ? `${f.fps}` : '').padEnd(6) +
406
+ (f.filesize ? (0, index_js_2.formatBytes)(f.filesize) : '~').padEnd(12) +
407
+ (f.tbr ? `${f.tbr}k` : '').padEnd(8) +
408
+ (f.vcodec || 'none').padEnd(14) +
409
+ (f.acodec || 'none').padEnd(14) +
410
+ (f.format_note || ''));
411
+ }
412
+ console.log('');
413
+ }
414
+ _printSubtitles(info) {
415
+ const printSubs = (title, subs) => {
416
+ const langs = Object.keys(subs);
417
+ if (langs.length === 0)
418
+ return;
419
+ console.log(`\n${title} (${langs.length} languages):`);
420
+ for (const lang of langs.sort()) {
421
+ const formats = subs[lang].map(s => s.ext).filter((v, i, a) => a.indexOf(v) === i);
422
+ console.log(` ${lang}: ${formats.join(', ')}`);
423
+ }
424
+ };
425
+ printSubs('Manual subtitles', info.subtitles || {});
426
+ printSubs('Automatic captions', info.automatic_captions || {});
427
+ }
428
+ // --- Extractor lookup ---
429
+ _findExtractor(url) {
430
+ for (const ie of this._extractors) {
431
+ if (ie.suitable(url))
432
+ return ie;
433
+ }
434
+ return null;
435
+ }
436
+ // --- Logging (used by extractors/downloaders) ---
437
+ toScreen(msg) {
438
+ if (this.params.quiet)
439
+ return;
440
+ console.log(msg);
441
+ }
442
+ reportWarning(msg) {
443
+ console.warn(`WARNING: ${msg}`);
444
+ }
445
+ reportError(msg) {
446
+ console.error(`ERROR: ${msg}`);
447
+ }
448
+ }
449
+ exports.YtGrab = YtGrab;
450
+ //# sourceMappingURL=ytgrab.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ytgrab.js","sourceRoot":"","sources":["../src/ytgrab.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,45 @@
1
+ {
2
+ "name": "ytgrab",
3
+ "version": "0.1.0",
4
+ "description": "A Node.js YouTube video downloader ported from yt-dlp",
5
+ "main": "dist/index.js",
6
+ "types": "dist/index.d.ts",
7
+ "bin": {
8
+ "ytgrab": "bin/ytgrab.js"
9
+ },
10
+ "files": [
11
+ "dist",
12
+ "bin"
13
+ ],
14
+ "scripts": {
15
+ "build": "tsc",
16
+ "dev": "tsc --watch",
17
+ "test": "node --test dist/**/*.test.js",
18
+ "lint": "tsc --noEmit",
19
+ "prepublishOnly": "npm run build"
20
+ },
21
+ "keywords": [
22
+ "youtube",
23
+ "video",
24
+ "download",
25
+ "extractor",
26
+ "stream"
27
+ ],
28
+ "repository": {
29
+ "type": "git",
30
+ "url": "https://github.com/harrywang/ytgrab.git"
31
+ },
32
+ "license": "MIT",
33
+ "engines": {
34
+ "node": ">=18.0.0"
35
+ },
36
+ "dependencies": {
37
+ "astring": "^1.9.0",
38
+ "got-scraping": "^4.2.1",
39
+ "meriyah": "^6.1.4"
40
+ },
41
+ "devDependencies": {
42
+ "@types/node": "^20.0.0",
43
+ "typescript": "^5.4.0"
44
+ }
45
+ }