Initial commit.
This commit is contained in:
		
						commit
						c589a5f3cf
					
				
					 5 changed files with 1101 additions and 0 deletions
				
			
		
							
								
								
									
										2
									
								
								.gitignore
									
										
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										2
									
								
								.gitignore
									
										
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,2 @@ | |||
| out | ||||
| state.json | ||||
							
								
								
									
										212
									
								
								index.ts
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										212
									
								
								index.ts
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,212 @@ | |||
| import parseDuration from "parse-duration"; | ||||
| import humanizeDuration from "humanize-duration"; | ||||
| import { createLogger, format, transports } from "winston"; | ||||
| import { InvalidArgumentError, Command } from "@commander-js/extra-typings"; | ||||
| import shell from "shelljs"; | ||||
| import { youtube } from "@googleapis/youtube"; | ||||
| import fs from "fs"; | ||||
| 
 | ||||
| const program = new Command() | ||||
|   .name("scavengetube") | ||||
|   .requiredOption( | ||||
|     "--api-key <API_KEY>", | ||||
|     "YouTube API key (or specify via SCAVENGETUBE_YOUTUBE_KEY environment variable)", | ||||
|     (apiKey: string | undefined) => { | ||||
|       apiKey = apiKey || process.env.SCAVENGETUBE_YOUTUBE_KEY; | ||||
|       if (!apiKey) { | ||||
|         throw new InvalidArgumentError("API key is required."); | ||||
|       } | ||||
|       return apiKey; | ||||
|     } | ||||
|   ) | ||||
|   .requiredOption( | ||||
|     "--limit <LIMIT>", | ||||
|     "Download limit (default: 5)", | ||||
|     (value: string) => { | ||||
|       const result = parseInt(value, 5); | ||||
|       if (isNaN(result)) { | ||||
|         throw new InvalidArgumentError("Invalid limit."); | ||||
|       } | ||||
|       return result; | ||||
|     }, | ||||
|     10 | ||||
|   ) | ||||
|   .requiredOption( | ||||
|     "--period <PERIOD>", | ||||
|     "Delay between searches (default: 3h)", | ||||
|     (value: string) => { | ||||
|       const result = parseDuration(value); | ||||
|       if (!result) { | ||||
|         throw new InvalidArgumentError("Invalid duration."); | ||||
|       } | ||||
|       return result; | ||||
|     }, | ||||
|     3 * 60 * 60 * 1000 | ||||
|   ) | ||||
|   .requiredOption( | ||||
|     "--output <DIRECTORY>", | ||||
|     "Output directory", | ||||
|     (directory: string) => { | ||||
|       try { | ||||
|         fs.accessSync(directory, fs.constants.W_OK); | ||||
|         return directory; | ||||
|       } catch (err) { | ||||
|         throw new InvalidArgumentError( | ||||
|           `Directory ${directory} is not writable.` | ||||
|         ); | ||||
|       } | ||||
|     }, | ||||
|     "out" | ||||
|   ) | ||||
|   .requiredOption( | ||||
|     "--state-file <FILE>", | ||||
|     "State file", | ||||
|     (file: string) => { | ||||
|       try { | ||||
|         fs.accessSync(file, fs.constants.W_OK); | ||||
|         return file; | ||||
|       } catch (err) { | ||||
|         throw new InvalidArgumentError(`File ${file} is not writable.`); | ||||
|       } | ||||
|     }, | ||||
|     "state.json" | ||||
|   ) | ||||
|   .option("--log <LOG_LEVEL>", 'Log level, default "info"', "info"); | ||||
| 
 | ||||
| program.parse(); | ||||
| 
 | ||||
| const options = program.opts(); | ||||
| 
 | ||||
| const logger = createLogger({ | ||||
|   format: format.combine( | ||||
|     format.timestamp(), | ||||
|     format.errors({ stack: true }), | ||||
|     format.splat(), | ||||
|     format.colorize(), | ||||
|     format.padLevels(), | ||||
|     format.printf(({ level, message, timestamp }) => { | ||||
|       return `${timestamp} | ${level}: ${message}`; | ||||
|     }) | ||||
|   ), | ||||
|   transports: [new transports.Console({ level: options.log })], | ||||
| }); | ||||
| 
 | ||||
| logger.info("Starting scavengetube..."); | ||||
| 
 | ||||
| const ytdlPath = ["yt-dlp", "yt-dl"] | ||||
|   .map((bin) => shell.which(bin)) | ||||
|   .find(Boolean); | ||||
| if (!ytdlPath) { | ||||
|   throw new Error("Couldn't find yt-dlp or yt-dl binary in $PATH."); | ||||
| } | ||||
| logger.debug("Using %s as yt-dlp binary.", ytdlPath.toString()); | ||||
| 
 | ||||
| const ytApi = youtube({ | ||||
|   version: "v3", | ||||
|   auth: options.apiKey, | ||||
| }); | ||||
| 
 | ||||
| let state = { | ||||
|   downloaded: [] as string[], | ||||
| }; | ||||
| 
 | ||||
| if (fs.existsSync(options.stateFile)) { | ||||
|   logger.info("Loading state from %s", options.stateFile); | ||||
|   state = JSON.parse(fs.readFileSync(options.stateFile, "utf-8")); | ||||
|   logger.debug("Loaded state: %j", state); | ||||
| } else { | ||||
|   logger.info("No state file found, starting from scratch."); | ||||
| } | ||||
| 
 | ||||
| if (!fs.existsSync(options.output)) { | ||||
|   logger.info("Creating output directory %s", options.output); | ||||
|   fs.mkdirSync(options.output); | ||||
| } | ||||
| 
 | ||||
