commit 7c49cd2bc98f337a00e7ff0fc701994f791ceb30 Author: Hamcha Date: Mon Sep 2 17:49:41 2019 +0200 Initial commit diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..b512c09 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +node_modules \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..bde5d21 --- /dev/null +++ b/README.md @@ -0,0 +1,6 @@ +# Magic Encoding Toolkit + +```sh +yarn install +yarn genurl -i file.json +``` diff --git a/encoded.ts b/encoded.ts new file mode 100644 index 0000000..5d6754f --- /dev/null +++ b/encoded.ts @@ -0,0 +1,11 @@ +export interface ECard { + text: string; + cost?: string; + name: string; + types: string[]; + supertypes?: string[]; + loyalty?: string; + subtypes?: string[]; + pt?: string; + rarity: string; +} diff --git a/genurls.ts b/genurls.ts new file mode 100644 index 0000000..42a628d --- /dev/null +++ b/genurls.ts @@ -0,0 +1,57 @@ +import { readFileSync } from "fs"; +import { ECard } from "./encoded"; +import { MDCard, getCardData } from "./mtgdesign"; + +function capitalize(str: string): string { + return str.toUpperCase().substr(0, 1) + str.substr(1); +} + +interface CardInfo { + set: string; + total: number; + num: number; +} + +function convertCard(data: ECard, info: CardInfo): MDCard { + const centered = false; // Center if not much text + let power = ""; + let toughness = ""; + if (data.pt) { + [power, toughness] = data.pt.split("/"); + } + return { + "card-number": `${info.num}`, + "card-total": `${info.total}`, + "card-set": `${info.set}`, + language: "EN", + "card-title": data.name, + "mana-cost": data.cost ? data.cost : "", + "super-type": data.supertypes + ? data.supertypes.map(capitalize).join(" ") + : "", + type: capitalize(data.types[0]), + "sub-type": data.subtypes ? data.subtypes.map(capitalize).join(" ") : "", + "text-size": "38", + rarity: data.rarity.toUpperCase()[0], + power, + toughness, + loyalty: data.loyalty ? data.loyalty : "", + centered, + "rules-text": data.text.replace(/@/gi, "~"), + "flavor-text": "" + }; +} + +export function readCardFile(input): ECard[] { + const lines = readFileSync(input) + .toString() + .split("\n"); + return lines + .filter(x => x.trim().length > 0) + .map(line => JSON.parse(line.trim())); +} + +export function toURL(data: ECard, info: CardInfo): string { + const mdcard = convertCard(data, info); + return getCardData(mdcard); +} diff --git a/index.ts b/index.ts new file mode 100644 index 0000000..ebae9c2 --- /dev/null +++ b/index.ts @@ -0,0 +1,63 @@ +import * as yargs from "yargs"; +import { readCardFile, toURL } from "./genurls"; +import { existsSync, readFileSync } from "fs"; + +yargs + .scriptName("mtgetk") + .usage("$0 [args]") + .command( + "genurl", + "Generate card images", + yargs => + yargs + .positional("input", { + type: "string", + alias: "i", + default: "in.json", + describe: "Input JSON file generated by decode.py" + }) + .positional("cookie", { + type: "string", + alias: "c", + default: "cookie.txt", + describe: + "File contaning cookie data (required for requesting images)" + }) + .positional("only-url", { + type: "boolean", + alias: "u", + default: false, + describe: "Only generate URLs" + }), + argv => { + let generateImages = !argv["only-url"]; + let cookie = ""; + if (generateImages) { + if (!existsSync(argv.cookie)) { + console.warn( + "Cookie file not specified or invalid, will generate URLs instead of images" + ); + generateImages = false; + } else { + const cookieFile = readFileSync(argv.cookie); + cookie = cookieFile.toString(); + } + } else { + console.warn("Not generating images"); + } + const cards = readCardFile(argv.input); + console.log(`Loaded ${cards.length} cards`); + const urls = cards.map((c, i) => + toURL(c, { + set: "RNG", + num: i, + total: cards.length + }) + ); + if (generateImages) { + //TODO + } else { + urls.forEach((u, i) => console.log(`${cards[i].name}:\n${u}\n`)); + } + } + ).argv; diff --git a/mtgdesign.ts b/mtgdesign.ts new file mode 100644 index 0000000..f455359 --- /dev/null +++ b/mtgdesign.ts @@ -0,0 +1,244 @@ +export interface MDCard { + "card-number": string; + "card-total": string; + "card-set": string; + language: string; + "card-title": string; + "mana-cost": string; + "super-type": string; + type: string; + "sub-type": string; + "text-size": string; + rarity: string; + artist?: string; + power?: string; + toughness?: string; + loyalty?: string; + artwork?: string; + designer?: string; + "card-template"?: string; + "card-border"?: string; + "card-overlay"?: string; + "land-overlay"?: string; + watermark?: string; + "pt-color"?: string; + "card-layout"?: string; + "color-indicator"?: string; + "set-symbol"?: string; + centered?: boolean; + "large-size"?: boolean; + shiftrulestext?: boolean; + colorshifted?: boolean; + foil?: boolean; + lighten?: boolean; + "rules-text": string; + "flavor-text": string; +} + +const urlbase = "https://mtg.design/render?"; + +export function getCardData(data: MDCard) { + var card = ""; + + var manaCost = data["mana-cost"] + .toUpperCase() + .replace(/([\d\w])\/([\d\w])/g, "<$1/$2>") + .replace(/(\d\d+)/g, "{$1}") + .replace(/(\w)(?!\/)/g, "{$1}") + .replace(/\{(\w)\}\>/g, "$1>") + .replace(/\{(\d)\}\{(\d)\}/g, "$1$2") + .replace(/\/g, "}"); + + var identity, + border, + frame, + color = 0; + + if (/W/.test(manaCost)) color += 1; + if (/U/.test(manaCost)) color += 2; + if (/B/.test(manaCost)) color += 4; + if (/R/.test(manaCost)) color += 8; + if (/G/.test(manaCost)) color += 16; + + switch (color) { + case 0: + border = "C"; + frame = "C"; + break; + case 1: + border = "W"; + frame = "W"; + break; + case 2: + border = "U"; + frame = "U"; + break; + case 4: + border = "B"; + frame = "B"; + break; + case 8: + border = "R"; + frame = "R"; + break; + case 16: + border = "G"; + frame = "G"; + break; + + case 3: + border = "WU"; + frame = "Gld"; + if (/[WUBRG]\/[WUBRG]/.test(manaCost)) frame = border; + break; + case 5: + border = "WB"; + frame = "Gld"; + if (/[WUBRG]\/[WUBRG]/.test(manaCost)) frame = border; + break; + case 6: + border = "UB"; + frame = "Gld"; + if (/[WUBRG]\/[WUBRG]/.test(manaCost)) frame = border; + break; + case 9: + border = "RW"; + frame = "Gld"; + if (/[WUBRG]\/[WUBRG]/.test(manaCost)) frame = border; + break; + case 10: + border = "UR"; + frame = "Gld"; + if (/[WUBRG]\/[WUBRG]/.test(manaCost)) frame = border; + break; + case 12: + border = "BR"; + frame = "Gld"; + if (/[WUBRG]\/[WUBRG]/.test(manaCost)) frame = border; + break; + case 17: + border = "GW"; + frame = "Gld"; + if (/[WUBRG]\/[WUBRG]/.test(manaCost)) frame = border; + break; + case 18: + border = "GU"; + frame = "Gld"; + if (/[WUBRG]\/[WUBRG]/.test(manaCost)) frame = border; + break; + case 20: + border = "BG"; + frame = "Gld"; + if (/[WUBRG]\/[WUBRG]/.test(manaCost)) frame = border; + break; + case 24: + border = "RG"; + frame = "Gld"; + if (/[WUBRG]\/[WUBRG]/.test(manaCost)) frame = border; + break; + + case 7: + case 11: + case 13: + case 14: + case 15: + case 19: + case 21: + case 22: + case 23: + case 25: + case 26: + case 27: + case 28: + case 29: + case 30: + case 31: + border = "Gld"; + frame = "Gld"; + } + + var key = [ + "card-number", + "card-total", + "card-set", + "language", + "card-title", + "mana-cost", + "super-type", + "type", + "sub-type", + "text-size", + "rarity", + "artist", + "power", + "toughness", + "loyalty", + "artwork", + "designer", + "card-template", + "card-border", + "card-overlay", + "land-overlay", + "watermark", + "pt-color", + "card-layout", + "color-indicator", + "set-symbol" + ]; + var toggle = [ + "centered", + "large-size", + "shiftrulestext", + "colorshifted", + "foil", + "lighten" + ]; + + for (var i = 0; i < key.length; i++) { + var value = data[key[i]]; + if (value) { + card += + "&" + key[i] + "=" + encodeURIComponent(value.replace(/\s+$/, "")); + } + } + for (var i = 0; i < toggle.length; i++) { + var value = data[toggle[i]] == true; + if (value) { + card += "&" + toggle[i] + "=true"; + } + } + + if (data.type == "Planeswalker") { + card += "&pw-size=" + data["pw-size"]; + //TODO Proper pw + card += + "&rules-text=" + + data["loyalty-ability-1"] + + ": " + + encodeURIComponent(data["rules-text"] + " "); + /* + for (var i = 2; i <= $("#pw-size").val(); i++) { + card += + "&pw-text" + + i + + "=" + + $("#loyalty-ability-" + i).val() + + ": " + + encodeURIComponent($("#planeswalker-text-" + i).val() + " "); + } + */ + } else { + card += "&rules-text=" + encodeURIComponent(data["rules-text"]); + card += "&flavor-text=" + encodeURIComponent(data["flavor-text"]); + } + + card += + "&card-template=" + + encodeURIComponent(frame) + + "&card-accent=" + + encodeURIComponent(border); + card += "&edit=false"; + + return urlbase + card.substring(1); +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..ba84ccd --- /dev/null +++ b/package.json @@ -0,0 +1,16 @@ +{ + "name": "mtgetk", + "version": "1.0.0", + "main": "index.js", + "license": "MIT", + "dependencies": { + "@types/node": "^12.7.3", + "@types/yargs": "^13.0.2", + "ts-node": "^8.3.0", + "typescript": "^3.6.2", + "yargs": "^14.0.0" + }, + "scripts": { + "genurl": "ts-node index.ts genurl" + } +} diff --git a/yarn.lock b/yarn.lock new file mode 100644 index 0000000..6ef1005 --- /dev/null +++ b/yarn.lock @@ -0,0 +1,246 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@types/node@^12.7.3": + version "12.7.3" + resolved "https://registry.yarnpkg.com/@types/node/-/node-12.7.3.tgz#27b3f40addaf2f580459fdb405222685542f907a" + integrity sha512-3SiLAIBkDWDg6vFo0+5YJyHPWU9uwu40Qe+v+0MH8wRKYBimHvvAOyk3EzMrD/TrIlLYfXrqDqrg913PynrMJQ== + +"@types/yargs-parser@*": + version "13.0.0" + resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-13.0.0.tgz#453743c5bbf9f1bed61d959baab5b06be029b2d0" + integrity sha512-wBlsw+8n21e6eTd4yVv8YD/E3xq0O6nNnJIquutAsFGE7EyMKz7W6RNT6BRu1SmdgmlCZ9tb0X+j+D6HGr8pZw== + +"@types/yargs@^13.0.2": + version "13.0.2" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-13.0.2.tgz#a64674fc0149574ecd90ba746e932b5a5f7b3653" + integrity sha512-lwwgizwk/bIIU+3ELORkyuOgDjCh7zuWDFqRtPPhhVgq9N1F7CvLNKg1TX4f2duwtKQ0p044Au9r1PLIXHrIzQ== + dependencies: + "@types/yargs-parser" "*" + +ansi-regex@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997" + integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg== + +ansi-styles@^3.2.0: + version "3.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== + dependencies: + color-convert "^1.9.0" + +arg@^4.1.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.1.tgz#485f8e7c390ce4c5f78257dbea80d4be11feda4c" + integrity sha512-SlmP3fEA88MBv0PypnXZ8ZfJhwmDeIE3SP71j37AiXQBXYosPV0x6uISAaHYSlSVhmHOVkomen0tbGk6Anlebw== + +buffer-from@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" + integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A== + +camelcase@^5.0.0: + version "5.3.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" + integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== + +cliui@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-5.0.0.tgz#deefcfdb2e800784aa34f46fa08e06851c7bbbc5" + integrity sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA== + dependencies: + string-width "^3.1.0" + strip-ansi "^5.2.0" + wrap-ansi "^5.1.0" + +color-convert@^1.9.0: + version "1.9.3" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== + dependencies: + color-name "1.1.3" + +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= + +decamelize@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" + integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= + +diff@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.1.tgz#0c667cb467ebbb5cea7f14f135cc2dba7780a8ff" + integrity sha512-s2+XdvhPCOF01LRQBC8hf4vhbVmI2CGS5aZnxLJlT5FtdhPCDFq80q++zK2KlrVorVDdL5BOGZ/VfLrVtYNF+Q== + +emoji-regex@^7.0.1: + version "7.0.3" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" + integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA== + +find-up@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" + integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== + dependencies: + locate-path "^3.0.0" + +get-caller-file@^2.0.1: + version "2.0.5" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" + integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== + +is-fullwidth-code-point@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" + integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= + +locate-path@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" + integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A== + dependencies: + p-locate "^3.0.0" + path-exists "^3.0.0" + +make-error@^1.1.1: + version "1.3.5" + resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.5.tgz#efe4e81f6db28cadd605c70f29c831b58ef776c8" + integrity sha512-c3sIjNUow0+8swNwVpqoH4YCShKNFkMaw6oH1mNS2haDZQqkeZFlHS3dhoeEbKKmJB4vXpJucU6oH75aDYeE9g== + +p-limit@^2.0.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.2.1.tgz#aa07a788cc3151c939b5131f63570f0dd2009537" + integrity sha512-85Tk+90UCVWvbDavCLKPOLC9vvY8OwEX/RtKF+/1OADJMVlFfEHOiMTPVyxg7mk/dKa+ipdHm0OUkTvCpMTuwg== + dependencies: + p-try "^2.0.0" + +p-locate@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" + integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ== + dependencies: + p-limit "^2.0.0" + +p-try@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" + integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== + +path-exists@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" + integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= + +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= + +require-main-filename@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" + integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== + +set-blocking@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" + integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= + +source-map-support@^0.5.6: + version "0.5.13" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.13.tgz#31b24a9c2e73c2de85066c0feb7d44767ed52932" + integrity sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + +source-map@^0.6.0: + version "0.6.1" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + +string-width@^3.0.0, string-width@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961" + integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w== + dependencies: + emoji-regex "^7.0.1" + is-fullwidth-code-point "^2.0.0" + strip-ansi "^5.1.0" + +strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" + integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== + dependencies: + ansi-regex "^4.1.0" + +ts-node@^8.3.0: + version "8.3.0" + resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-8.3.0.tgz#e4059618411371924a1fb5f3b125915f324efb57" + integrity sha512-dyNS/RqyVTDcmNM4NIBAeDMpsAdaQ+ojdf0GOLqE6nwJOgzEkdRNzJywhDfwnuvB10oa6NLVG1rUJQCpRN7qoQ== + dependencies: + arg "^4.1.0" + diff "^4.0.1" + make-error "^1.1.1" + source-map-support "^0.5.6" + yn "^3.0.0" + +typescript@^3.6.2: + version "3.6.2" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.6.2.tgz#105b0f1934119dde543ac8eb71af3a91009efe54" + integrity sha512-lmQ4L+J6mnu3xweP8+rOrUwzmN+MRAj7TgtJtDaXE5PMyX2kCrklhg3rvOsOIfNeAWMQWO2F1GPc1kMD2vLAfw== + +which-module@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" + integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= + +wrap-ansi@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-5.1.0.tgz#1fd1f67235d5b6d0fee781056001bfb694c03b09" + integrity sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q== + dependencies: + ansi-styles "^3.2.0" + string-width "^3.0.0" + strip-ansi "^5.0.0" + +y18n@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b" + integrity sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w== + +yargs-parser@^13.1.1: + version "13.1.1" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.1.tgz#d26058532aa06d365fe091f6a1fc06b2f7e5eca0" + integrity sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ== + dependencies: + camelcase "^5.0.0" + decamelize "^1.2.0" + +yargs@^14.0.0: + version "14.0.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-14.0.0.tgz#ba4cacc802b3c0b3e36a9e791723763d57a85066" + integrity sha512-ssa5JuRjMeZEUjg7bEL99AwpitxU/zWGAGpdj0di41pOEmJti8NR6kyUIJBkR78DTYNPZOU08luUo0GTHuB+ow== + dependencies: + cliui "^5.0.0" + decamelize "^1.2.0" + find-up "^3.0.0" + get-caller-file "^2.0.1" + require-directory "^2.1.1" + require-main-filename "^2.0.0" + set-blocking "^2.0.0" + string-width "^3.0.0" + which-module "^2.0.0" + y18n "^4.0.0" + yargs-parser "^13.1.1" + +yn@^3.0.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" + integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==