├── .gitignore ├── .npmignore ├── .yarn └── releases │ └── yarn-1.22.19.cjs ├── .yarnrc.yml ├── README.md ├── dist ├── index.js └── types │ └── options.js ├── index.ts ├── install-with-git.md ├── package.json ├── tsconfig.json ├── types └── options.ts └── yarn.lock /.gitignore: -------------------------------------------------------------------------------- 1 | ### VisualStudioCode template 2 | .vscode/* 3 | !.vscode/settings.json 4 | !.vscode/tasks.json 5 | !.vscode/launch.json 6 | !.vscode/extensions.json 7 | *.code-workspace 8 | 9 | # Local History for Visual Studio Code 10 | .history/ 11 | 12 | ### JetBrains template 13 | # Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio, WebStorm and Rider 14 | # Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839 15 | 16 | # User-specific stuff 17 | .idea/**/workspace.xml 18 | .idea/**/tasks.xml 19 | .idea/**/usage.statistics.xml 20 | .idea/**/dictionaries 21 | .idea/**/shelf 22 | .idea/ 23 | 24 | # Generated files 25 | .idea/**/contentModel.xml 26 | 27 | # Sensitive or high-churn files 28 | .idea/**/dataSources/ 29 | .idea/**/dataSources.ids 30 | .idea/**/dataSources.local.xml 31 | .idea/**/sqlDataSources.xml 32 | .idea/**/dynamic.xml 33 | .idea/**/uiDesigner.xml 34 | .idea/**/dbnavigator.xml 35 | 36 | # Gradle 37 | .idea/**/gradle.xml 38 | .idea/**/libraries 39 | 40 | # Gradle and Maven with auto-import 41 | # When using Gradle or Maven with auto-import, you should exclude module files, 42 | # since they will be recreated, and may cause churn. Uncomment if using 43 | # auto-import. 44 | # .idea/artifacts 45 | # .idea/compiler.xml 46 | # .idea/jarRepositories.xml 47 | # .idea/modules.xml 48 | # .idea/*.iml 49 | # .idea/modules 50 | # *.iml 51 | # *.ipr 52 | 53 | # CMake 54 | cmake-build-*/ 55 | 56 | # Mongo Explorer plugin 57 | .idea/**/mongoSettings.xml 58 | 59 | # File-based project format 60 | *.iws 61 | 62 | # IntelliJ 63 | out/ 64 | 65 | # mpeltonen/sbt-idea plugin 66 | .idea_modules/ 67 | 68 | # JIRA plugin 69 | atlassian-ide-plugin.xml 70 | 71 | # Cursive Clojure plugin 72 | .idea/replstate.xml 73 | 74 | # Crashlytics plugin (for Android Studio and IntelliJ) 75 | com_crashlytics_export_strings.xml 76 | crashlytics.properties 77 | crashlytics-build.properties 78 | fabric.properties 79 | 80 | # Editor-based Rest Client 81 | .idea/httpRequests 82 | 83 | # Android studio 3.1+ serialized cache file 84 | .idea/caches/build_file_checksums.ser 85 | 86 | ### Node template 87 | # Logs 88 | logs 89 | *.log 90 | npm-debug.log* 91 | yarn-debug.log* 92 | yarn-error.log* 93 | lerna-debug.log* 94 | 95 | # Diagnostic reports (https://nodejs.org/api/report.html) 96 | report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json 97 | 98 | # Runtime data 99 | pids 100 | *.pid 101 | *.seed 102 | *.pid.lock 103 | 104 | # Directory for instrumented libs generated by jscoverage/JSCover 105 | lib-cov 106 | 107 | # Coverage directory used by tools like istanbul 108 | coverage 109 | *.lcov 110 | 111 | # nyc test coverage 112 | .nyc_output 113 | 114 | # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) 115 | .grunt 116 | 117 | # Bower dependency directory (https://bower.io/) 118 | bower_components 119 | 120 | # node-waf configuration 121 | .lock-wscript 122 | 123 | # Compiled binary addons (https://nodejs.org/api/addons.html) 124 | build/Release 125 | 126 | # Dependency directories 127 | node_modules/ 128 | jspm_packages/ 129 | 130 | # Snowpack dependency directory (https://snowpack.dev/) 131 | web_modules/ 132 | 133 | # TypeScript cache 134 | *.tsbuildinfo 135 | 136 | # Optional npm cache directory 137 | .npm 138 | 139 | # Optional eslint cache 140 | .eslintcache 141 | 142 | # Microbundle cache 143 | .rpt2_cache/ 144 | .rts2_cache_cjs/ 145 | .rts2_cache_es/ 146 | .rts2_cache_umd/ 147 | 148 | # Optional REPL history 149 | .node_repl_history 150 | 151 | # Output of 'npm pack' 152 | *.tgz 153 | 154 | # Yarn Integrity file 155 | .yarn-integrity 156 | 157 | # dotenv environment variables file 158 | .env 159 | .env.test 160 | 161 | # parcel-bundler cache (https://parceljs.org/) 162 | .cache 163 | .parcel-cache 164 | 165 | # Next.js build output 166 | .next 167 | out 168 | 169 | # Nuxt.js build / generate output 170 | .nuxt 171 | 172 | # Gatsby files 173 | .cache/ 174 | # Comment in the public line in if your project uses Gatsby and not Next.js 175 | # https://nextjs.org/blog/next-9-1#public-directory-support 176 | # public 177 | 178 | 179 | # Serverless directories 180 | .serverless/ 181 | 182 | # FuseBox cache 183 | .fusebox/ 184 | 185 | # DynamoDB Local files 186 | .dynamodb/ 187 | 188 | # TernJS port file 189 | .tern-port 190 | 191 | # Stores VSCode versions used for testing VSCode extensions 192 | .vscode-test 193 | 194 | # yarn v2 195 | .yarn/cache 196 | .yarn/unplugged 197 | .yarn/build-state.yml 198 | .yarn/install-state.gz 199 | .pnp.* 200 | 201 | ### Windows template 202 | # Windows thumbnail cache files 203 | Thumbs.db 204 | Thumbs.db:encryptable 205 | ehthumbs.db 206 | ehthumbs_vista.db 207 | 208 | # Dump file 209 | *.stackdump 210 | 211 | # Folder config file 212 | [Dd]esktop.ini 213 | 214 | # Recycle Bin used on file shares 215 | $RECYCLE.BIN/ 216 | 217 | # Windows Installer files 218 | *.cab 219 | *.msi 220 | *.msix 221 | *.msm 222 | *.msp 223 | 224 | # Windows shortcuts 225 | *.lnk 226 | 227 | -------------------------------------------------------------------------------- /.npmignore: -------------------------------------------------------------------------------- 1 | out/ 2 | .idea/ 3 | .yarn/ 4 | README.md 5 | install-with-git.md 6 | -------------------------------------------------------------------------------- /.yarnrc.yml: -------------------------------------------------------------------------------- 1 | yarnPath: .yarn/releases/yarn-1.22.19.cjs 2 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Community Dragon Directory Downloader 2 | [![NPM Version](https://img.shields.io/npm/v/cdragon-dd.svg?style=flat-square)](https://www.npmjs.com/package/cdragon-dd) [![NPM Version](https://img.shields.io/npm/dm/cdragon-dd.svg?style=flat-square)](https://www.npmjs.com/package/cdragon-dd) 3 | Download directories from community dragon's cdn 4 | 5 | 6 | ## IMPORTANT 7 | Your urls must end in a "/" you should just copy and paste your urls into the command line 8 | 9 | ## Usage 10 | 11 | You can either download and run a prebuilt binary from the [releases tab](https://github.com/Hi-Ray/cd-dd/releases) or install the package via npmjs. 12 | If you want to install this package without npmjs, please read the documentation [here](https://github.com/Hi-Ray/cd-dd/blob/master/install-with-git.md). 13 | ```shell 14 | > npm i cdragon-dd # install the package for your current project 15 | > npm i cdragon-dd -g # install the package as a global CLI tool 16 | > cd-dd [...flags] 17 | ``` 18 | 19 | ## Usage example 20 | 21 | Download all the files in the directory (URL). 22 | ```shell 23 | > cd-dd https://raw.communitydragon.org/latest/game/data/images/ 24 | ``` 25 | 26 | Download all the files in the directory (URL) and its subdirectories (recursive). 27 | ```shell 28 | > cd-dd -r https://raw.communitydragon.org/latest/game/data/images/ 29 | ``` 30 | 31 | Download all the files in the directory (URL) and its subdirectories (recursive) into the local directory `./data`. 32 | ```shell 33 | > cd-dd -o ./data -r https://raw.communitydragon.org/latest/game/data/images/ 34 | ``` 35 | 36 | Download all the files in the directory (URL) and don't cache results. 37 | ```shell 38 | > cd-dd -k replace -r https://raw.communitydragon.org/latest/game/data/images/ 39 | > cd-dd -k nothing -r https://raw.communitydragon.org/latest/game/data/images/ 40 | ``` 41 | 42 | ## Flags 43 | ``` 44 | Usage: cd-dd [options] 45 | 46 | Arguments: 47 | URL URL starting with https:// 48 | 49 | Options: 50 | -o, --output Output directory location. Default is ./out 51 | -r, --recursive Recursively download directory and files 52 | -k, --keep-files [mode] Keep files if they already exist in the output directory (choices: "all", "replace", "nothing", default: "all") 53 | -V, --version output the version number 54 | -h, --help display help for command 55 | ``` 56 | 57 | ## How does caching work? 58 | When the keep-files flag is set to "all" or "replace", a `.cddd` file will be created in every downloaded directory which holds a compressed version of the downloaded files which can identify whether a the current version of the file was already downloaded or not. 59 | 60 | If the keep-files flag is set to "all", existing valid files not be downloaded nor replaced. 61 | If the keep-files flag is set to "replace" existing files are downloaded and replaced and a .cddd cache file will be created but ignored. 62 | In the keep-files "nothing" mode, the .cddd flag is not created. Use this mode only if you are sure you are not going to download the same data twice at any point. 63 | -------------------------------------------------------------------------------- /dist/index.js: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | "use strict"; 3 | var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { 4 | if (k2 === undefined) k2 = k; 5 | var desc = Object.getOwnPropertyDescriptor(m, k); 6 | if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { 7 | desc = { enumerable: true, get: function() { return m[k]; } }; 8 | } 9 | Object.defineProperty(o, k2, desc); 10 | }) : (function(o, m, k, k2) { 11 | if (k2 === undefined) k2 = k; 12 | o[k2] = m[k]; 13 | })); 14 | var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { 15 | Object.defineProperty(o, "default", { enumerable: true, value: v }); 16 | }) : function(o, v) { 17 | o["default"] = v; 18 | }); 19 | var __importStar = (this && this.__importStar) || function (mod) { 20 | if (mod && mod.__esModule) return mod; 21 | var result = {}; 22 | if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); 23 | __setModuleDefault(result, mod); 24 | return result; 25 | }; 26 | var __importDefault = (this && this.__importDefault) || function (mod) { 27 | return (mod && mod.__esModule) ? mod : { "default": mod }; 28 | }; 29 | Object.defineProperty(exports, "__esModule", { value: true }); 30 | const axios_1 = __importDefault(require("axios")); 31 | const commander_1 = require("commander"); 32 | const tracer_1 = require("tracer"); 33 | const https_1 = __importDefault(require("https")); 34 | const fs_1 = __importStar(require("fs")); 35 | const path_1 = __importDefault(require("path")); 36 | const zlib_1 = require("zlib"); 37 | const logger = (0, tracer_1.colorConsole)(); 38 | const downloadFile = async (url, filepath) => { 39 | return new Promise((resolve, reject) => { 40 | https_1.default.get(url, (res) => { 41 | if (res.statusCode === 200) { 42 | res.pipe(fs_1.default.createWriteStream(filepath)) 43 | .on("error", reject) 44 | .once("close", () => resolve(filepath)); 45 | } 46 | else { 47 | res.resume(); 48 | reject(new Error(`Request ${url} Failed With a Status Code: ${res.statusCode}`)); 49 | } 50 | }); 51 | }); 52 | }; 53 | const downloadDirectory = async (URL, options, currentPath = '') => { 54 | const basePath = path_1.default.resolve(process.env.INIT_CWD ?? process.cwd() ?? "./", options.output ?? "out"); 55 | const additionalPath = path_1.default.resolve(basePath, currentPath); 56 | if (options.keepFiles === true) 57 | options.keepFiles = 'all'; 58 | if (!URL.includes('communitydragon.org')) { 59 | logger.fatal('URL is not a valid CommunityDragon link.'); 60 | return; 61 | } 62 | if (!URL.endsWith('/')) { 63 | logger.fatal('URL is not a directory. URLs must end in a / to be a valid directory.'); 64 | return; 65 | } 66 | let startingStr = URL; 67 | if (URL.startsWith('https://')) { 68 | startingStr = URL.split('//')[1]; 69 | } 70 | let removeCdrag = startingStr.split('/'); 71 | let domain = removeCdrag[0]; 72 | removeCdrag.shift(); 73 | removeCdrag.unshift(domain, 'json'); 74 | let jsonifiedString = `https://${removeCdrag.join('/')}`; 75 | if (basePath === additionalPath) { 76 | if (!(0, fs_1.existsSync)(basePath)) { 77 | (0, fs_1.mkdirSync)(basePath, { recursive: true }); 78 | } 79 | else { 80 | logger.info(`The directory ${basePath} already exists. This can result in you writing files to a folder that already has other content in it. If that is intended, you are safe to ignore this warning.`); 81 | } 82 | } 83 | axios_1.default.get(jsonifiedString).then(async ({ data }) => { 84 | logger.info(`data length: ${data.length}`); 85 | if (options.keepFiles === 'all' && (0, fs_1.existsSync)(`${additionalPath}/.cddd`)) { 86 | const file = (0, fs_1.openSync)(`${additionalPath}/.cddd`, 'r'); 87 | const content = (0, fs_1.readFileSync)(file); 88 | (0, fs_1.closeSync)(file); 89 | const files = JSON.parse((0, zlib_1.gunzipSync)(content).toString('utf-8')); 90 | let index = 0; 91 | files.forEach((file) => { 92 | const fileName = file[0]; 93 | const fileAge = file[1]; 94 | for (let i = index; i < data.length; i++) { 95 | if (data[i].name === fileName) { 96 | index = i; 97 | if (fileAge === Math.floor(new Date(data[i].mtime).getTime() / 1000) 98 | && data[i].type !== 'directory' && (0, fs_1.existsSync)(`${basePath}/${currentPath}${data[i].name}`)) { 99 | data[i].fetch = false; 100 | } 101 | break; 102 | } 103 | } 104 | }); 105 | } 106 | for (let i = 0; i < data.length; i++) { 107 | if (data[i].type === 'directory') { 108 | if (!options.recursive || data[i].fetch === false) { 109 | data[i] = []; 110 | continue; 111 | } 112 | try { 113 | (0, fs_1.mkdirSync)(`${basePath}/${currentPath}${data[i].name}`); 114 | logger.info(`created ${basePath}/${currentPath}${data[i].name}`); 115 | } 116 | catch (e) { 117 | logger.info(`Directory ${basePath}/${currentPath}${data[i].name} exists already`); 118 | } 119 | try { 120 | await downloadDirectory(`${URL}${data[i].name}/`, options, currentPath + data[i].name + '/'); 121 | logger.info(`Downloaded ${currentPath + data[i].name + '/'}`); 122 | } 123 | catch (e) { 124 | logger.error(`Failed to download: ${currentPath + data[i].name + '/'}`); 125 | } 126 | data[i] = []; 127 | } 128 | else { 129 | if (data[i].fetch !== false) { 130 | try { 131 | await downloadFile(`${URL}${data[i].name}`, `${basePath}/${currentPath + data[i].name}`); 132 | logger.info(`Downloaded ${basePath}/${currentPath + data[i].name}`); 133 | } 134 | catch (e) { 135 | logger.error(`Failed to download: ${basePath}/${currentPath + data[i].name}`); 136 | } 137 | } 138 | data[i] = [data[i].name, Math.floor(new Date(data[i].mtime).getTime() / 1000)]; 139 | } 140 | } 141 | data = data.filter((n) => n.length); 142 | if (data.length > 0 && options.keepFiles !== 'nothing') { 143 | const file = (0, fs_1.openSync)(`${additionalPath}/.cddd`, 'w+'); 144 | (0, fs_1.writeFileSync)(file, (0, zlib_1.gzipSync)(JSON.stringify(data))); 145 | (0, fs_1.closeSync)(file); 146 | } 147 | }); 148 | }; 149 | const program = (new commander_1.Command()) 150 | .argument('', 'URL starting with https://') 151 | .option('-o, --output ', 'Output directory location. Default is ./out') 152 | .option('-r, --recursive', 'Recursively download directory and files') 153 | .addOption(new commander_1.Option('-k, --keep-files [mode]', 'Keep files if they already exist in the output directory').choices(['all', 'replace', 'nothing']).default("all")) 154 | .action((url, options) => downloadDirectory(url, options)) 155 | .version('1.0.0'); 156 | program.parse(); 157 | -------------------------------------------------------------------------------- /dist/types/options.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | Object.defineProperty(exports, "__esModule", { value: true }); 3 | ; 4 | -------------------------------------------------------------------------------- /index.ts: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | import Axios from "axios"; 3 | 4 | import { Command, Option } from "commander"; 5 | import { colorConsole } from "tracer"; 6 | import client from "https"; 7 | import fs, { mkdirSync, writeFileSync, existsSync, openSync, readFileSync, closeSync } from 'fs' 8 | import { options } from "./types/options"; 9 | import path from "path"; 10 | import { gunzipSync, gzipSync } from "zlib"; 11 | 12 | const logger = colorConsole() 13 | 14 | const downloadFile = async (url: string, filepath: string) => { 15 | return new Promise((resolve, reject) => { 16 | client.get(url, (res) => { 17 | if (res.statusCode === 200) { 18 | res.pipe(fs.createWriteStream(filepath)) 19 | .on("error", reject) 20 | .once("close", () => resolve(filepath)); 21 | } else { 22 | // Consume response data to free up memory 23 | res.resume(); 24 | reject(new Error(`Request ${url} Failed With a Status Code: ${res.statusCode}`)); 25 | } 26 | }); 27 | }); 28 | }; 29 | 30 | const downloadDirectory = async (URL: string, options: options, currentPath: string = '') => { 31 | const basePath = path.resolve(process.env.INIT_CWD ?? process.cwd() ?? "./", options.output ?? "out"); 32 | const additionalPath = path.resolve(basePath, currentPath); 33 | if (options.keepFiles === true) options.keepFiles = 'all'; 34 | 35 | // Check if it's a community dragon link 36 | if (!URL.includes('communitydragon.org')) { 37 | logger.fatal('URL is not a valid CommunityDragon link.') 38 | return 39 | } 40 | 41 | // Check if it's a directory 42 | if (!URL.endsWith('/')) { 43 | logger.fatal('URL is not a directory. URLs must end in a / to be a valid directory.') 44 | return 45 | } 46 | 47 | // For now set a default 48 | let startingStr = URL; 49 | 50 | // Strip the "https://" 51 | if (URL.startsWith('https://')) { 52 | startingStr = URL.split('//')[1] 53 | } 54 | 55 | // remove Community dragon temporarily 56 | let removeCdrag = startingStr.split('/') 57 | let domain = removeCdrag[0]; 58 | 59 | removeCdrag.shift() 60 | 61 | // Re add the raw link with the json token 62 | removeCdrag.unshift(domain, 'json') 63 | 64 | // Add back in 65 | let jsonifiedString = `https://${removeCdrag.join('/')}` 66 | 67 | // Make a dir 68 | if (basePath === additionalPath) { 69 | if (!existsSync(basePath)) { 70 | mkdirSync(basePath, { recursive: true }) 71 | } else { 72 | logger.info(`The directory ${basePath} already exists. This can result in you writing files to a folder that already has other content in it. If that is intended, you are safe to ignore this warning.`) 73 | } 74 | } 75 | 76 | // Download le files. 77 | Axios.get(jsonifiedString).then(async ({ data }) => { 78 | logger.info(`data length: ${data.length}`) 79 | 80 | // Read content of caching file 81 | if (options.keepFiles === 'all' && existsSync(`${additionalPath}/.cddd`)) { 82 | const file = openSync(`${additionalPath}/.cddd`, 'r'); 83 | const content = readFileSync(file); 84 | closeSync(file); 85 | const files = JSON.parse(gunzipSync(content).toString('utf-8')); 86 | 87 | // Loop through the cached files and compare them to the live version 88 | let index = 0; 89 | files.forEach((file: Array) => { 90 | const fileName = file[0] as string; 91 | const fileAge = file[1] as number; 92 | for (let i = index; i < data.length; i++) { 93 | if (data[i].name === fileName) { 94 | index = i; 95 | if (fileAge === Math.floor(new Date(data[i].mtime).getTime() / 1000) 96 | && data[i].type !== 'directory' && existsSync(`${basePath}/${currentPath}${data[i].name}`)) { 97 | data[i].fetch = false; 98 | } 99 | break; 100 | } 101 | } 102 | }); 103 | } 104 | 105 | for (let i = 0; i < data.length; i++) { 106 | // If is directory recursively download 107 | if (data[i].type === 'directory') { 108 | if (!options.recursive || data[i].fetch === false) { 109 | // Skip directory when recursive download is not enabled 110 | data[i] = []; 111 | continue; 112 | } 113 | try { 114 | // Create directory 115 | mkdirSync(`${basePath}/${currentPath}${data[i].name}`) 116 | logger.info(`created ${basePath}/${currentPath}${data[i].name}`) 117 | } catch (e) { 118 | // Error incase directory exists 119 | logger.info(`Directory ${basePath}/${currentPath}${data[i].name} exists already`) 120 | } 121 | // Download the files in the directory 122 | try { 123 | await downloadDirectory(`${URL}${encodeURIComponent(data[i].name)}/`, options, currentPath + data[i].name + '/') 124 | logger.info(`Downloaded ${currentPath + data[i].name + '/'}`) 125 | } catch (e) { 126 | logger.error(`Failed to download: ${currentPath + data[i].name + '/'}`) 127 | } 128 | data[i] = []; 129 | } else { 130 | if (data[i].fetch !== false) { 131 | // Download the file 132 | try { 133 | await downloadFile(`${URL}${encodeURIComponent(data[i].name)}`, `${basePath}/${currentPath + data[i].name}`); 134 | logger.info(`Downloaded ${basePath}/${currentPath + data[i].name}`); 135 | } catch (e) { 136 | logger.error(`Failed to download: ${basePath}/${currentPath + data[i].name}`) 137 | } 138 | } 139 | data[i] = [data[i].name, Math.floor(new Date(data[i].mtime).getTime() / 1000)] 140 | 141 | } 142 | } 143 | 144 | // write compressed caching file to folder 145 | data = data.filter((n: any) => n.length) 146 | if (data.length > 0 && options.keepFiles !== 'nothing') { 147 | const file = openSync(`${additionalPath}/.cddd`, 'w+'); 148 | writeFileSync(file, gzipSync(JSON.stringify(data))); 149 | closeSync(file); 150 | } 151 | 152 | }) 153 | } 154 | 155 | const program = (new Command()) 156 | .argument('', 'URL starting with https://') 157 | .option('-o, --output ', 'Output directory location. Default is ./out') 158 | .option('-r, --recursive', 'Recursively download directory and files') 159 | .addOption(new Option('-k, --keep-files [mode]', 'Keep files if they already exist in the output directory').choices(['all', 'replace', 'nothing']).default("all")) 160 | .action((url: string, options: options) => downloadDirectory(url, options)) 161 | .version('1.0.0'); 162 | 163 | // Parse the CLI 164 | program.parse() 165 | -------------------------------------------------------------------------------- /install-with-git.md: -------------------------------------------------------------------------------- 1 | # Community Dragon Directory Downloader 2 | Download directories from community dragon's cdn 3 | 4 | ## IMPORTANT 5 | Your urls must end in a "/" you should just copy and paste your urls into the command line 6 | 7 | ## Requirements 8 | - Git 9 | - Nodejs 10 | - Yarn (Optional but recommended) 11 | 12 | ## Usage 13 | ```shell 14 | > git clone https://github.com/Hi-Ray/cd-dd.git 15 | > yarn # or you can use "npm install" 16 | > yarn start [...flags] # or "npm start [...flags]" 17 | ``` 18 | 19 | ## Usage example 20 | 21 | Download all the files in the directory (URL). 22 | ```shell 23 | > yarn start https://raw.communitydragon.org/latest/game/data/images/ 24 | ``` 25 | 26 | Download all the files in the directory (URL) and its subdirectories (recursive). 27 | ```shell 28 | > yarn start -r https://raw.communitydragon.org/latest/game/data/images/ 29 | ``` 30 | 31 | Download all the files in the directory (URL) and its subdirectories (recursive) into the local directory `./data`. 32 | ```shell 33 | > yarn start -o ./data -r https://raw.communitydragon.org/latest/game/data/images/ 34 | ``` 35 | 36 | Download all the files in the directory (URL) and don't cache results. 37 | ```shell 38 | > yarn start -k replace -r https://raw.communitydragon.org/latest/game/data/images/ 39 | > yarn start -k nothing -r https://raw.communitydragon.org/latest/game/data/images/ 40 | ``` 41 | 42 | ## Flags 43 | ``` 44 | Usage: yarn start [options] 45 | 46 | Arguments: 47 | URL URL starting with https:// 48 | 49 | Options: 50 | -o, --output Output directory location. Default is ./out 51 | -r, --recursive Recursively download directory and files 52 | -k, --keep-files [mode] Keep files if they already exist in the output directory (choices: "all", "replace", "nothing", default: "all") 53 | -V, --version output the version number 54 | -h, --help display help for command 55 | ``` 56 | 57 | ## How does caching work? 58 | When the keep-files flag is set to "all" or "replace", a `.cddd` file will be created in every downloaded directory which holds a compressed version of the downloaded files which can identify whether a the current version of the file was already downloaded or not. 59 | 60 | If the keep-files flag is set to "all", existing valid files not be downloaded nor replaced. 61 | If the keep-files flag is set to "replace" existing files are downloaded and replaced and a .cddd cache file will be created but ignored. 62 | In the keep-files "nothing" mode, the .cddd flag is not created. Use this mode only if you are sure you are not going to download the same data twice at any point. -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "cdragon-dd", 3 | "version": "2.0.8", 4 | "license": "MIT", 5 | "main": "dist/index.js", 6 | "bin": { 7 | "cd-dd": "dist/index.js" 8 | }, 9 | "repository": { 10 | "type": "git", 11 | "url": "https://github.com/Hi-Ray/cd-dd.git" 12 | }, 13 | "scripts": { 14 | "start": "ts-node index.ts", 15 | "build": "tsc -p .", 16 | "test": "echo \"No test specified\"" 17 | }, 18 | "dependencies": { 19 | "axios": "^0.27.2", 20 | "commander": "^9.2.0", 21 | "tracer": "^1.1.5" 22 | }, 23 | "devDependencies": { 24 | "@types/node": "^17.0.31", 25 | "ts-node": "^10.7.0", 26 | "ts-node-dev": "^1.1.8", 27 | "typescript": "^4.6.4" 28 | }, 29 | "packageManager": "yarn@1.22.19" 30 | } 31 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | /* Visit https://aka.ms/tsconfig.json to read more about this file */ 4 | 5 | /* Projects */ 6 | // "incremental": true, /* Enable incremental compilation */ 7 | // "composite": true, /* Enable constraints that allow a TypeScript project to be used with project references. */ 8 | // "tsBuildInfoFile": "./", /* Specify the folder for .tsbuildinfo incremental compilation files. */ 9 | // "disableSourceOfProjectReferenceRedirect": true, /* Disable preferring source files instead of declaration files when referencing composite projects */ 10 | // "disableSolutionSearching": true, /* Opt a project out of multi-project reference checking when editing. */ 11 | // "disableReferencedProjectLoad": true, /* Reduce the number of projects loaded automatically by TypeScript. */ 12 | 13 | /* Language and Environment */ 14 | "target": "esnext", /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */ 15 | // "lib": [], /* Specify a set of bundled library declaration files that describe the target runtime environment. */ 16 | // "jsx": "preserve", /* Specify what JSX code is generated. */ 17 | // "experimentalDecorators": true, /* Enable experimental support for TC39 stage 2 draft decorators. */ 18 | // "emitDecoratorMetadata": true, /* Emit design-type metadata for decorated declarations in source files. */ 19 | // "jsxFactory": "", /* Specify the JSX factory function used when targeting React JSX emit, e.g. 'React.createElement' or 'h' */ 20 | // "jsxFragmentFactory": "", /* Specify the JSX Fragment reference used for fragments when targeting React JSX emit e.g. 'React.Fragment' or 'Fragment'. */ 21 | // "jsxImportSource": "", /* Specify module specifier used to import the JSX factory functions when using `jsx: react-jsx*`.` */ 22 | // "reactNamespace": "", /* Specify the object invoked for `createElement`. This only applies when targeting `react` JSX emit. */ 23 | // "noLib": true, /* Disable including any library files, including the default lib.d.ts. */ 24 | // "useDefineForClassFields": true, /* Emit ECMAScript-standard-compliant class fields. */ 25 | 26 | /* Modules */ 27 | "module": "commonjs", /* Specify what module code is generated. */ 28 | // "rootDir": "./", /* Specify the root folder within your source files. */ 29 | "moduleResolution": "node", /* Specify how TypeScript looks up a file from a given module specifier. */ 30 | // "baseUrl": "./", /* Specify the base directory to resolve non-relative module names. */ 31 | // "paths": {}, /* Specify a set of entries that re-map imports to additional lookup locations. */ 32 | // "rootDirs": [], /* Allow multiple folders to be treated as one when resolving modules. */ 33 | // "typeRoots": [], /* Specify multiple folders that act like `./node_modules/@types`. */ 34 | // "types": [], /* Specify type package names to be included without being referenced in a source file. */ 35 | // "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */ 36 | "resolveJsonModule": true, /* Enable importing .json files */ 37 | // "noResolve": true, /* Disallow `import`s, `require`s or ``s from expanding the number of files TypeScript should add to a project. */ 38 | 39 | /* JavaScript Support */ 40 | // "allowJs": true, /* Allow JavaScript files to be a part of your program. Use the `checkJS` option to get errors from these files. */ 41 | // "checkJs": true, /* Enable error reporting in type-checked JavaScript files. */ 42 | // "maxNodeModuleJsDepth": 1, /* Specify the maximum folder depth used for checking JavaScript files from `node_modules`. Only applicable with `allowJs`. */ 43 | 44 | /* Emit */ 45 | // "declaration": true, /* Generate .d.ts files from TypeScript and JavaScript files in your project. */ 46 | // "declarationMap": true, /* Create sourcemaps for d.ts files. */ 47 | // "emitDeclarationOnly": true, /* Only output d.ts files and not JavaScript files. */ 48 | // "sourceMap": true, /* Create source map files for emitted JavaScript files. */ 49 | // "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. */ 50 | "outDir": "./dist", /* Specify an output folder for all emitted files. */ 51 | "removeComments": true, /* Disable emitting comments. */ 52 | // "noEmit": true, /* Disable emitting files from a compilation. */ 53 | // "importHelpers": true, /* Allow importing helper functions from tslib once per project, instead of including them per-file. */ 54 | // "importsNotUsedAsValues": "remove", /* Specify emit/checking behavior for imports that are only used for types */ 55 | // "downlevelIteration": true, /* Emit more compliant, but verbose and less performant JavaScript for iteration. */ 56 | // "sourceRoot": "", /* Specify the root path for debuggers to find the reference source code. */ 57 | // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */ 58 | // "inlineSourceMap": true, /* Include sourcemap files inside the emitted JavaScript. */ 59 | // "inlineSources": true, /* Include source code in the sourcemaps inside the emitted JavaScript. */ 60 | // "emitBOM": true, /* Emit a UTF-8 Byte Order Mark (BOM) in the beginning of output files. */ 61 | // "newLine": "crlf", /* Set the newline character for emitting files. */ 62 | // "stripInternal": true, /* Disable emitting declarations that have `@internal` in their JSDoc comments. */ 63 | // "noEmitHelpers": true, /* Disable generating custom helper functions like `__extends` in compiled output. */ 64 | // "noEmitOnError": true, /* Disable emitting files if any type checking errors are reported. */ 65 | // "preserveConstEnums": true, /* Disable erasing `const enum` declarations in generated code. */ 66 | // "declarationDir": "./", /* Specify the output directory for generated declaration files. */ 67 | // "preserveValueImports": true, /* Preserve unused imported values in the JavaScript output that would otherwise be removed. */ 68 | 69 | /* Interop Constraints */ 70 | "isolatedModules": true, /* Ensure that each file can be safely transpiled without relying on other imports. */ 71 | "allowSyntheticDefaultImports": true, /* Allow 'import x from y' when a module doesn't have a default export. */ 72 | "esModuleInterop": true, /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables `allowSyntheticDefaultImports` for type compatibility. */ 73 | // "preserveSymlinks": true, /* Disable resolving symlinks to their realpath. This correlates to the same flag in node. */ 74 | "forceConsistentCasingInFileNames": true, /* Ensure that casing is correct in imports. */ 75 | 76 | /* Type Checking */ 77 | "strict": true, /* Enable all strict type-checking options. */ 78 | // "noImplicitAny": true, /* Enable error reporting for expressions and declarations with an implied `any` type.. */ 79 | // "strictNullChecks": true, /* When type checking, take into account `null` and `undefined`. */ 80 | // "strictFunctionTypes": true, /* When assigning functions, check to ensure parameters and the return values are subtype-compatible. */ 81 | // "strictBindCallApply": true, /* Check that the arguments for `bind`, `call`, and `apply` methods match the original function. */ 82 | // "strictPropertyInitialization": true, /* Check for class properties that are declared but not set in the constructor. */ 83 | // "noImplicitThis": true, /* Enable error reporting when `this` is given the type `any`. */ 84 | // "useUnknownInCatchVariables": true, /* Type catch clause variables as 'unknown' instead of 'any'. */ 85 | // "alwaysStrict": true, /* Ensure 'use strict' is always emitted. */ 86 | // "noUnusedLocals": true, /* Enable error reporting when a local variables aren't read. */ 87 | // "noUnusedParameters": true, /* Raise an error when a function parameter isn't read */ 88 | // "exactOptionalPropertyTypes": true, /* Interpret optional property types as written, rather than adding 'undefined'. */ 89 | // "noImplicitReturns": true, /* Enable error reporting for codepaths that do not explicitly return in a function. */ 90 | // "noFallthroughCasesInSwitch": true, /* Enable error reporting for fallthrough cases in switch statements. */ 91 | // "noUncheckedIndexedAccess": true, /* Include 'undefined' in index signature results */ 92 | // "noImplicitOverride": true, /* Ensure overriding members in derived classes are marked with an override modifier. */ 93 | // "noPropertyAccessFromIndexSignature": true, /* Enforces using indexed accessors for keys declared using an indexed type */ 94 | // "allowUnusedLabels": true, /* Disable error reporting for unused labels. */ 95 | // "allowUnreachableCode": true, /* Disable error reporting for unreachable code. */ 96 | 97 | /* Completeness */ 98 | // "skipDefaultLibCheck": true, /* Skip type checking .d.ts files that are included with TypeScript. */ 99 | "skipLibCheck": true /* Skip type checking all .d.ts files. */ 100 | } 101 | } 102 | -------------------------------------------------------------------------------- /types/options.ts: -------------------------------------------------------------------------------- 1 | export interface options { 2 | output: string | undefined; 3 | recursive: boolean | undefined; 4 | keepFiles: 'all' | 'replace' | 'nothing' | boolean; 5 | }; -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@cspotcode/source-map-support@^0.8.0": 6 | version "0.8.1" 7 | resolved "https://registry.yarnpkg.com/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz#00629c35a688e05a88b1cda684fb9d5e73f000a1" 8 | integrity sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw== 9 | dependencies: 10 | "@jridgewell/trace-mapping" "0.3.9" 11 | 12 | "@jridgewell/resolve-uri@^3.0.3": 13 | version "3.1.1" 14 | resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz#c08679063f279615a3326583ba3a90d1d82cc721" 15 | integrity sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA== 16 | 17 | "@jridgewell/sourcemap-codec@^1.4.10": 18 | version "1.4.15" 19 | resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" 20 | integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== 21 | 22 | "@jridgewell/trace-mapping@0.3.9": 23 | version "0.3.9" 24 | resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz#6534fd5933a53ba7cbf3a17615e273a0d1273ff9" 25 | integrity sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ== 26 | dependencies: 27 | "@jridgewell/resolve-uri" "^3.0.3" 28 | "@jridgewell/sourcemap-codec" "^1.4.10" 29 | 30 | "@tsconfig/node10@^1.0.7": 31 | version "1.0.9" 32 | resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.9.tgz#df4907fc07a886922637b15e02d4cebc4c0021b2" 33 | integrity sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA== 34 | 35 | "@tsconfig/node12@^1.0.7": 36 | version "1.0.11" 37 | resolved "https://registry.yarnpkg.com/@tsconfig/node12/-/node12-1.0.11.tgz#ee3def1f27d9ed66dac6e46a295cffb0152e058d" 38 | integrity sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag== 39 | 40 | "@tsconfig/node14@^1.0.0": 41 | version "1.0.3" 42 | resolved "https://registry.yarnpkg.com/@tsconfig/node14/-/node14-1.0.3.tgz#e4386316284f00b98435bf40f72f75a09dabf6c1" 43 | integrity sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow== 44 | 45 | "@tsconfig/node16@^1.0.2": 46 | version "1.0.4" 47 | resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.4.tgz#0b92dcc0cc1c81f6f306a381f28e31b1a56536e9" 48 | integrity sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA== 49 | 50 | "@types/node@^17.0.31": 51 | version "17.0.45" 52 | resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.45.tgz#2c0fafd78705e7a18b7906b5201a522719dc5190" 53 | integrity sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw== 54 | 55 | "@types/strip-bom@^3.0.0": 56 | version "3.0.0" 57 | resolved "https://registry.yarnpkg.com/@types/strip-bom/-/strip-bom-3.0.0.tgz#14a8ec3956c2e81edb7520790aecf21c290aebd2" 58 | integrity sha512-xevGOReSYGM7g/kUBZzPqCrR/KYAo+F0yiPc85WFTJa0MSLtyFTVTU6cJu/aV4mid7IffDIWqo69THF2o4JiEQ== 59 | 60 | "@types/strip-json-comments@0.0.30": 61 | version "0.0.30" 62 | resolved "https://registry.yarnpkg.com/@types/strip-json-comments/-/strip-json-comments-0.0.30.tgz#9aa30c04db212a9a0649d6ae6fd50accc40748a1" 63 | integrity sha512-7NQmHra/JILCd1QqpSzl8+mJRc8ZHz3uDm8YV1Ks9IhK0epEiTw8aIErbvH9PI+6XbqhyIQy3462nEsn7UVzjQ== 64 | 65 | acorn-walk@^8.1.1: 66 | version "8.2.0" 67 | resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.2.0.tgz#741210f2e2426454508853a2f44d0ab83b7f69c1" 68 | integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== 69 | 70 | acorn@^8.4.1: 71 | version "8.10.0" 72 | resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.10.0.tgz#8be5b3907a67221a81ab23c7889c4c5526b62ec5" 73 | integrity sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw== 74 | 75 | anymatch@~3.1.2: 76 | version "3.1.3" 77 | resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" 78 | integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== 79 | dependencies: 80 | normalize-path "^3.0.0" 81 | picomatch "^2.0.4" 82 | 83 | arg@^4.1.0: 84 | version "4.1.3" 85 | resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" 86 | integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== 87 | 88 | asynckit@^0.4.0: 89 | version "0.4.0" 90 | resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" 91 | integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== 92 | 93 | axios@^0.27.2: 94 | version "0.27.2" 95 | resolved "https://registry.yarnpkg.com/axios/-/axios-0.27.2.tgz#207658cc8621606e586c85db4b41a750e756d972" 96 | integrity sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ== 97 | dependencies: 98 | follow-redirects "^1.14.9" 99 | form-data "^4.0.0" 100 | 101 | balanced-match@^1.0.0: 102 | version "1.0.2" 103 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" 104 | integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== 105 | 106 | binary-extensions@^2.0.0: 107 | version "2.2.0" 108 | resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" 109 | integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== 110 | 111 | brace-expansion@^1.1.7: 112 | version "1.1.11" 113 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" 114 | integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== 115 | dependencies: 116 | balanced-match "^1.0.0" 117 | concat-map "0.0.1" 118 | 119 | braces@~3.0.2: 120 | version "3.0.2" 121 | resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" 122 | integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== 123 | dependencies: 124 | fill-range "^7.0.1" 125 | 126 | buffer-from@^1.0.0: 127 | version "1.1.2" 128 | resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" 129 | integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== 130 | 131 | chokidar@^3.5.1: 132 | version "3.5.3" 133 | resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" 134 | integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== 135 | dependencies: 136 | anymatch "~3.1.2" 137 | braces "~3.0.2" 138 | glob-parent "~5.1.2" 139 | is-binary-path "~2.1.0" 140 | is-glob "~4.0.1" 141 | normalize-path "~3.0.0" 142 | readdirp "~3.6.0" 143 | optionalDependencies: 144 | fsevents "~2.3.2" 145 | 146 | colors@1.4.0: 147 | version "1.4.0" 148 | resolved "https://registry.yarnpkg.com/colors/-/colors-1.4.0.tgz#c50491479d4c1bdaed2c9ced32cf7c7dc2360f78" 149 | integrity sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA== 150 | 151 | combined-stream@^1.0.8: 152 | version "1.0.8" 153 | resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" 154 | integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== 155 | dependencies: 156 | delayed-stream "~1.0.0" 157 | 158 | commander@^9.2.0: 159 | version "9.5.0" 160 | resolved "https://registry.yarnpkg.com/commander/-/commander-9.5.0.tgz#bc08d1eb5cedf7ccb797a96199d41c7bc3e60d30" 161 | integrity sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ== 162 | 163 | concat-map@0.0.1: 164 | version "0.0.1" 165 | resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" 166 | integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== 167 | 168 | create-require@^1.1.0: 169 | version "1.1.1" 170 | resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" 171 | integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== 172 | 173 | dateformat@4.5.1: 174 | version "4.5.1" 175 | resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-4.5.1.tgz#c20e7a9ca77d147906b6dc2261a8be0a5bd2173c" 176 | integrity sha512-OD0TZ+B7yP7ZgpJf5K2DIbj3FZvFvxgFUuaqA/V5zTjAtAAXZ1E8bktHxmAGs4x5b7PflqA9LeQ84Og7wYtF7Q== 177 | 178 | delayed-stream@~1.0.0: 179 | version "1.0.0" 180 | resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" 181 | integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== 182 | 183 | diff@^4.0.1: 184 | version "4.0.2" 185 | resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" 186 | integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== 187 | 188 | dynamic-dedupe@^0.3.0: 189 | version "0.3.0" 190 | resolved "https://registry.yarnpkg.com/dynamic-dedupe/-/dynamic-dedupe-0.3.0.tgz#06e44c223f5e4e94d78ef9db23a6515ce2f962a1" 191 | integrity sha512-ssuANeD+z97meYOqd50e04Ze5qp4bPqo8cCkI4TRjZkzAUgIDTrXV1R8QCdINpiI+hw14+rYazvTRdQrz0/rFQ== 192 | dependencies: 193 | xtend "^4.0.0" 194 | 195 | fill-range@^7.0.1: 196 | version "7.0.1" 197 | resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" 198 | integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== 199 | dependencies: 200 | to-regex-range "^5.0.1" 201 | 202 | follow-redirects@^1.14.9: 203 | version "1.15.2" 204 | resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.2.tgz#b460864144ba63f2681096f274c4e57026da2c13" 205 | integrity sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA== 206 | 207 | form-data@^4.0.0: 208 | version "4.0.0" 209 | resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452" 210 | integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww== 211 | dependencies: 212 | asynckit "^0.4.0" 213 | combined-stream "^1.0.8" 214 | mime-types "^2.1.12" 215 | 216 | fs.realpath@^1.0.0: 217 | version "1.0.0" 218 | resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" 219 | integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== 220 | 221 | fsevents@~2.3.2: 222 | version "2.3.3" 223 | resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" 224 | integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== 225 | 226 | function-bind@^1.1.1: 227 | version "1.1.1" 228 | resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" 229 | integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== 230 | 231 | glob-parent@~5.1.2: 232 | version "5.1.2" 233 | resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" 234 | integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== 235 | dependencies: 236 | is-glob "^4.0.1" 237 | 238 | glob@^7.1.3: 239 | version "7.2.3" 240 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" 241 | integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== 242 | dependencies: 243 | fs.realpath "^1.0.0" 244 | inflight "^1.0.4" 245 | inherits "2" 246 | minimatch "^3.1.1" 247 | once "^1.3.0" 248 | path-is-absolute "^1.0.0" 249 | 250 | has@^1.0.3: 251 | version "1.0.3" 252 | resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" 253 | integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== 254 | dependencies: 255 | function-bind "^1.1.1" 256 | 257 | inflight@^1.0.4: 258 | version "1.0.6" 259 | resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" 260 | integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== 261 | dependencies: 262 | once "^1.3.0" 263 | wrappy "1" 264 | 265 | inherits@2: 266 | version "2.0.4" 267 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" 268 | integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== 269 | 270 | is-binary-path@~2.1.0: 271 | version "2.1.0" 272 | resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" 273 | integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== 274 | dependencies: 275 | binary-extensions "^2.0.0" 276 | 277 | is-core-module@^2.13.0: 278 | version "2.13.0" 279 | resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.13.0.tgz#bb52aa6e2cbd49a30c2ba68c42bf3435ba6072db" 280 | integrity sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ== 281 | dependencies: 282 | has "^1.0.3" 283 | 284 | is-extglob@^2.1.1: 285 | version "2.1.1" 286 | resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" 287 | integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== 288 | 289 | is-glob@^4.0.1, is-glob@~4.0.1: 290 | version "4.0.3" 291 | resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" 292 | integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== 293 | dependencies: 294 | is-extglob "^2.1.1" 295 | 296 | is-number@^7.0.0: 297 | version "7.0.0" 298 | resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" 299 | integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== 300 | 301 | make-error@^1.1.1: 302 | version "1.3.6" 303 | resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" 304 | integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== 305 | 306 | mime-db@1.52.0: 307 | version "1.52.0" 308 | resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" 309 | integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== 310 | 311 | mime-types@^2.1.12: 312 | version "2.1.35" 313 | resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" 314 | integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== 315 | dependencies: 316 | mime-db "1.52.0" 317 | 318 | minimatch@^3.1.1: 319 | version "3.1.2" 320 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" 321 | integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== 322 | dependencies: 323 | brace-expansion "^1.1.7" 324 | 325 | minimist@^1.2.5: 326 | version "1.2.8" 327 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" 328 | integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== 329 | 330 | mkdirp@^1.0.4: 331 | version "1.0.4" 332 | resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" 333 | integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== 334 | 335 | normalize-path@^3.0.0, normalize-path@~3.0.0: 336 | version "3.0.0" 337 | resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" 338 | integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== 339 | 340 | once@^1.3.0: 341 | version "1.4.0" 342 | resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 343 | integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== 344 | dependencies: 345 | wrappy "1" 346 | 347 | path-is-absolute@^1.0.0: 348 | version "1.0.1" 349 | resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" 350 | integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== 351 | 352 | path-parse@^1.0.7: 353 | version "1.0.7" 354 | resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" 355 | integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== 356 | 357 | picomatch@^2.0.4, picomatch@^2.2.1: 358 | version "2.3.1" 359 | resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" 360 | integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== 361 | 362 | readdirp@~3.6.0: 363 | version "3.6.0" 364 | resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" 365 | integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== 366 | dependencies: 367 | picomatch "^2.2.1" 368 | 369 | resolve@^1.0.0: 370 | version "1.22.4" 371 | resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.4.tgz#1dc40df46554cdaf8948a486a10f6ba1e2026c34" 372 | integrity sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg== 373 | dependencies: 374 | is-core-module "^2.13.0" 375 | path-parse "^1.0.7" 376 | supports-preserve-symlinks-flag "^1.0.0" 377 | 378 | rimraf@^2.6.1: 379 | version "2.7.1" 380 | resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" 381 | integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== 382 | dependencies: 383 | glob "^7.1.3" 384 | 385 | source-map-support@^0.5.12, source-map-support@^0.5.17: 386 | version "0.5.21" 387 | resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" 388 | integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== 389 | dependencies: 390 | buffer-from "^1.0.0" 391 | source-map "^0.6.0" 392 | 393 | source-map@^0.6.0: 394 | version "0.6.1" 395 | resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" 396 | integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== 397 | 398 | strip-bom@^3.0.0: 399 | version "3.0.0" 400 | resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" 401 | integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA== 402 | 403 | strip-json-comments@^2.0.0: 404 | version "2.0.1" 405 | resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" 406 | integrity sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ== 407 | 408 | supports-preserve-symlinks-flag@^1.0.0: 409 | version "1.0.0" 410 | resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" 411 | integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== 412 | 413 | tinytim@0.1.1: 414 | version "0.1.1" 415 | resolved "https://registry.yarnpkg.com/tinytim/-/tinytim-0.1.1.tgz#c968a1e5559ad9553224ef7627bab34e3caef8a8" 416 | integrity sha512-NIpsp9lBIxPNzB++HnMmUd4byzJSVbbO4F+As1Gb1IG/YQT5QvmBDjpx8SpDS8fhGC+t+Qw8ldQgbcAIaU+2cA== 417 | 418 | to-regex-range@^5.0.1: 419 | version "5.0.1" 420 | resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" 421 | integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== 422 | dependencies: 423 | is-number "^7.0.0" 424 | 425 | tracer@^1.1.5: 426 | version "1.1.6" 427 | resolved "https://registry.yarnpkg.com/tracer/-/tracer-1.1.6.tgz#5afc5ea0d7c6026dbafb36bed86e88cafe9bebad" 428 | integrity sha512-VKEIQRNgzSgti18whs+8l7e2y/gWcklw+C/xZtFH/AGvaN6GDlvhkQTFEsy448Gxb5MtbNbzJiG0L1TJEQnqcA== 429 | dependencies: 430 | colors "1.4.0" 431 | dateformat "4.5.1" 432 | mkdirp "^1.0.4" 433 | tinytim "0.1.1" 434 | 435 | tree-kill@^1.2.2: 436 | version "1.2.2" 437 | resolved "https://registry.yarnpkg.com/tree-kill/-/tree-kill-1.2.2.tgz#4ca09a9092c88b73a7cdc5e8a01b507b0790a0cc" 438 | integrity sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A== 439 | 440 | ts-node-dev@^1.1.8: 441 | version "1.1.8" 442 | resolved "https://registry.yarnpkg.com/ts-node-dev/-/ts-node-dev-1.1.8.tgz#95520d8ab9d45fffa854d6668e2f8f9286241066" 443 | integrity sha512-Q/m3vEwzYwLZKmV6/0VlFxcZzVV/xcgOt+Tx/VjaaRHyiBcFlV0541yrT09QjzzCxlDZ34OzKjrFAynlmtflEg== 444 | dependencies: 445 | chokidar "^3.5.1" 446 | dynamic-dedupe "^0.3.0" 447 | minimist "^1.2.5" 448 | mkdirp "^1.0.4" 449 | resolve "^1.0.0" 450 | rimraf "^2.6.1" 451 | source-map-support "^0.5.12" 452 | tree-kill "^1.2.2" 453 | ts-node "^9.0.0" 454 | tsconfig "^7.0.0" 455 | 456 | ts-node@^10.7.0: 457 | version "10.9.1" 458 | resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.9.1.tgz#e73de9102958af9e1f0b168a6ff320e25adcff4b" 459 | integrity sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw== 460 | dependencies: 461 | "@cspotcode/source-map-support" "^0.8.0" 462 | "@tsconfig/node10" "^1.0.7" 463 | "@tsconfig/node12" "^1.0.7" 464 | "@tsconfig/node14" "^1.0.0" 465 | "@tsconfig/node16" "^1.0.2" 466 | acorn "^8.4.1" 467 | acorn-walk "^8.1.1" 468 | arg "^4.1.0" 469 | create-require "^1.1.0" 470 | diff "^4.0.1" 471 | make-error "^1.1.1" 472 | v8-compile-cache-lib "^3.0.1" 473 | yn "3.1.1" 474 | 475 | ts-node@^9.0.0: 476 | version "9.1.1" 477 | resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-9.1.1.tgz#51a9a450a3e959401bda5f004a72d54b936d376d" 478 | integrity sha512-hPlt7ZACERQGf03M253ytLY3dHbGNGrAq9qIHWUY9XHYl1z7wYngSr3OQ5xmui8o2AaxsONxIzjafLUiWBo1Fg== 479 | dependencies: 480 | arg "^4.1.0" 481 | create-require "^1.1.0" 482 | diff "^4.0.1" 483 | make-error "^1.1.1" 484 | source-map-support "^0.5.17" 485 | yn "3.1.1" 486 | 487 | tsconfig@^7.0.0: 488 | version "7.0.0" 489 | resolved "https://registry.yarnpkg.com/tsconfig/-/tsconfig-7.0.0.tgz#84538875a4dc216e5c4a5432b3a4dec3d54e91b7" 490 | integrity sha512-vZXmzPrL+EmC4T/4rVlT2jNVMWCi/O4DIiSj3UHg1OE5kCKbk4mfrXc6dZksLgRM/TZlKnousKH9bbTazUWRRw== 491 | dependencies: 492 | "@types/strip-bom" "^3.0.0" 493 | "@types/strip-json-comments" "0.0.30" 494 | strip-bom "^3.0.0" 495 | strip-json-comments "^2.0.0" 496 | 497 | typescript@^4.6.4: 498 | version "4.9.5" 499 | resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.9.5.tgz#095979f9bcc0d09da324d58d03ce8f8374cbe65a" 500 | integrity sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g== 501 | 502 | v8-compile-cache-lib@^3.0.1: 503 | version "3.0.1" 504 | resolved "https://registry.yarnpkg.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz#6336e8d71965cb3d35a1bbb7868445a7c05264bf" 505 | integrity sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg== 506 | 507 | wrappy@1: 508 | version "1.0.2" 509 | resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" 510 | integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== 511 | 512 | xtend@^4.0.0: 513 | version "4.0.2" 514 | resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" 515 | integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== 516 | 517 | yn@3.1.1: 518 | version "3.1.1" 519 | resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" 520 | integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== 521 | --------------------------------------------------------------------------------