| while (true) { | ||||
|   const now = new Date(); | ||||
| 
 | ||||
|   const search = getSearch(); | ||||
|   logger.info("Searching for %s", search); | ||||
|   try { | ||||
|     const response = await ytApi.search.list({ | ||||
|       part: ["snippet"], | ||||
|       q: search, | ||||
|       maxResults: 50, | ||||
|       safeSearch: "none", | ||||
|       order: "date", | ||||
|     }); | ||||
| 
 | ||||
|     const videos = (response.data.items || []).map((item) => ({ | ||||
|       id: item.id?.videoId, | ||||
|       title: item.snippet?.title, | ||||
|       channel: item.snippet?.channelTitle, | ||||
|       description: item.snippet?.description, | ||||
|       publishedAt: item.snippet?.publishedAt, | ||||
|     })); | ||||
| 
 | ||||
|     logger.debug("Found %d videos: %j", videos.length, videos); | ||||
| 
 | ||||
|     let downloaded = 0; | ||||
|     for (const video of videos) { | ||||
|       if (!video.id) { | ||||
|         logger.warn("Skipping %s, no video ID?!", video); | ||||
|         continue; | ||||
|       } | ||||
|       if (state.downloaded.includes(video.id)) { | ||||
|         logger.debug("Skipping %s, already downloaded", video.id); | ||||
|         continue; | ||||
|       } | ||||
| 
 | ||||
|       logger.info( | ||||
|         "Downloading %s (%s) from %s by %s", | ||||
|         video.id, | ||||
|         video.title, | ||||
|         video.publishedAt, | ||||
|         video.channel | ||||
|       ); | ||||
| 
 | ||||
|       const cmdline = `${ytdlPath} --no-playlist --no-warnings --write-info-json --output "${ | ||||
|         options.output | ||||
|       }/${new Date().getTime()}_%(title)s_%(id)s.%(ext)s" https://www.youtube.com/watch?v=${
 | ||||
|         video.id | ||||
|       }`;
 | ||||
| 
 | ||||
|       logger.debug("Executing `%s`", cmdline); | ||||
|       const result = shell.exec(cmdline, { silent: true }); | ||||
|       if (result.code !== 0) { | ||||
|         logger.error("Failed to download %s: %s", video.id, result.stderr); | ||||
|         continue; | ||||
|       } | ||||
| 
 | ||||
|       state.downloaded.push(video.id); | ||||
|       downloaded++; | ||||
|       logger.info("Downloaded %s", video.id); | ||||
| 
 | ||||
|       if (downloaded >= options.limit) { | ||||
|         logger.info("Download limit reached, stopping search"); | ||||
|         break; | ||||
|       } | ||||
|     } | ||||
|   } catch (err) { | ||||
|     logger.error(err); | ||||
|   } | ||||
| 
 | ||||
|   fs.writeFileSync(options.stateFile, JSON.stringify(state)); | ||||
|   logger.debug("Saved state to %s", options.stateFile); | ||||
| 
 | ||||
|   const delay = now.getTime() + options.period - Date.now(); | ||||
|   logger.info("Waiting for %s", humanizeDuration(delay)); | ||||
|   await new Promise((resolve) => setTimeout(resolve, delay)); | ||||
| } | ||||
| 
 | ||||
| function getSearch(): string { | ||||
|   var prefix = pick(["DSC", "MOV", "IMG", "100", "MVI"]); | ||||
|   var separator = pick([" ", "_", ""]); | ||||
|   var numbers = String(Math.floor(Math.random() * 9999)).padStart(4, "0"); | ||||
|   return `${prefix}${separator}${numbers}`; | ||||
| } | ||||
| 
 | ||||
| function pick<T>(array: T[]): T { | ||||
|   return array[Math.floor(Math.random() * array.length)]; | ||||
| } | ||||
							
								
								
									
										29
									
								
								package.json
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										29
									
								
								package.json
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,29 @@ | |||
| { | ||||
|   "name": "scavengetube", | ||||
|   "version": "1.0.0", | ||||
|   "description": "", | ||||
|   "main": "index.js", | ||||
|   "type": "module", | ||||
|   "scripts": { | ||||
|     "start": "ts-node index.ts", | ||||
|     "test": "echo \"Error: no test specified\" && exit 1" | ||||
|   }, | ||||
|   "author": "", | ||||
|   "license": "ISC", | ||||
|   "dependencies": { | ||||
|     "@commander-js/extra-typings": "^11.0.0", | ||||
|     "@googleapis/youtube": "^11.0.1", | ||||
|     "commander": "^11.0.0", | ||||
|     "humanize-duration": "^3.29.0", | ||||
|     "parse-duration": "^1.1.0", | ||||
|     "shelljs": "^0.8.5", | ||||
|     "ts-node": "^10.9.1", | ||||
|     "typescript": "^5.2.2", | ||||
|     "winston": "^3.10.0" | ||||
|   }, | ||||
|   "devDependencies": { | ||||
|     "@types/humanize-duration": "^3.27.1", | ||||
|     "@types/shelljs": "^0.8.12", | ||||
|     "prettier": "^3.0.2" | ||||
|   } | ||||
| } | ||||
							
								
								
									
										748
									
								
								pnpm-lock.yaml
									
										
									
										generated
									
									
									
										Normal file
									
								
							
							
						
						
									
										748
									
								
								pnpm-lock.yaml
									
										
									
										generated
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,748 @@ | |||
| lockfileVersion: '6.0' | ||||
| 
 | ||||
| settings: | ||||
|   autoInstallPeers: true | ||||
|   excludeLinksFromLockfile: false | ||||
| 
 | ||||
| dependencies: | ||||
|   '@commander-js/extra-typings': | ||||
|     specifier: ^11.0.0 | ||||
|     version: 11.0.0(commander@11.0.0) | ||||
|   '@googleapis/youtube': | ||||
|     specifier: ^11.0.1 | ||||
|     version: 11.0.1 | ||||
|   commander: | ||||
|     specifier: ^11.0.0 | ||||
|     version: 11.0.0 | ||||
|   humanize-duration: | ||||
|     specifier: ^3.29.0 | ||||
|     version: 3.29.0 | ||||
|   parse-duration: | ||||
|     specifier: ^1.1.0 | ||||
|     version: 1.1.0 | ||||
|   shelljs: | ||||
|     specifier: ^0.8.5 | ||||
|     version: 0.8.5 | ||||
|   ts-node: | ||||
|     specifier: ^10.9.1 | ||||
|     version: 10.9.1(@types/node@20.5.6)(typescript@5.2.2) | ||||
|   typescript: | ||||
|     specifier: ^5.2.2 | ||||
|     version: 5.2.2 | ||||
|   winston: | ||||
|     specifier: ^3.10.0 | ||||
|     version: 3.10.0 | ||||
| 
 | ||||
| devDependencies: | ||||
|   '@types/humanize-duration': | ||||
|     specifier: ^3.27.1 | ||||
|     version: 3.27.1 | ||||
|   '@types/shelljs': | ||||
|     specifier: ^0.8.12 | ||||
|     version: 0.8.12 | ||||
|   prettier: | ||||
|     specifier: ^3.0.2 | ||||
|     version: 3.0.2 | ||||
| 
 | ||||
| packages: | ||||
| 
 | ||||
|   /@colors/colors@1.5.0: | ||||
|     resolution: {integrity: sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==} | ||||
|     engines: {node: '>=0.1.90'} | ||||
|     dev: false | ||||
| 
 | ||||
|   /@commander-js/extra-typings@11.0.0(commander@11.0.0): | ||||
|     resolution: {integrity: sha512-06ol6Kn5gPjFY6v0vWOZ84nQwyqhZdaeZCHYH3vhwewjpOEjniF1KHZxh18887G3poWiJ8qyq5pb6ANuiddfPQ==} | ||||
|     peerDependencies: | ||||
|       commander: 11.0.x | ||||
|     dependencies: | ||||
|       commander: 11.0.0 | ||||
|     dev: false | ||||
| 
 | ||||
|   /@cspotcode/source-map-support@0.8.1: | ||||
|     resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} | ||||
|     engines: {node: '>=12'} | ||||
|     dependencies: | ||||
|       '@jridgewell/trace-mapping': 0.3.9 | ||||
|     dev: false | ||||
| 
 | ||||
|   /@dabh/diagnostics@2.0.3: | ||||
|     resolution: {integrity: sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA==} | ||||
|     dependencies: | ||||
|       colorspace: 1.1.4 | ||||
|       enabled: 2.0.0 | ||||
|       kuler: 2.0.0 | ||||
|     dev: false | ||||
| 
 | ||||
|   /@googleapis/youtube@11.0.1: | ||||
|     resolution: {integrity: sha512-xbA9u6ig0T4KWsWp3k9gNFZiIdtMewSK5AhofV2lMCLTl+fCdgJNpkaLsZTpdGwe7eg4r05qvhuCISXk5Ql3Hw==} | ||||
|     engines: {node: '>=12.0.0'} | ||||
|     dependencies: | ||||
|       googleapis-common: 7.0.0 | ||||
|     transitivePeerDependencies: | ||||
|       - encoding | ||||
|       - supports-color | ||||
|     dev: false | ||||
| 
 | ||||
|   /@jridgewell/resolve-uri@3.1.1: | ||||
|     resolution: {integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==} | ||||
|     engines: {node: '>=6.0.0'} | ||||
|     dev: false | ||||
| 
 | ||||
|   /@jridgewell/sourcemap-codec@1.4.15: | ||||
|     resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} | ||||
|     dev: false | ||||
| 
 | ||||
|   /@jridgewell/trace-mapping@0.3.9: | ||||
|     resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} | ||||
|     dependencies: | ||||
|       '@jridgewell/resolve-uri': 3.1.1 | ||||
|       '@jridgewell/sourcemap-codec': 1.4.15 | ||||
|     dev: false | ||||
| 
 | ||||
|   /@tsconfig/node10@1.0.9: | ||||
|     resolution: {integrity: sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==} | ||||
|     dev: false | ||||
| 
 | ||||
|   /@tsconfig/node12@1.0.11: | ||||
|     resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==} | ||||
|     dev: false | ||||
| 
 | ||||
|   /@tsconfig/node14@1.0.3: | ||||
|     resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==} | ||||
|     dev: false | ||||
| 
 | ||||
|   /@tsconfig/node16@1.0.4: | ||||
|     resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} | ||||
|     dev: false | ||||
| 
 | ||||
|   /@types/glob@7.2.0: | ||||
|     resolution: {integrity: sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==} | ||||
|     dependencies: | ||||
|       '@types/minimatch': 5.1.2 | ||||
|       '@types/node': 20.5.6 | ||||
|     dev: true | ||||
| 
 | ||||
|   /@types/humanize-duration@3.27.1: | ||||
|     resolution: {integrity: sha512-K3e+NZlpCKd6Bd/EIdqjFJRFHbrq5TzPPLwREk5Iv/YoIjQrs6ljdAUCo+Lb2xFlGNOjGSE0dqsVD19cZL137w==} | ||||
|     dev: true | ||||
| 
 | ||||
|   /@types/minimatch@5.1.2: | ||||
|     resolution: {integrity: sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==} | ||||
|     dev: true | ||||
| 
 | ||||
|   /@types/node@20.5.6: | ||||
|     resolution: {integrity: sha512-Gi5wRGPbbyOTX+4Y2iULQ27oUPrefaB0PxGQJnfyWN3kvEDGM3mIB5M/gQLmitZf7A9FmLeaqxD3L1CXpm3VKQ==} | ||||
| 
 | ||||
|   /@types/shelljs@0.8.12: | ||||
|     resolution: {integrity: sha512-ZA8U81/gldY+rR5zl/7HSHrG2KDfEb3lzG6uCUDhW1DTQE9yC/VBQ45fXnXq8f3CgInfhZmjtdu/WOUlrXRQUg==} | ||||
|     dependencies: | ||||
|       '@types/glob': 7.2.0 | ||||
|       '@types/node': 20.5.6 | ||||
|     dev: true | ||||
| 
 | ||||
|   /@types/triple-beam@1.3.2: | ||||
|     resolution: {integrity: sha512-txGIh+0eDFzKGC25zORnswy+br1Ha7hj5cMVwKIU7+s0U2AxxJru/jZSMU6OC9MJWP6+pc/hc6ZjyZShpsyY2g==} | ||||
|     dev: false | ||||
| 
 | ||||
|   /acorn-walk@8.2.0: | ||||
|     resolution: {integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==} | ||||
|     engines: {node: '>=0.4.0'} | ||||
|     dev: false | ||||
| 
 | ||||
|   /acorn@8.10.0: | ||||
|     resolution: {integrity: sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==} | ||||
|     engines: {node: '>=0.4.0'} | ||||
|     hasBin: true | ||||
|     dev: false | ||||
| 
 | ||||
|   /agent-base@7.1.0: | ||||
|     resolution: {integrity: sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==} | ||||
|     engines: {node: '>= 14'} | ||||
|     dependencies: | ||||
|       debug: 4.3.4 | ||||
|     transitivePeerDependencies: | ||||
|       - supports-color | ||||
|     dev: false | ||||
| 
 | ||||
|   /arg@4.1.3: | ||||
|     resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} | ||||
|     dev: false | ||||
| 
 | ||||
|   /async@3.2.4: | ||||
|     resolution: {integrity: sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==} | ||||
|     dev: false | ||||
| 
 | ||||
|   /balanced-match@1.0.2: | ||||
|     resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} | ||||
|     dev: false | ||||
| 
 | ||||
|   /base64-js@1.5.1: | ||||
|     resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} | ||||
|     dev: false | ||||
| 
 | ||||
|   /bignumber.js@9.1.1: | ||||
|     resolution: {integrity: sha512-pHm4LsMJ6lzgNGVfZHjMoO8sdoRhOzOH4MLmY65Jg70bpxCKu5iOHNJyfF6OyvYw7t8Fpf35RuzUyqnQsj8Vig==} | ||||
|     dev: false | ||||
| 
 | ||||
|   /brace-expansion@1.1.11: | ||||
|     resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} | ||||
|     dependencies: | ||||
|       balanced-match: 1.0.2 | ||||
|       concat-map: 0.0.1 | ||||
|     dev: false | ||||
| 
 | ||||
|   /buffer-equal-constant-time@1.0.1: | ||||
|     resolution: {integrity: sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==} | ||||
|     dev: false | ||||
| 
 | ||||
|   /call-bind@1.0.2: | ||||
|     resolution: {integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==} | ||||
|     dependencies: | ||||
|       function-bind: 1.1.1 | ||||
|       get-intrinsic: 1.2.1 | ||||
|     dev: false | ||||
| 
 | ||||
|   /color-convert@1.9.3: | ||||
|     resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} | ||||
|     dependencies: | ||||
|       color-name: 1.1.3 | ||||
|     dev: false | ||||
| 
 | ||||
|   /color-name@1.1.3: | ||||
|     resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} | ||||
|     dev: false | ||||
| 
 | ||||
|   /color-name@1.1.4: | ||||
|     resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} | ||||
|     dev: false | ||||
| 
 | ||||
|   /color-string@1.9.1: | ||||
|     resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==} | ||||
|     dependencies: | ||||
|       color-name: 1.1.4 | ||||
|       simple-swizzle: 0.2.2 | ||||
|     dev: false | ||||
| 
 | ||||
|   /color@3.2.1: | ||||
|     resolution: {integrity: sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==} | ||||
|     dependencies: | ||||
|       color-convert: 1.9.3 | ||||
|       color-string: 1.9.1 | ||||
|     dev: false | ||||
| 
 | ||||
|   /colorspace@1.1.4: | ||||
|     resolution: {integrity: sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w==} | ||||
|     dependencies: | ||||
|       color: 3.2.1 | ||||
|       text-hex: 1.0.0 | ||||
|     dev: false | ||||
| 
 | ||||
|   /commander@11.0.0: | ||||
|     resolution: {integrity: sha512-9HMlXtt/BNoYr8ooyjjNRdIilOTkVJXB+GhxMTtOKwk0R4j4lS4NpjuqmRxroBfnfTSHQIHQB7wryHhXarNjmQ==} | ||||
|     engines: {node: '>=16'} | ||||
|     dev: false | ||||
| 
 | ||||
|   /concat-map@0.0.1: | ||||
|     resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} | ||||
|     dev: false | ||||
| 
 | ||||
|   /create-require@1.1.1: | ||||
|     resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} | ||||
|     dev: false | ||||
| 
 | ||||
|   /debug@4.3.4: | ||||
|     resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} | ||||
|     engines: {node: '>=6.0'} | ||||
|     peerDependencies: | ||||
|       supports-color: '*' | ||||
|     peerDependenciesMeta: | ||||
|       supports-color: | ||||
|         optional: true | ||||
|     dependencies: | ||||
|       ms: 2.1.2 | ||||
|     dev: false | ||||
| 
 | ||||
|   /diff@4.0.2: | ||||
|     resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} | ||||
|     engines: {node: '>=0.3.1'} | ||||
|     dev: false | ||||
| 
 | ||||
|   /ecdsa-sig-formatter@1.0.11: | ||||
|     resolution: {integrity: sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==} | ||||
|     dependencies: | ||||
|       safe-buffer: 5.2.1 | ||||
|     dev: false | ||||
| 
 | ||||
|   /enabled@2.0.0: | ||||
|     resolution: {integrity: sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==} | ||||
|     dev: false | ||||
| 
 | ||||
|   /extend@3.0.2: | ||||
|     resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} | ||||
|     dev: false | ||||
| 
 | ||||
|   /fecha@4.2.3: | ||||
|     resolution: {integrity: sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==} | ||||
|     dev: false | ||||
| 
 | ||||
|   /fn.name@1.1.0: | ||||
|     resolution: {integrity: sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==} | ||||
|     dev: false | ||||
| 
 | ||||
|   /fs.realpath@1.0.0: | ||||
|     resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} | ||||
|     dev: false | ||||
| 
 | ||||
|   /function-bind@1.1.1: | ||||
|     resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} | ||||
|     dev: false | ||||
| 
 | ||||
|   /gaxios@6.1.0: | ||||
|     resolution: {integrity: sha512-EIHuesZxNyIkUGcTQKQPMICyOpDD/bi+LJIJx+NLsSGmnS7N+xCLRX5bi4e9yAu9AlSZdVq+qlyWWVuTh/483w==} | ||||
|     engines: {node: '>=14'} | ||||
|     dependencies: | ||||
|       extend: 3.0.2 | ||||
|       https-proxy-agent: 7.0.1 | ||||
|       is-stream: 2.0.1 | ||||
|       node-fetch: 2.7.0 | ||||
|     transitivePeerDependencies: | ||||
|       - encoding | ||||
|       - supports-color | ||||
|     dev: false | ||||
| 
 | ||||
|   /gcp-metadata@6.0.0: | ||||
|     resolution: {integrity: sha512-Ozxyi23/1Ar51wjUT2RDklK+3HxqDr8TLBNK8rBBFQ7T85iIGnXnVusauj06QyqCXRFZig8LZC+TUddWbndlpQ==} | ||||
|     engines: {node: '>=14'} | ||||
|     dependencies: | ||||
|       gaxios: 6.1.0 | ||||
|       json-bigint: 1.0.0 | ||||
|     transitivePeerDependencies: | ||||
|       - encoding | ||||
|       - supports-color | ||||
|     dev: false | ||||
| 
 | ||||
|   /get-intrinsic@1.2.1: | ||||
|     resolution: {integrity: sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==} | ||||
|     dependencies: | ||||
|       function-bind: 1.1.1 | ||||
|       has: 1.0.3 | ||||
|       has-proto: 1.0.1 | ||||
|       has-symbols: 1.0.3 | ||||
|     dev: false | ||||
| 
 | ||||
|   /glob@7.2.3: | ||||
|     resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} | ||||
|     dependencies: | ||||
|       fs.realpath: 1.0.0 | ||||
|       inflight: 1.0.6 | ||||
|       inherits: 2.0.4 | ||||
|       minimatch: 3.1.2 | ||||
|       once: 1.4.0 | ||||
|       path-is-absolute: 1.0.1 | ||||
|     dev: false | ||||
| 
 | ||||
|   /google-auth-library@9.0.0: | ||||
|     resolution: {integrity: sha512-IQGjgQoVUAfOk6khqTVMLvWx26R+yPw9uLyb1MNyMQpdKiKt0Fd9sp4NWoINjyGHR8S3iw12hMTYK7O8J07c6Q==} | ||||
|     engines: {node: '>=14'} | ||||
|     dependencies: | ||||
|       base64-js: 1.5.1 | ||||
|       ecdsa-sig-formatter: 1.0.11 | ||||
|       gaxios: 6.1.0 | ||||
|       gcp-metadata: 6.0.0 | ||||
|       gtoken: 7.0.1 | ||||
|       jws: 4.0.0 | ||||
|       lru-cache: 6.0.0 | ||||
|     transitivePeerDependencies: | ||||
|       - encoding | ||||
|       - supports-color | ||||
|     dev: false | ||||
| 
 | ||||
|   /googleapis-common@7.0.0: | ||||
|     resolution: {integrity: sha512-58iSybJPQZ8XZNMpjrklICefuOuyJ0lMxfKmBqmaC0/xGT4SiOs4BE60LAOOGtBURy1n8fHa2X2YUNFEWWbXyQ==} | ||||
|     engines: {node: '>=14.0.0'} | ||||
|     dependencies: | ||||
|       extend: 3.0.2 | ||||
|       gaxios: 6.1.0 | ||||
|       google-auth-library: 9.0.0 | ||||
|       qs: 6.11.2 | ||||
|       url-template: 2.0.8 | ||||
|       uuid: 9.0.0 | ||||
|     transitivePeerDependencies: | ||||
|       - encoding | ||||
|       - supports-color | ||||
|     dev: false | ||||
| 
 | ||||
|   /gtoken@7.0.1: | ||||
|     resolution: {integrity: sha512-KcFVtoP1CVFtQu0aSk3AyAt2og66PFhZAlkUOuWKwzMLoulHXG5W5wE5xAnHb+yl3/wEFoqGW7/cDGMU8igDZQ==} | ||||
|     engines: {node: '>=14.0.0'} | ||||
|     dependencies: | ||||
|       gaxios: 6.1.0 | ||||
|       jws: 4.0.0 | ||||
|     transitivePeerDependencies: | ||||
|       - encoding | ||||
|       - supports-color | ||||
|     dev: false | ||||
| 
 | ||||
|   /has-proto@1.0.1: | ||||
|     resolution: {integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==} | ||||
|     engines: {node: '>= 0.4'} | ||||
|     dev: false | ||||
| 
 | ||||
|   /has-symbols@1.0.3: | ||||
|     resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} | ||||
|     engines: {node: '>= 0.4'} | ||||
|     dev: false | ||||
| 
 | ||||
|   /has@1.0.3: | ||||
|     resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} | ||||
|     engines: {node: '>= 0.4.0'} | ||||
|     dependencies: | ||||
|       function-bind: 1.1.1 | ||||
|     dev: false | ||||
| 
 | ||||
|   /https-proxy-agent@7.0.1: | ||||
|     resolution: {integrity: sha512-Eun8zV0kcYS1g19r78osiQLEFIRspRUDd9tIfBCTBPBeMieF/EsJNL8VI3xOIdYRDEkjQnqOYPsZ2DsWsVsFwQ==} | ||||
|     engines: {node: '>= 14'} | ||||
|     dependencies: | ||||
|       agent-base: 7.1.0 | ||||
|       debug: 4.3.4 | ||||
|     transitivePeerDependencies: | ||||
|       - supports-color | ||||
|     dev: false | ||||
| 
 | ||||
|   /humanize-duration@3.29.0: | ||||
|     resolution: {integrity: sha512-G5wZGwYTLaQAmYqhfK91aw3xt6wNbJW1RnWDh4qP1PvF4T/jnkjx2RVhG5kzB2PGsYGTn+oSDBQp+dMdILLxcg==} | ||||
|     dev: false | ||||
| 
 | ||||
|   /inflight@1.0.6: | ||||
|     resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} | ||||
|     dependencies: | ||||
|       once: 1.4.0 | ||||
|       wrappy: 1.0.2 | ||||
|     dev: false | ||||
| 
 | ||||
|   /inherits@2.0.4: | ||||
|     resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} | ||||
|     dev: false | ||||
| 
 | ||||
|   /interpret@1.4.0: | ||||
|     resolution: {integrity: sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==} | ||||
|     engines: {node: '>= 0.10'} | ||||
|     dev: false | ||||
| 
 | ||||
|   /is-arrayish@0.3.2: | ||||
|     resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==} | ||||
|     dev: false | ||||
| 
 | ||||
|   /is-core-module@2.13.0: | ||||
|     resolution: {integrity: sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==} | ||||
|     dependencies: | ||||
|       has: 1.0.3 | ||||
|     dev: false | ||||
| 
 | ||||
|   /is-stream@2.0.1: | ||||
|     resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} | ||||
|     engines: {node: '>=8'} | ||||
|     dev: false | ||||
| 
 | ||||
|   /json-bigint@1.0.0: | ||||
|     resolution: {integrity: sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==} | ||||
|     dependencies: | ||||
|       bignumber.js: 9.1.1 | ||||
|     dev: false | ||||
| 
 | ||||
|   /jwa@2.0.0: | ||||
|     resolution: {integrity: sha512-jrZ2Qx916EA+fq9cEAeCROWPTfCwi1IVHqT2tapuqLEVVDKFDENFw1oL+MwrTvH6msKxsd1YTDVw6uKEcsrLEA==} | ||||
|     dependencies: | ||||
|       buffer-equal-constant-time: 1.0.1 | ||||
|       ecdsa-sig-formatter: 1.0.11 | ||||
|       safe-buffer: 5.2.1 | ||||
|     dev: false | ||||
| 
 | ||||
|   /jws@4.0.0: | ||||
|     resolution: {integrity: sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg==} | ||||
|     dependencies: | ||||
|       jwa: 2.0.0 | ||||
|       safe-buffer: 5.2.1 | ||||
|     dev: false | ||||
| 
 | ||||
|   /kuler@2.0.0: | ||||
|     resolution: {integrity: sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==} | ||||
|     dev: false | ||||
| 
 | ||||
|   /logform@2.5.1: | ||||
|     resolution: {integrity: sha512-9FyqAm9o9NKKfiAKfZoYo9bGXXuwMkxQiQttkT4YjjVtQVIQtK6LmVtlxmCaFswo6N4AfEkHqZTV0taDtPotNg==} | ||||
|     dependencies: | ||||
|       '@colors/colors': 1.5.0 | ||||
|       '@types/triple-beam': 1.3.2 | ||||
|       fecha: 4.2.3 | ||||
|       ms: 2.1.2 | ||||
|       safe-stable-stringify: 2.4.3 | ||||
|       triple-beam: 1.4.1 | ||||
|     dev: false | ||||
| 
 | ||||
|   /lru-cache@6.0.0: | ||||
|     resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} | ||||
|     engines: {node: '>=10'} | ||||
|     dependencies: | ||||
|       yallist: 4.0.0 | ||||
|     dev: false | ||||
| 
 | ||||
|   /make-error@1.3.6: | ||||
|     resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} | ||||
|     dev: false | ||||
| 
 | ||||
|   /minimatch@3.1.2: | ||||
|     resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} | ||||
|     dependencies: | ||||
|       brace-expansion: 1.1.11 | ||||
|     dev: false | ||||
| 
 | ||||
|   /ms@2.1.2: | ||||
|     resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} | ||||
|     dev: false | ||||
| 
 | ||||
|   /node-fetch@2.7.0: | ||||
|     resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} | ||||
|     engines: {node: 4.x || >=6.0.0} | ||||
|     peerDependencies: | ||||
|       encoding: ^0.1.0 | ||||
|     peerDependenciesMeta: | ||||
|       encoding: | ||||
|         optional: true | ||||
|     dependencies: | ||||
|       whatwg-url: 5.0.0 | ||||
|     dev: false | ||||
| 
 | ||||
|   /object-inspect@1.12.3: | ||||
|     resolution: {integrity: sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==} | ||||
|     dev: false | ||||
| 
 | ||||
|   /once@1.4.0: | ||||
|     resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} | ||||
|     dependencies: | ||||
|       wrappy: 1.0.2 | ||||
|     dev: false | ||||
| 
 | ||||
|   /one-time@1.0.0: | ||||
|     resolution: {integrity: sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==} | ||||
|     dependencies: | ||||
|       fn.name: 1.1.0 | ||||
|     dev: false | ||||
| 
 | ||||
|   /parse-duration@1.1.0: | ||||
|     resolution: {integrity: sha512-z6t9dvSJYaPoQq7quMzdEagSFtpGu+utzHqqxmpVWNNZRIXnvqyCvn9XsTdh7c/w0Bqmdz3RB3YnRaKtpRtEXQ==} | ||||
|     dev: false | ||||
| 
 | ||||
|   /path-is-absolute@1.0.1: | ||||
|     resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} | ||||
|     engines: {node: '>=0.10.0'} | ||||
|     dev: false | ||||
| 
 | ||||
|   /path-parse@1.0.7: | ||||
|     resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} | ||||
|     dev: false | ||||
| 
 | ||||
|   /prettier@3.0.2: | ||||
|     resolution: {integrity: sha512-o2YR9qtniXvwEZlOKbveKfDQVyqxbEIWn48Z8m3ZJjBjcCmUy3xZGIv+7AkaeuaTr6yPXJjwv07ZWlsWbEy1rQ==} | ||||
|     engines: {node: '>=14'} | ||||
|     hasBin: true | ||||
|     dev: true | ||||
| 
 | ||||
|   /qs@6.11.2: | ||||
|     resolution: {integrity: sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==} | ||||
|     engines: {node: '>=0.6'} | ||||
|     dependencies: | ||||
|       side-channel: 1.0.4 | ||||
|     dev: false | ||||
| 
 | ||||
|   /readable-stream@3.6.2: | ||||
|     resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} | ||||
|     engines: {node: '>= 6'} | ||||
|     dependencies: | ||||
|       inherits: 2.0.4 | ||||
|       string_decoder: 1.3.0 | ||||
|       util-deprecate: 1.0.2 | ||||
|     dev: false | ||||
| 
 | ||||
|   /rechoir@0.6.2: | ||||
|     resolution: {integrity: sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==} | ||||
|     engines: {node: '>= 0.10'} | ||||
|     dependencies: | ||||
|       resolve: 1.22.4 | ||||
|     dev: false | ||||
| 
 | ||||
|   /resolve@1.22.4: | ||||
|     resolution: {integrity: sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg==} | ||||
|     hasBin: true | ||||
|     dependencies: | ||||
|       is-core-module: 2.13.0 | ||||
|       path-parse: 1.0.7 | ||||
|       supports-preserve-symlinks-flag: 1.0.0 | ||||
|     dev: false | ||||
| 
 | ||||
|   /safe-buffer@5.2.1: | ||||
|     resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} | ||||
|     dev: false | ||||
| 
 | ||||
|   /safe-stable-stringify@2.4.3: | ||||
|     resolution: {integrity: sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g==} | ||||
|     engines: {node: '>=10'} | ||||
|     dev: false | ||||
| 
 | ||||
|   /shelljs@0.8.5: | ||||
|     resolution: {integrity: sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==} | ||||
|     engines: {node: '>=4'} | ||||
|     hasBin: true | ||||
|     dependencies: | ||||
|       glob: 7.2.3 | ||||
|       interpret: 1.4.0 | ||||
|       rechoir: 0.6.2 | ||||
|     dev: false | ||||
| 
 | ||||
|   /side-channel@1.0.4: | ||||
|     resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} | ||||
|     dependencies: | ||||
|       call-bind: 1.0.2 | ||||
|       get-intrinsic: 1.2.1 | ||||
|       object-inspect: 1.12.3 | ||||
|     dev: false | ||||
| 
 | ||||
|   /simple-swizzle@0.2.2: | ||||
|     resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==} | ||||
|     dependencies: | ||||
|       is-arrayish: 0.3.2 | ||||
|     dev: false | ||||
| 
 | ||||
|   /stack-trace@0.0.10: | ||||
|     resolution: {integrity: sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==} | ||||
|     dev: false | ||||
| 
 | ||||
|   /string_decoder@1.3.0: | ||||
|     resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} | ||||
|     dependencies: | ||||
|       safe-buffer: 5.2.1 | ||||
|     dev: false | ||||
| 
 | ||||
|   /supports-preserve-symlinks-flag@1.0.0: | ||||
|     resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} | ||||
|     engines: {node: '>= 0.4'} | ||||
|     dev: false | ||||
| 
 | ||||
|   /text-hex@1.0.0: | ||||
|     resolution: {integrity: sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==} | ||||
|     dev: false | ||||
| 
 | ||||
|   /tr46@0.0.3: | ||||
|     resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} | ||||
|     dev: false | ||||
| 
 | ||||
|   /triple-beam@1.4.1: | ||||
|     resolution: {integrity: sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg==} | ||||
|     engines: {node: '>= 14.0.0'} | ||||
|     dev: false | ||||
| 
 | ||||
|   /ts-node@10.9.1(@types/node@20.5.6)(typescript@5.2.2): | ||||
|     resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==} | ||||
|     hasBin: true | ||||
|     peerDependencies: | ||||
|       '@swc/core': '>=1.2.50' | ||||
|       '@swc/wasm': '>=1.2.50' | ||||
|       '@types/node': '*' | ||||
|       typescript: '>=2.7' | ||||
|     peerDependenciesMeta: | ||||
|       '@swc/core': | ||||
|         optional: true | ||||
|       '@swc/wasm': | ||||
|         optional: true | ||||
|     dependencies: | ||||
|       '@cspotcode/source-map-support': 0.8.1 | ||||
|       '@tsconfig/node10': 1.0.9 | ||||
|       '@tsconfig/node12': 1.0.11 | ||||
|       '@tsconfig/node14': 1.0.3 | ||||
|       '@tsconfig/node16': 1.0.4 | ||||
|       '@types/node': 20.5.6 | ||||
|       acorn: 8.10.0 | ||||
|       acorn-walk: 8.2.0 | ||||
|       arg: 4.1.3 | ||||
|       create-require: 1.1.1 | ||||
|       diff: 4.0.2 | ||||
|       make-error: 1.3.6 | ||||
|       typescript: 5.2.2 | ||||
|       v8-compile-cache-lib: 3.0.1 | ||||
|       yn: 3.1.1 | ||||
|     dev: false | ||||
| 
 | ||||
|   /typescript@5.2.2: | ||||
|     resolution: {integrity: sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==} | ||||
|     engines: {node: '>=14.17'} | ||||
|     hasBin: true | ||||
|     dev: false | ||||
| 
 | ||||
|   /url-template@2.0.8: | ||||
|     resolution: {integrity: sha512-XdVKMF4SJ0nP/O7XIPB0JwAEuT9lDIYnNsK8yGVe43y0AWoKeJNdv3ZNWh7ksJ6KqQFjOO6ox/VEitLnaVNufw==} | ||||
|     dev: false | ||||
| 
 | ||||
|   /util-deprecate@1.0.2: | ||||
|     resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} | ||||
|     dev: false | ||||
| 
 | ||||
|   /uuid@9.0.0: | ||||
|     resolution: {integrity: sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==} | ||||
|     hasBin: true | ||||
|     dev: false | ||||
| 
 | ||||
|   /v8-compile-cache-lib@3.0.1: | ||||
|     resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} | ||||
|     dev: false | ||||
| 
 | ||||
|   /webidl-conversions@3.0.1: | ||||
|     resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} | ||||
|     dev: false | ||||
| 
 | ||||
|   /whatwg-url@5.0.0: | ||||
|     resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} | ||||
|     dependencies: | ||||
|       tr46: 0.0.3 | ||||
|       webidl-conversions: 3.0.1 | ||||
|     dev: false | ||||
| 
 | ||||
|   /winston-transport@4.5.0: | ||||
|     resolution: {integrity: sha512-YpZzcUzBedhlTAfJg6vJDlyEai/IFMIVcaEZZyl3UXIl4gmqRpU7AE89AHLkbzLUsv0NVmw7ts+iztqKxxPW1Q==} | ||||
|     engines: {node: '>= 6.4.0'} | ||||
|     dependencies: | ||||
|       logform: 2.5.1 | ||||
|       readable-stream: 3.6.2 | ||||
|       triple-beam: 1.4.1 | ||||
|     dev: false | ||||
| 
 | ||||
|   /winston@3.10.0: | ||||
|     resolution: {integrity: sha512-nT6SIDaE9B7ZRO0u3UvdrimG0HkB7dSTAgInQnNR2SOPJ4bvq5q79+pXLftKmP52lJGW15+H5MCK0nM9D3KB/g==} | ||||
|     engines: {node: '>= 12.0.0'} | ||||
|     dependencies: | ||||
|       '@colors/colors': 1.5.0 | ||||
|       '@dabh/diagnostics': 2.0.3 | ||||
|       async: 3.2.4 | ||||
|       is-stream: 2.0.1 | ||||
|       logform: 2.5.1 | ||||
|       one-time: 1.0.0 | ||||
|       readable-stream: 3.6.2 | ||||
|       safe-stable-stringify: 2.4.3 | ||||
|       stack-trace: 0.0.10 | ||||
|       triple-beam: 1.4.1 | ||||
|       winston-transport: 4.5.0 | ||||
|     dev: false | ||||
| 
 | ||||
|   /wrappy@1.0.2: | ||||
|     resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} | ||||
|     dev: false | ||||
| 
 | ||||
|   /yallist@4.0.0: | ||||
|     resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} | ||||
|     dev: false | ||||
| 
 | ||||
|   /yn@3.1.1: | ||||
|     resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} | ||||
|     engines: {node: '>=6'} | ||||
|     dev: false | ||||
							
								
								
									
										110
									
								
								tsconfig.json
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										110
									
								
								tsconfig.json
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,110 @@ | |||
| { | ||||
|   "compilerOptions": { | ||||
|     /* Visit https://aka.ms/tsconfig to read more about this file */ | ||||
| 
 | ||||
|     /* Projects */ | ||||
|     // "incremental": true,                              /* Save .tsbuildinfo files to allow for incremental compilation of projects. */ | ||||
|     // "composite": true,                                /* Enable constraints that allow a TypeScript project to be used with project references. */ | ||||
|     // "tsBuildInfoFile": "./.tsbuildinfo",              /* Specify the path to .tsbuildinfo incremental compilation file. */ | ||||
|     // "disableSourceOfProjectReferenceRedirect": true,  /* Disable preferring source files instead of declaration files when referencing composite projects. */ | ||||
|     // "disableSolutionSearching": true,                 /* Opt a project out of multi-project reference checking when editing. */ | ||||
|     // "disableReferencedProjectLoad": true,             /* Reduce the number of projects loaded automatically by TypeScript. */ | ||||
| 
 | ||||
|     /* Language and Environment */ | ||||
|     "target": "ES2021" /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */, | ||||
|     // "lib": [],                                        /* Specify a set of bundled library declaration files that describe the target runtime environment. */ | ||||
|     // "jsx": "preserve",                                /* Specify what JSX code is generated. */ | ||||
|     // "experimentalDecorators": true,                   /* Enable experimental support for legacy experimental decorators. */ | ||||
|     // "emitDecoratorMetadata": true,                    /* Emit design-type metadata for decorated declarations in source files. */ | ||||
|     // "jsxFactory": "",                                 /* Specify the JSX factory function used when targeting React JSX emit, e.g. 'React.createElement' or 'h'. */ | ||||
|     // "jsxFragmentFactory": "",                         /* Specify the JSX Fragment reference used for fragments when targeting React JSX emit e.g. 'React.Fragment' or 'Fragment'. */ | ||||
|     // "jsxImportSource": "",                            /* Specify module specifier used to import the JSX factory functions when using 'jsx: react-jsx*'. */ | ||||
|     // "reactNamespace": "",                             /* Specify the object invoked for 'createElement'. This only applies when targeting 'react' JSX emit. */ | ||||
|     // "noLib": true,                                    /* Disable including any library files, including the default lib.d.ts. */ | ||||
|     // "useDefineForClassFields": true,                  /* Emit ECMAScript-standard-compliant class fields. */ | ||||
|     // "moduleDetection": "auto",                        /* Control what method is used to detect module-format JS files. */ | ||||
| 
 | ||||
|     /* Modules */ | ||||
|     "module": "NodeNext" /* Specify what module code is generated. */, | ||||
|     // "rootDir": "./",                                  /* Specify the root folder within your source files. */ | ||||
|     "moduleResolution": "NodeNext" /* Specify how TypeScript looks up a file from a given module specifier. */, | ||||
|     // "baseUrl": "./",                                  /* Specify the base directory to resolve non-relative module names. */ | ||||
|     // "paths": {},                                      /* Specify a set of entries that re-map imports to additional lookup locations. */ | ||||
|     // "rootDirs": [],                                   /* Allow multiple folders to be treated as one when resolving modules. */ | ||||
|     // "typeRoots": [],                                  /* Specify multiple folders that act like './node_modules/@types'. */ | ||||
|     // "types": [],                                      /* Specify type package names to be included without being referenced in a source file. */ | ||||
|     // "allowUmdGlobalAccess": true,                     /* Allow accessing UMD globals from modules. */ | ||||
|     // "moduleSuffixes": [],                             /* List of file name suffixes to search when resolving a module. */ | ||||
|     // "allowImportingTsExtensions": true,               /* Allow imports to include TypeScript file extensions. Requires '--moduleResolution bundler' and either '--noEmit' or '--emitDeclarationOnly' to be set. */ | ||||
|     // "resolvePackageJsonExports": true,                /* Use the package.json 'exports' field when resolving package imports. */ | ||||
|     // "resolvePackageJsonImports": true,                /* Use the package.json 'imports' field when resolving imports. */ | ||||
|     // "customConditions": [],                           /* Conditions to set in addition to the resolver-specific defaults when resolving imports. */ | ||||
|     // "resolveJsonModule": true,                        /* Enable importing .json files. */ | ||||
|     // "allowArbitraryExtensions": true,                 /* Enable importing files with any extension, provided a declaration file is present. */ | ||||
|     // "noResolve": true,                                /* Disallow 'import's, 'require's or '<reference>'s from expanding the number of files TypeScript should add to a project. */ | ||||
| 
 | ||||
|     /* JavaScript Support */ | ||||
|     // "allowJs": true,                                  /* Allow JavaScript files to be a part of your program. Use the 'checkJS' option to get errors from these files. */ | ||||
|     // "checkJs": true,                                  /* Enable error reporting in type-checked JavaScript files. */ | ||||
|     // "maxNodeModuleJsDepth": 1,                        /* Specify the maximum folder depth used for checking JavaScript files from 'node_modules'. Only applicable with 'allowJs'. */ | ||||
| 
 | ||||
|     /* Emit */ | ||||
|     // "declaration": true,                              /* Generate .d.ts files from TypeScript and JavaScript files in your project. */ | ||||
|     // "declarationMap": true,                           /* Create sourcemaps for d.ts files. */ | ||||
|     // "emitDeclarationOnly": true,                      /* Only output d.ts files and not JavaScript files. */ | ||||
|     // "sourceMap": true,                                /* Create source map files for emitted JavaScript files. */ | ||||
|     // "inlineSourceMap": true,                          /* Include sourcemap files inside the emitted JavaScript. */ | ||||
|     // "outFile": "./",                                  /* Specify a file that bundles all outputs into one JavaScript file. If 'declaration' is true, also designates a file that bundles all .d.ts output. */ | ||||
|     // "outDir": "./",                                   /* Specify an output folder for all emitted files. */ | ||||
|     // "removeComments": true,                           /* Disable emitting comments. */ | ||||
|     // "noEmit": true,                                   /* Disable emitting files from a compilation. */ | ||||
|     // "importHelpers": true,                            /* Allow importing helper functions from tslib once per project, instead of including them per-file. */ | ||||
|     // "importsNotUsedAsValues": "remove",               /* Specify emit/checking behavior for imports that are only used for types. */ | ||||
|     // "downlevelIteration": true,                       /* Emit more compliant, but verbose and less performant JavaScript for iteration. */ | ||||
|     // "sourceRoot": "",                                 /* Specify the root path for debuggers to find the reference source code. */ | ||||
|     // "mapRoot": "",                                    /* Specify the location where debugger should locate map files instead of generated locations. */ | ||||
|     // "inlineSources": true,                            /* Include source code in the sourcemaps inside the emitted JavaScript. */ | ||||
|     // "emitBOM": true,                                  /* Emit a UTF-8 Byte Order Mark (BOM) in the beginning of output files. */ | ||||
|     // "newLine": "crlf",                                /* Set the newline character for emitting files. */ | ||||
|     // "stripInternal": true,                            /* Disable emitting declarations that have '@internal' in their JSDoc comments. */ | ||||
|     // "noEmitHelpers": true,                            /* Disable generating custom helper functions like '__extends' in compiled output. */ | ||||
|     // "noEmitOnError": true,                            /* Disable emitting files if any type checking errors are reported. */ | ||||
|     // "preserveConstEnums": true,                       /* Disable erasing 'const enum' declarations in generated code. */ | ||||
|     // "declarationDir": "./",                           /* Specify the output directory for generated declaration files. */ | ||||
|     // "preserveValueImports": true,                     /* Preserve unused imported values in the JavaScript output that would otherwise be removed. */ | ||||
| 
 | ||||
|     /* Interop Constraints */ | ||||
|     // "isolatedModules": true,                          /* Ensure that each file can be safely transpiled without relying on other imports. */ | ||||
|     // "verbatimModuleSyntax": true,                     /* Do not transform or elide any imports or exports not marked as type-only, ensuring they are written in the output file's format based on the 'module' setting. */ | ||||
|     // "allowSyntheticDefaultImports": true,             /* Allow 'import x from y' when a module doesn't have a default export. */ | ||||
|     "esModuleInterop": true /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables 'allowSyntheticDefaultImports' for type compatibility. */, | ||||
|     // "preserveSymlinks": true,                         /* Disable resolving symlinks to their realpath. This correlates to the same flag in node. */ | ||||
|     "forceConsistentCasingInFileNames": true /* Ensure that casing is correct in imports. */, | ||||
| 
 | ||||
|     /* Type Checking */ | ||||
|     "strict": true /* Enable all strict type-checking options. */, | ||||
|     // "noImplicitAny": true,                            /* Enable error reporting for expressions and declarations with an implied 'any' type. */ | ||||
|     // "strictNullChecks": true,                         /* When type checking, take into account 'null' and 'undefined'. */ | ||||
|     // "strictFunctionTypes": true,                      /* When assigning functions, check to ensure parameters and the return values are subtype-compatible. */ | ||||
|     // "strictBindCallApply": true,                      /* Check that the arguments for 'bind', 'call', and 'apply' methods match the original function. */ | ||||
|     // "strictPropertyInitialization": true,             /* Check for class properties that are declared but not set in the constructor. */ | ||||
|     // "noImplicitThis": true,                           /* Enable error reporting when 'this' is given the type 'any'. */ | ||||
|     // "useUnknownInCatchVariables": true,               /* Default catch clause variables as 'unknown' instead of 'any'. */ | ||||
|     // "alwaysStrict": true,                             /* Ensure 'use strict' is always emitted. */ | ||||
|     // "noUnusedLocals": true,                           /* Enable error reporting when local variables aren't read. */ | ||||
|     // "noUnusedParameters": true,                       /* Raise an error when a function parameter isn't read. */ | ||||
|     // "exactOptionalPropertyTypes": true,               /* Interpret optional property types as written, rather than adding 'undefined'. */ | ||||
|     // "noImplicitReturns": true,                        /* Enable error reporting for codepaths that do not explicitly return in a function. */ | ||||
|     // "noFallthroughCasesInSwitch": true,               /* Enable error reporting for fallthrough cases in switch statements. */ | ||||
|     // "noUncheckedIndexedAccess": true,                 /* Add 'undefined' to a type when accessed using an index. */ | ||||
|     // "noImplicitOverride": true,                       /* Ensure overriding members in derived classes are marked with an override modifier. */ | ||||
|     // "noPropertyAccessFromIndexSignature": true,       /* Enforces using indexed accessors for keys declared using an indexed type. */ | ||||
|     // "allowUnusedLabels": true,                        /* Disable error reporting for unused labels. */ | ||||
|     // "allowUnreachableCode": true,                     /* Disable error reporting for unreachable code. */ | ||||
| 
 | ||||
|     /* Completeness */ | ||||
|     // "skipDefaultLibCheck": true,                      /* Skip type checking .d.ts files that are included with TypeScript. */ | ||||
|     "skipLibCheck": true /* Skip type checking all .d.ts files. */ | ||||
|   }, | ||||
|   "ts-node": { "esm": true } | ||||
| } | ||||
		Loading…
	
	Add table
		
		Reference in a new issue