├── README.md ├── bin ├── gitcracken-about.ts ├── gitcracken-appid-generate.ts ├── gitcracken-appid-read.ts ├── gitcracken-appid.ts ├── gitcracken-patcher.ts ├── gitcracken-secfile.ts └── gitcracken.ts ├── global.ts ├── index.ts ├── package.json ├── patches ├── development.diff ├── individual.diff ├── pro.diff ├── selfhosted.diff ├── staging.diff └── standalone.diff ├── src ├── appId.ts ├── index.ts ├── logo.ts ├── patcher.ts ├── platform.ts └── secFile.ts ├── tsconfig.json ├── tslint.json ├── types ├── asar.d.ts ├── getmac.d.ts └── index.d.ts └── yarn.lock /README.md: -------------------------------------------------------------------------------- 1 | # GitKraKen-Crack 2 | GitKraKen8.2.0-9.x的破解使用 3 | 4 | ## 破解要求环境 5 | - Node.js Version>=12 LTS 6 | - yarn 7 | - GitKraKen v8.2.0-9.x 8 | 9 | ## gitkraken下载地址 10 | [gitkraken](https://www.gitkraken.com/git-client/try-free) 11 | 12 | ## 破解步骤 13 | 14 | 下载之后需要先运行安装下载的GitKraken(它会自动安装到AppData/Local/gitkraken9.x中)。安装完毕后将会自动打开gitkraken,此时直接将其关闭即可。 15 | ### 2.从npm安装yarn 16 | - npm install --global yarn 17 | ### 3.git clone https://github.com/qsshs/GitKraKen-Crack.git 18 | - cd GitKraKen-Crack 19 | - yarn install 20 | - yarn build 21 | - yarn gitcracken patcher 22 | 23 | 24 | ## 后续 25 | ### 屏蔽更新 26 | 在C:\Windows\System32\drivers\etc下的hosts文件中最下面添加一行`127.0.0.1 release.gitkraken.com`即可。 27 | > 或者,直接在AppData/Local/gitkraken目录下,将update.exe删掉,也可禁止gitkraken自动更新。 28 | 29 | ### 从软件本体启动而不是update或安装包 30 | 在AppData/Local/gitkraken/app-9.x/目录下的gitkraken.exe才是真正的客户端本体。 31 | -------------------------------------------------------------------------------- /bin/gitcracken-about.ts: -------------------------------------------------------------------------------- 1 | import * as program from "commander"; 2 | 3 | import {Logo} from "../"; 4 | 5 | program 6 | .name("gitcracken-about") 7 | .description("about GitCracken") 8 | .action(() => { 9 | Logo.print(); 10 | }) 11 | .parse(process.argv); 12 | -------------------------------------------------------------------------------- /bin/gitcracken-appid-generate.ts: -------------------------------------------------------------------------------- 1 | import chalk from "chalk"; 2 | import * as program from "commander"; 3 | 4 | import {AppId, Logo} from "../"; 5 | 6 | program 7 | .name("gitcracken-appid-generate") 8 | .description("generate GitKraken AppId") 9 | .option("-m, --mac ", "use specific mac address (or any other string)") 10 | .action(async () => { 11 | Logo.print(); 12 | console.log( 13 | `${chalk.green("==>")} Generated AppId ${chalk.green( 14 | program.mac ? AppId.generate(program.mac) : await AppId.generateAsync(), 15 | )}`, 16 | ); 17 | }) 18 | .parse(process.argv); 19 | -------------------------------------------------------------------------------- /bin/gitcracken-appid-read.ts: -------------------------------------------------------------------------------- 1 | import chalk from "chalk"; 2 | import * as program from "commander"; 3 | 4 | import {AppId, Logo} from "../src"; 5 | 6 | program 7 | .name("gitcracken-appid-read") 8 | .description("read GitKraken AppId from config") 9 | .option("-c, --config ", "path to config") 10 | .action(() => { 11 | Logo.print(); 12 | console.log( 13 | `${chalk.green("==>")} Current AppId ${chalk.green( 14 | AppId.read(program.config) || "null", 15 | )}`, 16 | ); 17 | }) 18 | .parse(process.argv); 19 | -------------------------------------------------------------------------------- /bin/gitcracken-appid.ts: -------------------------------------------------------------------------------- 1 | import * as program from "commander"; 2 | 3 | program 4 | .name("gitcracken-appid") 5 | .description("GitKraken AppId") 6 | .command("generate", "generate GitKraken AppId") 7 | .command("read", "read GitKraken AppId from config") 8 | .parse(process.argv); 9 | -------------------------------------------------------------------------------- /bin/gitcracken-patcher.ts: -------------------------------------------------------------------------------- 1 | import chalk from "chalk"; 2 | import * as program from "commander"; 3 | import * as emoji from "node-emoji"; 4 | 5 | import {Logo, Patcher} from "../"; 6 | 7 | const enum Actions { 8 | backup = 1, 9 | unpack = 2, 10 | patch = 3, 11 | pack = 4, 12 | remove = 5, 13 | } 14 | 15 | async function executeActions(actions: Actions[]) { 16 | Logo.print(); 17 | const patcher = new Patcher({ 18 | asar: program.asar, 19 | dir: program.dir, 20 | features: program.feature, 21 | }); 22 | for (const action of actions) { 23 | switch (action) { 24 | case Actions.backup: { 25 | console.log( 26 | `${chalk.green("==>")} ${emoji.get("package")} Backup ` + 27 | `${chalk.green(patcher.asar)} ➔ ${chalk.green( 28 | patcher.backupAsar(), 29 | )}`, 30 | ); 31 | break; 32 | } 33 | case Actions.unpack: { 34 | console.log( 35 | `${chalk.green("==>")} ${emoji.get("unlock")} Unpack ${chalk.green( 36 | patcher.asar, 37 | )} ➔ ` + `${chalk.green(patcher.dir)}`, 38 | ); 39 | patcher.unpackAsar(); 40 | break; 41 | } 42 | case Actions.patch: { 43 | console.log( 44 | `${chalk.green("==>")} ${emoji.get("hammer")} Patch ${chalk.green( 45 | patcher.dir, 46 | )} ` + 47 | `with ${patcher.features 48 | .map((feature) => `${chalk.green(feature)}`) 49 | .join(", ")} features`, 50 | ); 51 | patcher.patchDir(); 52 | break; 53 | } 54 | case Actions.pack: { 55 | console.log( 56 | `${chalk.green("==>")} ${emoji.get("lock")} Pack ${chalk.green( 57 | patcher.dir, 58 | )} ➔ ` + `${chalk.green(patcher.asar)}`, 59 | ); 60 | await patcher.packDirAsync(); 61 | break; 62 | } 63 | case Actions.remove: { 64 | console.log( 65 | `${chalk.green("==>")} ${emoji.get("fire")} Remove ${chalk.green( 66 | patcher.dir, 67 | )}`, 68 | ); 69 | patcher.removeDir(); 70 | break; 71 | } 72 | } 73 | } 74 | console.log(`${chalk.green("==>")} ${emoji.get("ok_hand")} Patching done!`); 75 | } 76 | 77 | program 78 | .name("gitcracken-patcher") 79 | .description("GitKraken patcher") 80 | .option("-a, --asar ", "app.asar file") 81 | .option("-d, --dir ", "app directory") 82 | .option( 83 | "-f, --feature ", 84 | "patcher feature", 85 | (val, memo) => { 86 | memo.push(val); 87 | return memo; 88 | }, 89 | [], 90 | ) 91 | .arguments("[actions...]") 92 | .action(async (strActions?: string[]) => { 93 | if (program.feature.length === 0) { 94 | program.feature.push("pro"); 95 | } 96 | const actions: Actions[] = []; 97 | if (!strActions || !strActions.length) { 98 | actions.push( 99 | Actions.backup, 100 | Actions.unpack, 101 | Actions.patch, 102 | Actions.pack, 103 | Actions.remove, 104 | ); 105 | } else { 106 | strActions.forEach((item) => { 107 | switch (item.toLowerCase()) { 108 | case "backup": 109 | actions.push(Actions.backup); 110 | break; 111 | case "unpack": 112 | actions.push(Actions.unpack); 113 | break; 114 | case "patch": 115 | actions.push(Actions.patch); 116 | break; 117 | case "pack": 118 | actions.push(Actions.pack); 119 | break; 120 | case "remove": 121 | actions.push(Actions.remove); 122 | break; 123 | } 124 | }); 125 | } 126 | await executeActions(actions); 127 | }) 128 | .parse(process.argv); 129 | -------------------------------------------------------------------------------- /bin/gitcracken-secfile.ts: -------------------------------------------------------------------------------- 1 | import chalk from "chalk"; 2 | import * as program from "commander"; 3 | 4 | import {AppId, Logo, SecFile} from "../"; 5 | 6 | program 7 | .name("gitcracken-secfile") 8 | .description("read GitKraken secFile") 9 | .option("-i, --appid ", "AppId for secFile decrypt", AppId.read()) 10 | .arguments("[files...]") 11 | .action((files?: string[]) => { 12 | Logo.print(); 13 | for (const file of files || []) { 14 | console.log(`${chalk.green("==>")} ${chalk.bold(file)}`); 15 | const secFile = new SecFile(file, program.appid); 16 | secFile.read(); 17 | console.log(JSON.stringify(secFile.data, null, 2)); 18 | } 19 | }) 20 | .parse(process.argv); 21 | -------------------------------------------------------------------------------- /bin/gitcracken.ts: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | 3 | import * as program from "commander"; 4 | 5 | import {packageJson} from "../global"; 6 | 7 | program 8 | .name("gitcracken") 9 | .version(packageJson.version) 10 | .description(packageJson.description) 11 | .command("about", "about GitCracken") 12 | .command("appid", "GitKraken AppId") 13 | .command("patcher [actions...]", "GitKraken patcher") 14 | .command("secfile [files...]", "read GitKraken secFile") 15 | .parse(process.argv); 16 | -------------------------------------------------------------------------------- /global.ts: -------------------------------------------------------------------------------- 1 | /// 2 | 3 | import * as path from "path"; 4 | 5 | import * as fs from "fs-extra"; 6 | import * as pkgDir from "pkg-dir"; 7 | 8 | /** 9 | * Base directory with package.json 10 | */ 11 | export const baseDir = pkgDir.sync(__dirname) as string; 12 | 13 | /** 14 | * package.json 15 | */ 16 | export const packageJson: { 17 | author: string; 18 | description: string; 19 | homepage: string; 20 | license: string; 21 | name: string; 22 | version: string; 23 | } = fs.readJSONSync(path.join(baseDir, "package.json")); 24 | -------------------------------------------------------------------------------- /index.ts: -------------------------------------------------------------------------------- 1 | export * from "./src"; 2 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "gitcracken", 3 | "description": "GitKraken utils for non-commercial use", 4 | "author": "PMExtra, KillWolfVlad", 5 | "version": "8.4.0", 6 | "license": "MIT", 7 | "private": true, 8 | "homepage": "https://blog.jubeat.net/", 9 | "main": "dist/index.js", 10 | "bin": { 11 | "gitcracken": "dist/bin/gitcracken.js" 12 | }, 13 | "scripts": { 14 | "build": "rimraf dist && tsc", 15 | "gitcracken": "node dist/bin/gitcracken.js", 16 | "gitcracken:dev": "node $NODE_DEBUG_OPTION -r ts-node/register bin/gitcracken.ts", 17 | "lint": "tslint -p tsconfig.json" 18 | }, 19 | "dependencies": { 20 | "asar": "^2.0.1", 21 | "chalk": "^2.4.2", 22 | "commander": "^2.20.0", 23 | "diff": "^4.0.1", 24 | "figlet": "^1.2.3", 25 | "fs-extra": "^8.1.0", 26 | "getmac": "^1.4.6", 27 | "natsort": "^2.0.2", 28 | "node-emoji": "^1.10.0", 29 | "pkg-dir": "^4.2.0", 30 | "uuid": "^3.3.2" 31 | }, 32 | "devDependencies": { 33 | "@types/diff": "^4.0.2", 34 | "@types/figlet": "^1.2.0", 35 | "@types/fs-extra": "^8.0.0", 36 | "@types/node": "^12.0.10", 37 | "@types/node-emoji": "^1.8.1", 38 | "@types/uuid": "^3.4.4", 39 | "prettier": "^1.18.2", 40 | "rimraf": "^2.6.3", 41 | "ts-node": "^8.3.0", 42 | "tslint": "^5.18.0", 43 | "tslint-config-prettier": "^1.18.0", 44 | "tslint-plugin-prettier": "^2.0.1", 45 | "typescript": "^3.5.2" 46 | }, 47 | "files": [ 48 | "dist", 49 | "patches" 50 | ] 51 | } 52 | -------------------------------------------------------------------------------- /patches/development.diff: -------------------------------------------------------------------------------- 1 | --- static/mode.js 2 | +++ static/mode.js 3 | @@ -1,2 +1,2 @@ 4 | // This file is auto-generated by the set-run-mode.js script 5 | -module.exports = 'production'; 6 | +module.exports = 'development'; 7 | -------------------------------------------------------------------------------- /patches/individual.diff: -------------------------------------------------------------------------------- 1 | --- static/index.js 2 | +++ static/index.js 3 | @@ -1,7 +1,27 @@ 4 | // Warning: You almost certainly do *not* want to edit this code - 5 | // instead, you want to edit src/js/main.jsx instead 6 | 7 | +function PatchSnapshot() { 8 | + const edmLiteD = snapshotResult.customRequire('@axosoft/edm-lite-d/src/d.js'); 9 | + snapshotResult.customRequire.cache['@axosoft/edm-lite-d/src/d.js'] = { 10 | + exports: function() { 11 | + let response = JSON.parse(edmLiteD(...arguments).toString('utf8')); 12 | + if ('licenseExpiresAt' in response || 'licensedFeatures' in response) { 13 | + response = { 14 | + ...response, 15 | + availableTrialDays: null, 16 | + licenseExpiresAt: 8640000000000000, 17 | + licensedFeatures: ['individual'] 18 | + }; 19 | + } 20 | + return Buffer.from(JSON.stringify(response), 'utf8'); 21 | + } 22 | + }; 23 | +} 24 | + 25 | (function() { 26 | + PatchSnapshot(); 27 | + 28 | const Perf = snapshotResult.customRequire('./src/js/utils/Performance.js'); 29 | Perf.timeEnd('loading monaco scripts'); 30 | Perf.time('index.js pre-bootstrap'); 31 | -------------------------------------------------------------------------------- /patches/pro.diff: -------------------------------------------------------------------------------- 1 | This file would be ignored since GitCracken v8.2.0. 2 | There is a new patcher with pattern match now. 3 | See patchDirWithPro in src/patcher.ts for more detail. 4 | --- src/main/static/startMainProcess.js 5 | +++ src/main/static/startMainProcess.js 6 | @@ -1,4 +1,19 @@ 7 | /* eslint-disable no-console */ 8 | + 9 | +function patchSnapshot() { 10 | + var RegistrationHelpers = snapshotResult.customRequire('./src/sharedModules/registration/shared/RegistrationHelpers.js'); 11 | + var { decodeBody } = RegistrationHelpers; 12 | + RegistrationHelpers.decodeBody = function() { 13 | + var body = decodeBody(...arguments); 14 | + body = { 15 | + ...body, 16 | + licensedFeatures: ['pro'], 17 | + proAccessState: {} 18 | + } 19 | + return body; 20 | + } 21 | +} 22 | + 23 | (function() { 24 | if (process.env.GITKRAKEN_OPEN_MAIN_DEV_TOOLS) { 25 | require('./startDevTools'); 26 | @@ -32,6 +47,7 @@ 27 | global.mode = buildMode; 28 | 29 | if (typeof snapshotResult !== 'undefined') { 30 | + patchSnapshot(); 31 | const path = require('path'); 32 | snapshotResult.setGlobals(global, process, global, {}, console, require, path.resolve()); 33 | snapshotResult.customRequire('./src/main/main.js'); 34 | -------------------------------------------------------------------------------- /patches/selfhosted.diff: -------------------------------------------------------------------------------- 1 | --- static/clientType.js 2 | +++ static/clientType.js 3 | @@ -1,2 +1,2 @@ 4 | // This file is auto-generated by the set-client-type.js script 5 | -module.exports = 'NORMAL'; 6 | +module.exports = 'ENTERPRISE'; 7 | -------------------------------------------------------------------------------- /patches/staging.diff: -------------------------------------------------------------------------------- 1 | --- static/mode.js 2 | +++ static/mode.js 3 | @@ -1,2 +1,2 @@ 4 | // This file is auto-generated by the set-run-mode.js script 5 | -module.exports = 'production'; 6 | +module.exports = 'staging'; 7 | -------------------------------------------------------------------------------- /patches/standalone.diff: -------------------------------------------------------------------------------- 1 | --- static/clientType.js 2 | +++ static/clientType.js 3 | @@ -1,2 +1,2 @@ 4 | // This file is auto-generated by the set-client-type.js script 5 | -module.exports = 'NORMAL'; 6 | +module.exports = 'STANDALONE'; 7 | --- static/startMainProcess.js 8 | +++ static/startMainProcess.js 9 | @@ -1,3 +1,14 @@ 10 | +function PatchSnapshot() { 11 | + snapshotResult.customRequire.cache['@axosoft/edm-d/src/d.js'] = { 12 | + exports: () => 13 | + Promise.resolve({ 14 | + expiresAt: 8640000000000000, 15 | + quantity: Number.MAX_SAFE_INTEGER, 16 | + subscriber: { name: 'KillWolfVlad' } 17 | + }) 18 | + }; 19 | +} 20 | + 21 | (function () { 22 | require('./loadSnapshot') 23 | 24 | @@ -23,6 +34,7 @@ 25 | 26 | if (typeof snapshotResult !== 'undefined') { 27 | snapshotResult.setGlobals(global, process, global, {}, console, require, global.__dirname + '/..'); 28 | + PatchSnapshot(); 29 | snapshotResult.customRequire('./src/appBootstrap/main.js'); 30 | } 31 | })() 32 | -------------------------------------------------------------------------------- /src/appId.ts: -------------------------------------------------------------------------------- 1 | import * as crypto from "crypto"; 2 | import * as os from "os"; 3 | import * as path from "path"; 4 | import * as util from "util"; 5 | 6 | import * as fs from "fs-extra"; 7 | import {getMac} from "getmac"; 8 | import * as uuid from "uuid"; 9 | 10 | import {CURRENT_PLATFORM, Platforms} from "./platform"; 11 | 12 | /** 13 | * AppId 14 | */ 15 | export class AppId { 16 | /** 17 | * Generate AppId as sha1sum of specific mac address (or other string e.g. uuid/v4) 18 | * @param mac MAC address 19 | * @throws Error 20 | */ 21 | public static generate(mac: string): string { 22 | return crypto 23 | .createHash("sha1") 24 | .update(mac, "utf8") 25 | .digest("hex"); 26 | } 27 | 28 | /** 29 | * Generate AppId as sha1sum of your mac address (or as uuid/v4 if you don't have mac) 30 | * @throws Error 31 | */ 32 | public static async generateAsync(): Promise { 33 | let mac: string; 34 | try { 35 | mac = await util.promisify(getMac)(); 36 | } catch { 37 | mac = uuid.v4(); 38 | } 39 | return AppId.generate(mac); 40 | } 41 | 42 | /** 43 | * Read AppId from GitKraken config 44 | * @param config Path to config 45 | * @throws Error 46 | */ 47 | public static read(config: string = AppId.configPath()): string | undefined { 48 | if (!config || !fs.existsSync(config)) { 49 | return undefined; 50 | } 51 | return fs.readJSONSync(config).appId; 52 | } 53 | 54 | /** 55 | * Default config path 56 | */ 57 | private static configPath(): string { 58 | switch (CURRENT_PLATFORM) { 59 | case Platforms.linux: 60 | case Platforms.macOS: 61 | return path.join(os.homedir(), ".gitkraken/config"); 62 | case Platforms.windows: 63 | return path.join(os.homedir(), "AppData/Roaming/.gitkraken/config"); 64 | } 65 | } 66 | } 67 | -------------------------------------------------------------------------------- /src/index.ts: -------------------------------------------------------------------------------- 1 | export * from "./appId"; 2 | export * from "./logo"; 3 | export * from "./patcher"; 4 | export * from "./platform"; 5 | export * from "./secFile"; 6 | -------------------------------------------------------------------------------- /src/logo.ts: -------------------------------------------------------------------------------- 1 | import chalk from "chalk"; 2 | import * as figlet from "figlet"; 3 | 4 | import {packageJson} from "../global"; 5 | 6 | /** 7 | * Logo 8 | */ 9 | export class Logo { 10 | /** 11 | * Print logo 12 | * @param text Main text 13 | */ 14 | public static print(text = "GitCracken"): void { 15 | console.log(); 16 | console.log(figlet.textSync(text, "ANSI Shadow")); 17 | console.log(`${chalk.bold("• Description")}: ${packageJson.description}`); 18 | console.log(`${chalk.bold("• Version")}: ${packageJson.version}`); 19 | console.log(`${chalk.bold("• Author")}: ${packageJson.author}`); 20 | console.log(`${chalk.bold("• License")}: ${packageJson.license}`); 21 | console.log(`${chalk.bold("• Home Page")}: ${packageJson.homepage}`); 22 | console.log(); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /src/patcher.ts: -------------------------------------------------------------------------------- 1 | import * as os from "os"; 2 | import * as path from "path"; 3 | 4 | import * as asar from "asar"; 5 | import * as diff from "diff"; 6 | import * as fs from "fs-extra"; 7 | import natsort from "natsort"; 8 | 9 | import {baseDir} from "../global"; 10 | import {CURRENT_PLATFORM, Platforms} from "./platform"; 11 | 12 | /** 13 | * Patcher options 14 | */ 15 | export interface IPatcherOptions { 16 | /** 17 | * app.asar file 18 | */ 19 | readonly asar?: string; 20 | 21 | /** 22 | * app directory 23 | */ 24 | readonly dir?: string; 25 | 26 | /** 27 | * Patcher features 28 | */ 29 | readonly features: string[]; 30 | } 31 | 32 | /** 33 | * Patcher 34 | */ 35 | export class Patcher { 36 | private static findAsarUnix(...files: string[]): string | undefined { 37 | return files.find((file) => fs.existsSync(file)); 38 | } 39 | 40 | private static findAsarLinux(): string | undefined { 41 | return Patcher.findAsarUnix( 42 | "/opt/gitkraken/resources/app.asar", // Arch Linux 43 | "/usr/share/gitkraken/resources/app.asar", // deb & rpm 44 | ); 45 | } 46 | 47 | private static findAsarWindows(): string | undefined { 48 | const gitkrakenLocal = path.join(os.homedir(), "AppData/Local/gitkraken"); 49 | if (!fs.existsSync(gitkrakenLocal)) { 50 | return undefined; 51 | } 52 | const apps = fs 53 | .readdirSync(gitkrakenLocal) 54 | .filter((item) => item.match(/^app-\d+\.\d+\.\d+$/)); 55 | let app = apps.sort(natsort({desc: true}))[0]; 56 | if (!app) { 57 | return undefined; 58 | } 59 | app = path.join(gitkrakenLocal, app, "resources/app.asar"); 60 | return fs.existsSync(app) ? app : undefined; 61 | } 62 | 63 | private static findAsarMacOS(): string | undefined { 64 | return Patcher.findAsarUnix( 65 | "/Applications/GitKraken.app/Contents/Resources/app.asar", 66 | ); 67 | } 68 | 69 | private static findAsar(dir?: string): string | undefined { 70 | if (dir) { 71 | return path.normalize(dir) + ".asar"; 72 | } 73 | switch (CURRENT_PLATFORM) { 74 | case Platforms.linux: 75 | return Patcher.findAsarLinux(); 76 | case Platforms.windows: 77 | return Patcher.findAsarWindows(); 78 | case Platforms.macOS: 79 | return Patcher.findAsarMacOS(); 80 | } 81 | } 82 | 83 | private static findDir(asarFile: string): string { 84 | return path.join( 85 | path.dirname(asarFile), 86 | path.basename(asarFile, path.extname(asarFile)), 87 | ); 88 | } 89 | 90 | private readonly _asar: string; 91 | private readonly _dir: string; 92 | private readonly _features: string[]; 93 | 94 | /** 95 | * Patcher constructor 96 | * @param options Options 97 | */ 98 | public constructor(options: IPatcherOptions) { 99 | const maybeAsar = options.asar || Patcher.findAsar(options.dir); 100 | if (!maybeAsar) { 101 | throw new Error("Can't find app.asar!"); 102 | } 103 | this._asar = maybeAsar; 104 | this._dir = options.dir || Patcher.findDir(this.asar); 105 | this._features = options.features; 106 | if (!this.features.length) { 107 | throw new Error("Features is empty!"); 108 | } 109 | } 110 | 111 | /** 112 | * app.asar file 113 | */ 114 | public get asar(): string { 115 | return this._asar; 116 | } 117 | 118 | /** 119 | * app directory 120 | */ 121 | public get dir(): string { 122 | return this._dir; 123 | } 124 | 125 | /** 126 | * Patcher features 127 | */ 128 | public get features(): string[] { 129 | return this._features; 130 | } 131 | 132 | /** 133 | * Backup app.asar file 134 | * @throws Error 135 | */ 136 | public backupAsar(): string { 137 | const backup = `${this.asar}.${new Date().getTime()}.backup`; 138 | fs.copySync(this.asar, backup); 139 | return backup; 140 | } 141 | 142 | /** 143 | * Unpack app.asar file into app directory 144 | * @throws Error 145 | */ 146 | public unpackAsar(): void { 147 | asar.extractAll(this.asar, this.dir); 148 | } 149 | 150 | /** 151 | * Pack app directory to app.asar file 152 | * @throws Error 153 | */ 154 | public packDirAsync(): Promise { 155 | return asar.createPackage(this.dir, this.asar); 156 | } 157 | 158 | /** 159 | * Remove app directory 160 | * @throws Error 161 | */ 162 | public removeDir(): void { 163 | fs.removeSync(this.dir); 164 | } 165 | 166 | /** 167 | * Patch app directory 168 | * @throws Error 169 | */ 170 | public patchDir(): void { 171 | for (const feature of this.features) { 172 | switch (feature) { 173 | case "pro": 174 | this.patchDirWithPro(); 175 | break; 176 | 177 | default: 178 | this.patchDirWithFeature(feature); 179 | break; 180 | } 181 | } 182 | } 183 | 184 | private patchDirWithPro(): void { 185 | const bundlePath = path.join(this.dir, "src/main/static/main.bundle.js"); 186 | 187 | const patchedPattern = '(delete json.proAccessState,delete json.licenseExpiresAt,json={...json,licensedFeatures:["pro"]});'; 188 | 189 | const pattern1 = /const [^=]*="dev"===[^?]*\?"[\w+/=]+":"[\w+/=]+";/; 190 | const pattern2 = /return (JSON\.parse\(\([^;]*?\)\(Buffer\.from\([^;]*?,"base64"\)\.toString\("utf8"\),Buffer\.from\([^;]*?\.secure,"base64"\)\)\.toString\("utf8"\)\))\};/; 191 | const searchValue = new RegExp(`(?<=${pattern1.source})${pattern2.source}`) 192 | const replaceValue = 193 | "var json=$1;" + 194 | '("licenseExpiresAt"in json||"licensedFeatures"in json)&&' + 195 | '(delete json.proAccessState,delete json.licenseExpiresAt,json={...json,licensedFeatures:["pro"]});' + 196 | "return json};"; 197 | 198 | const sourceData = fs.readFileSync(bundlePath, "utf-8"); 199 | const sourcePatchedData = sourceData.replace(searchValue, replaceValue); 200 | if (sourceData === sourcePatchedData) { 201 | if (sourceData.indexOf(patchedPattern) < 0) throw new Error("Can't patch pro features, pattern match failed. Get support from https://t.me/gitkrakencrackchat"); 202 | throw new Error("It's already patched."); 203 | } 204 | fs.writeFileSync(bundlePath, sourcePatchedData, "utf-8"); 205 | } 206 | 207 | private patchDirWithFeature(feature: string): void { 208 | const patches = diff.parsePatch( 209 | fs.readFileSync(path.join(baseDir, "patches", `${feature}.diff`), "utf8"), 210 | ); 211 | for (const patch of patches) { 212 | this.patchDirWithPatch(patch); 213 | } 214 | } 215 | 216 | private patchDirWithPatch(patch: diff.ParsedDiff): void { 217 | const sourceData = fs.readFileSync( 218 | path.join(this.dir, patch.oldFileName!), 219 | "utf8", 220 | ); 221 | const sourcePatchedData = diff.applyPatch(sourceData, patch); 222 | if ((sourcePatchedData as any) === false) { 223 | throw new Error(`Can't patch ${patch.oldFileName}`); 224 | } 225 | if (patch.oldFileName !== patch.newFileName) { 226 | fs.unlinkSync(path.join(this.dir, patch.oldFileName!)); 227 | } 228 | fs.writeFileSync( 229 | path.join(this.dir, patch.newFileName!), 230 | sourcePatchedData, 231 | "utf8", 232 | ); 233 | } 234 | } 235 | -------------------------------------------------------------------------------- /src/platform.ts: -------------------------------------------------------------------------------- 1 | import chalk from "chalk"; 2 | 3 | /** 4 | * Platforms 5 | */ 6 | export enum Platforms { 7 | linux = 1, 8 | windows = 2, 9 | macOS = 3, 10 | } 11 | 12 | /** 13 | * Current platform 14 | */ 15 | export const CURRENT_PLATFORM: Platforms = ((): Platforms => { 16 | if (process.platform === "linux") { 17 | return Platforms.linux; 18 | } 19 | if (process.platform === "win32") { 20 | return Platforms.windows; 21 | } 22 | if (process.platform === "darwin") { 23 | return Platforms.macOS; 24 | } 25 | console.error( 26 | `We Are Deeply Sorry! Your OS ${chalk.red.bold( 27 | process.platform, 28 | )} is not supported!`, 29 | ); 30 | return process.exit(1); 31 | })(); 32 | -------------------------------------------------------------------------------- /src/secFile.ts: -------------------------------------------------------------------------------- 1 | import * as crypto from "crypto"; 2 | 3 | import * as fs from "fs-extra"; 4 | 5 | /** 6 | * Password protected file with JSON content. 7 | * This class is fork of library 8 | */ 9 | export class SecFile { 10 | private readonly _fileName: string; 11 | private readonly _password: string; 12 | private readonly _algorithm: string; 13 | private _data?: T; 14 | 15 | /** 16 | * Password protected file with JSON content constructor 17 | * @param fileName File name 18 | * @param password Password 19 | * @param algorithm Algorithm 20 | */ 21 | public constructor( 22 | fileName: string, 23 | password: string, 24 | algorithm: string = "aes-256-cbc", 25 | ) { 26 | this._fileName = fileName; 27 | this._password = password; 28 | this._algorithm = algorithm; 29 | } 30 | 31 | /** 32 | * File name 33 | */ 34 | public get fileName(): string { 35 | return this._fileName; 36 | } 37 | 38 | /** 39 | * Password 40 | */ 41 | public get password(): string { 42 | return this._password; 43 | } 44 | 45 | /** 46 | * Algorithm 47 | */ 48 | public get algorithm(): string { 49 | return this._algorithm; 50 | } 51 | 52 | /** 53 | * Data 54 | */ 55 | public get data(): T | undefined { 56 | return this._data; 57 | } 58 | 59 | /** 60 | * Read data from disk 61 | * @throws Error 62 | */ 63 | public read(): void { 64 | const decipher = crypto.createDecipher(this.algorithm, this.password); // TODO: deprecated! 65 | this._data = JSON.parse( 66 | Buffer.concat([ 67 | decipher.update(fs.readFileSync(this.fileName)), 68 | decipher.final(), 69 | ]).toString("utf8"), 70 | ); 71 | } 72 | } 73 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "lib": [ 4 | "esnext" 5 | ], 6 | "module": "commonjs", 7 | "moduleResolution": "node", 8 | "newLine": "lf", 9 | "outDir": "./dist", 10 | "removeComments": true, 11 | "sourceMap": false, 12 | "strict": true, 13 | "target": "esnext" 14 | }, 15 | "exclude": [ 16 | "./node_modules" 17 | ], 18 | "include": [ 19 | "./**/*.ts" 20 | ] 21 | } 22 | -------------------------------------------------------------------------------- /tslint.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": [ 3 | "tslint:recommended", 4 | "tslint-config-prettier" 5 | ], 6 | "rules": { 7 | "no-console": false, 8 | "no-reference": false, 9 | "prettier": true, 10 | "variable-name": [ 11 | true, 12 | "allow-leading-underscore" 13 | ] 14 | }, 15 | "rulesDirectory": [ 16 | "tslint-plugin-prettier" 17 | ] 18 | } 19 | -------------------------------------------------------------------------------- /types/asar.d.ts: -------------------------------------------------------------------------------- 1 | declare module "asar" { 2 | export function extractAll(archive: string, dest: string): void; 3 | 4 | export function createPackage(src: string, dest: string): Promise; 5 | } 6 | -------------------------------------------------------------------------------- /types/getmac.d.ts: -------------------------------------------------------------------------------- 1 | declare module "getmac" { 2 | export function getMac(callback: (error: Error | null, mac: string) => void): void; 3 | } 4 | -------------------------------------------------------------------------------- /types/index.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | /// 3 | -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@babel/code-frame@^7.0.0": 6 | version "7.0.0" 7 | resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.0.0.tgz#06e2ab19bdb535385559aabb5ba59729482800f8" 8 | integrity sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA== 9 | dependencies: 10 | "@babel/highlight" "^7.0.0" 11 | 12 | "@babel/highlight@^7.0.0": 13 | version "7.0.0" 14 | resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.0.0.tgz#f710c38c8d458e6dd9a201afb637fcb781ce99e4" 15 | integrity sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw== 16 | dependencies: 17 | chalk "^2.0.0" 18 | esutils "^2.0.2" 19 | js-tokens "^4.0.0" 20 | 21 | "@types/diff@^4.0.2": 22 | version "4.0.2" 23 | resolved "https://registry.yarnpkg.com/@types/diff/-/diff-4.0.2.tgz#2e9bb89f9acc3ab0108f0f3dc4dbdcf2fff8a99c" 24 | integrity sha512-mIenTfsIe586/yzsyfql69KRnA75S8SVXQbTLpDejRrjH0QSJcpu3AUOi/Vjnt9IOsXKxPhJfGpQUNMueIU1fQ== 25 | 26 | "@types/figlet@^1.2.0": 27 | version "1.2.0" 28 | resolved "https://registry.yarnpkg.com/@types/figlet/-/figlet-1.2.0.tgz#2dab76da069dc8ce5dcab461f7f2788317fb01a8" 29 | integrity sha512-TDZkNpYfkc3X8yv7w1QBziZmmxzNfGKX+YjeNkMpmSiNV0QOdNf9G5cEZB3FH1/oaqpSQEdxuDzURdju2L3lng== 30 | 31 | "@types/fs-extra@^8.0.0": 32 | version "8.0.0" 33 | resolved "https://registry.yarnpkg.com/@types/fs-extra/-/fs-extra-8.0.0.tgz#d3e2c313ca29f95059f198dd60d1f774642d4b25" 34 | integrity sha512-bCtL5v9zdbQW86yexOlXWTEGvLNqWxMFyi7gQA7Gcthbezr2cPSOb8SkESVKA937QD5cIwOFLDFt0MQoXOEr9Q== 35 | dependencies: 36 | "@types/node" "*" 37 | 38 | "@types/node-emoji@^1.8.1": 39 | version "1.8.1" 40 | resolved "https://registry.yarnpkg.com/@types/node-emoji/-/node-emoji-1.8.1.tgz#689cb74fdf6e84309bcafce93a135dfecd01de3f" 41 | integrity sha512-0fRfA90FWm6KJfw6P9QGyo0HDTCmthZ7cWaBQndITlaWLTZ6njRyKwrwpzpg+n6kBXBIGKeUHEQuBx7bphGJkA== 42 | 43 | "@types/node@*", "@types/node@^12.0.10": 44 | version "12.0.10" 45 | resolved "https://registry.yarnpkg.com/@types/node/-/node-12.0.10.tgz#51babf9c7deadd5343620055fc8aff7995c8b031" 46 | integrity sha512-LcsGbPomWsad6wmMNv7nBLw7YYYyfdYcz6xryKYQhx89c3XXan+8Q6AJ43G5XDIaklaVkK3mE4fCb0SBvMiPSQ== 47 | 48 | "@types/uuid@^3.4.4": 49 | version "3.4.4" 50 | resolved "https://registry.yarnpkg.com/@types/uuid/-/uuid-3.4.4.tgz#7af69360fa65ef0decb41fd150bf4ca5c0cefdf5" 51 | integrity sha512-tPIgT0GUmdJQNSHxp0X2jnpQfBSTfGxUMc/2CXBU2mnyTFVYVa2ojpoQ74w0U2yn2vw3jnC640+77lkFFpdVDw== 52 | dependencies: 53 | "@types/node" "*" 54 | 55 | ansi-styles@^3.2.1: 56 | version "3.2.1" 57 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" 58 | integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== 59 | dependencies: 60 | color-convert "^1.9.0" 61 | 62 | arg@^4.1.0: 63 | version "4.1.0" 64 | resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.0.tgz#583c518199419e0037abb74062c37f8519e575f0" 65 | integrity sha512-ZWc51jO3qegGkVh8Hwpv636EkbesNV5ZNQPCtRa+0qytRYPEs9IYT9qITY9buezqUH5uqyzlWLcufrzU2rffdg== 66 | 67 | argparse@^1.0.7: 68 | version "1.0.10" 69 | resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" 70 | integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== 71 | dependencies: 72 | sprintf-js "~1.0.2" 73 | 74 | asar@^2.0.1: 75 | version "2.0.1" 76 | resolved "https://registry.yarnpkg.com/asar/-/asar-2.0.1.tgz#8518a1c62c238109c15a5f742213e83a09b9fd38" 77 | integrity sha512-Vo9yTuUtyFahkVMFaI6uMuX6N7k5DWa6a/8+7ov0/f8Lq9TVR0tUjzSzxQSxT1Y+RJIZgnP7BVb6Uhi+9cjxqA== 78 | dependencies: 79 | chromium-pickle-js "^0.2.0" 80 | commander "^2.20.0" 81 | cuint "^0.2.2" 82 | glob "^7.1.3" 83 | minimatch "^3.0.4" 84 | mkdirp "^0.5.1" 85 | tmp-promise "^1.0.5" 86 | 87 | balanced-match@^1.0.0: 88 | version "1.0.0" 89 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" 90 | integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= 91 | 92 | bluebird@^3.5.0: 93 | version "3.5.5" 94 | resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.5.tgz#a8d0afd73251effbbd5fe384a77d73003c17a71f" 95 | integrity sha512-5am6HnnfN+urzt4yfg7IgTbotDjIT/u8AJpEt0sIU9FtXfVeezXAPKswrG+xKUCOYAINpSdgZVDU6QFh+cuH3w== 96 | 97 | brace-expansion@^1.1.7: 98 | version "1.1.11" 99 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" 100 | integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== 101 | dependencies: 102 | balanced-match "^1.0.0" 103 | concat-map "0.0.1" 104 | 105 | buffer-from@^1.0.0: 106 | version "1.1.1" 107 | resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" 108 | integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A== 109 | 110 | builtin-modules@^1.1.1: 111 | version "1.1.1" 112 | resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" 113 | integrity sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8= 114 | 115 | chalk@^2.0.0, chalk@^2.3.0, chalk@^2.4.2: 116 | version "2.4.2" 117 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" 118 | integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== 119 | dependencies: 120 | ansi-styles "^3.2.1" 121 | escape-string-regexp "^1.0.5" 122 | supports-color "^5.3.0" 123 | 124 | chromium-pickle-js@^0.2.0: 125 | version "0.2.0" 126 | resolved "https://registry.yarnpkg.com/chromium-pickle-js/-/chromium-pickle-js-0.2.0.tgz#04a106672c18b085ab774d983dfa3ea138f22205" 127 | integrity sha1-BKEGZywYsIWrd02YPfo+oTjyIgU= 128 | 129 | color-convert@^1.9.0: 130 | version "1.9.3" 131 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" 132 | integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== 133 | dependencies: 134 | color-name "1.1.3" 135 | 136 | color-name@1.1.3: 137 | version "1.1.3" 138 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" 139 | integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= 140 | 141 | commander@^2.12.1, commander@^2.20.0: 142 | version "2.20.0" 143 | resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.0.tgz#d58bb2b5c1ee8f87b0d340027e9e94e222c5a422" 144 | integrity sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ== 145 | 146 | concat-map@0.0.1: 147 | version "0.0.1" 148 | resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" 149 | integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= 150 | 151 | cuint@^0.2.2: 152 | version "0.2.2" 153 | resolved "https://registry.yarnpkg.com/cuint/-/cuint-0.2.2.tgz#408086d409550c2631155619e9fa7bcadc3b991b" 154 | integrity sha1-QICG1AlVDCYxFVYZ6fp7ytw7mRs= 155 | 156 | diff@^3.2.0: 157 | version "3.5.0" 158 | resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12" 159 | integrity sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA== 160 | 161 | diff@^4.0.1: 162 | version "4.0.1" 163 | resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.1.tgz#0c667cb467ebbb5cea7f14f135cc2dba7780a8ff" 164 | integrity sha512-s2+XdvhPCOF01LRQBC8hf4vhbVmI2CGS5aZnxLJlT5FtdhPCDFq80q++zK2KlrVorVDdL5BOGZ/VfLrVtYNF+Q== 165 | 166 | eachr@^3.2.0: 167 | version "3.2.0" 168 | resolved "https://registry.yarnpkg.com/eachr/-/eachr-3.2.0.tgz#2c35e43ea086516f7997cf80b7aa64d55a4a4484" 169 | integrity sha1-LDXkPqCGUW95l8+At6pk1VpKRIQ= 170 | dependencies: 171 | editions "^1.1.1" 172 | typechecker "^4.3.0" 173 | 174 | editions@^1.1.1: 175 | version "1.3.4" 176 | resolved "https://registry.yarnpkg.com/editions/-/editions-1.3.4.tgz#3662cb592347c3168eb8e498a0ff73271d67f50b" 177 | integrity sha512-gzao+mxnYDzIysXKMQi/+M1mjy/rjestjg6OPoYTtI+3Izp23oiGZitsl9lPDPiTGXbcSIk1iJWhliSaglxnUg== 178 | 179 | editions@^2.0.2, editions@^2.1.0, editions@^2.1.2: 180 | version "2.1.3" 181 | resolved "https://registry.yarnpkg.com/editions/-/editions-2.1.3.tgz#727ccf3ec2c7b12dcc652c71000f16c4824d6f7d" 182 | integrity sha512-xDZyVm0A4nLgMNWVVLJvcwMjI80ShiH/27RyLiCnW1L273TcJIA25C4pwJ33AWV01OX6UriP35Xu+lH4S7HWQw== 183 | dependencies: 184 | errlop "^1.1.1" 185 | semver "^5.6.0" 186 | 187 | errlop@^1.1.1: 188 | version "1.1.1" 189 | resolved "https://registry.yarnpkg.com/errlop/-/errlop-1.1.1.tgz#d9ae4c76c3e64956c5d79e6e035d6343bfd62250" 190 | integrity sha512-WX7QjiPHhsny7/PQvrhS5VMizXXKoKCS3udaBp8gjlARdbn+XmK300eKBAAN0hGyRaTCtRpOaxK+xFVPUJ3zkw== 191 | dependencies: 192 | editions "^2.1.2" 193 | 194 | escape-string-regexp@^1.0.5: 195 | version "1.0.5" 196 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" 197 | integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= 198 | 199 | eslint-plugin-prettier@^2.2.0: 200 | version "2.7.0" 201 | resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-2.7.0.tgz#b4312dcf2c1d965379d7f9d5b5f8aaadc6a45904" 202 | integrity sha512-CStQYJgALoQBw3FsBzH0VOVDRnJ/ZimUlpLm226U8qgqYJfPOY/CPK6wyRInMxh73HSKg5wyRwdS4BVYYHwokA== 203 | dependencies: 204 | fast-diff "^1.1.1" 205 | jest-docblock "^21.0.0" 206 | 207 | esprima@^4.0.0: 208 | version "4.0.1" 209 | resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" 210 | integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== 211 | 212 | esutils@^2.0.2: 213 | version "2.0.2" 214 | resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" 215 | integrity sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs= 216 | 217 | extract-opts@^3.2.0: 218 | version "3.3.1" 219 | resolved "https://registry.yarnpkg.com/extract-opts/-/extract-opts-3.3.1.tgz#5abbedc98c0d5202e3278727f9192d7e086c6be1" 220 | integrity sha1-WrvtyYwNUgLjJ4cn+Rktfghsa+E= 221 | dependencies: 222 | eachr "^3.2.0" 223 | editions "^1.1.1" 224 | typechecker "^4.3.0" 225 | 226 | fast-diff@^1.1.1: 227 | version "1.2.0" 228 | resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.2.0.tgz#73ee11982d86caaf7959828d519cfe927fac5f03" 229 | integrity sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w== 230 | 231 | figlet@^1.2.3: 232 | version "1.2.3" 233 | resolved "https://registry.yarnpkg.com/figlet/-/figlet-1.2.3.tgz#7d25df546f41fc411c2a8b88012d48d55de72129" 234 | integrity sha512-+F5zdvZ66j77b8x2KCPvWUHC0UCKUMWrewxmewgPlagp3wmDpcrHMbyv/ygq/6xoxBPGQA+UJU3SMoBzKoROQQ== 235 | 236 | find-up@^4.0.0: 237 | version "4.1.0" 238 | resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" 239 | integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== 240 | dependencies: 241 | locate-path "^5.0.0" 242 | path-exists "^4.0.0" 243 | 244 | fs-extra@^8.1.0: 245 | version "8.1.0" 246 | resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0" 247 | integrity sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g== 248 | dependencies: 249 | graceful-fs "^4.2.0" 250 | jsonfile "^4.0.0" 251 | universalify "^0.1.0" 252 | 253 | fs.realpath@^1.0.0: 254 | version "1.0.0" 255 | resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" 256 | integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= 257 | 258 | getmac@^1.4.6: 259 | version "1.4.6" 260 | resolved "https://registry.yarnpkg.com/getmac/-/getmac-1.4.6.tgz#ffe7db07900e222916939d44e4c7274adbecc662" 261 | integrity sha512-3JPwiIr4P6Sgr6y6SVXX0+l2mrB6pyf4Cdyua7rvEV7SveWQkAp11vrkNym8wvRxzLrBenKRcwe93asdghuwWg== 262 | dependencies: 263 | editions "^2.0.2" 264 | extract-opts "^3.2.0" 265 | 266 | glob@^7.1.1, glob@^7.1.3: 267 | version "7.1.4" 268 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.4.tgz#aa608a2f6c577ad357e1ae5a5c26d9a8d1969255" 269 | integrity sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A== 270 | dependencies: 271 | fs.realpath "^1.0.0" 272 | inflight "^1.0.4" 273 | inherits "2" 274 | minimatch "^3.0.4" 275 | once "^1.3.0" 276 | path-is-absolute "^1.0.0" 277 | 278 | graceful-fs@^4.1.6, graceful-fs@^4.2.0: 279 | version "4.2.0" 280 | resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.0.tgz#8d8fdc73977cb04104721cb53666c1ca64cd328b" 281 | integrity sha512-jpSvDPV4Cq/bgtpndIWbI5hmYxhQGHPC4d4cqBPb4DLniCfhJokdXhwhaDuLBGLQdvvRum/UiX6ECVIPvDXqdg== 282 | 283 | has-flag@^3.0.0: 284 | version "3.0.0" 285 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" 286 | integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= 287 | 288 | inflight@^1.0.4: 289 | version "1.0.6" 290 | resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" 291 | integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= 292 | dependencies: 293 | once "^1.3.0" 294 | wrappy "1" 295 | 296 | inherits@2: 297 | version "2.0.4" 298 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" 299 | integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== 300 | 301 | jest-docblock@^21.0.0: 302 | version "21.2.0" 303 | resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-21.2.0.tgz#51529c3b30d5fd159da60c27ceedc195faf8d414" 304 | integrity sha512-5IZ7sY9dBAYSV+YjQ0Ovb540Ku7AO9Z5o2Cg789xj167iQuZ2cG+z0f3Uct6WeYLbU6aQiM2pCs7sZ+4dotydw== 305 | 306 | js-tokens@^4.0.0: 307 | version "4.0.0" 308 | resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" 309 | integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== 310 | 311 | js-yaml@^3.13.1: 312 | version "3.13.1" 313 | resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847" 314 | integrity sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw== 315 | dependencies: 316 | argparse "^1.0.7" 317 | esprima "^4.0.0" 318 | 319 | jsonfile@^4.0.0: 320 | version "4.0.0" 321 | resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" 322 | integrity sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss= 323 | optionalDependencies: 324 | graceful-fs "^4.1.6" 325 | 326 | lines-and-columns@^1.1.6: 327 | version "1.1.6" 328 | resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.1.6.tgz#1c00c743b433cd0a4e80758f7b64a57440d9ff00" 329 | integrity sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA= 330 | 331 | locate-path@^5.0.0: 332 | version "5.0.0" 333 | resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" 334 | integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== 335 | dependencies: 336 | p-locate "^4.1.0" 337 | 338 | lodash.toarray@^4.4.0: 339 | version "4.4.0" 340 | resolved "https://registry.yarnpkg.com/lodash.toarray/-/lodash.toarray-4.4.0.tgz#24c4bfcd6b2fba38bfd0594db1179d8e9b656561" 341 | integrity sha1-JMS/zWsvuji/0FlNsRedjptlZWE= 342 | 343 | make-error@^1.1.1: 344 | version "1.3.5" 345 | resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.5.tgz#efe4e81f6db28cadd605c70f29c831b58ef776c8" 346 | integrity sha512-c3sIjNUow0+8swNwVpqoH4YCShKNFkMaw6oH1mNS2haDZQqkeZFlHS3dhoeEbKKmJB4vXpJucU6oH75aDYeE9g== 347 | 348 | minimatch@^3.0.4: 349 | version "3.0.4" 350 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" 351 | integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== 352 | dependencies: 353 | brace-expansion "^1.1.7" 354 | 355 | minimist@0.0.8: 356 | version "0.0.8" 357 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" 358 | integrity sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0= 359 | 360 | mkdirp@^0.5.1: 361 | version "0.5.1" 362 | resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" 363 | integrity sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM= 364 | dependencies: 365 | minimist "0.0.8" 366 | 367 | natsort@^2.0.2: 368 | version "2.0.2" 369 | resolved "https://registry.yarnpkg.com/natsort/-/natsort-2.0.2.tgz#3358b7af00f155c8ce181289ede79e18d81e6c52" 370 | integrity sha512-McY0uA4rDU7GkkoQ1oU8bH9P13onCIrPWxpOjlt792ccFZFkenFm29AHyRCdhbbbfhPfTsjTDagBqjpphD3R7Q== 371 | 372 | node-emoji@^1.10.0: 373 | version "1.10.0" 374 | resolved "https://registry.yarnpkg.com/node-emoji/-/node-emoji-1.10.0.tgz#8886abd25d9c7bb61802a658523d1f8d2a89b2da" 375 | integrity sha512-Yt3384If5H6BYGVHiHwTL+99OzJKHhgp82S8/dktEK73T26BazdgZ4JZh92xSVtGNJvz9UbXdNAc5hcrXV42vw== 376 | dependencies: 377 | lodash.toarray "^4.4.0" 378 | 379 | once@^1.3.0: 380 | version "1.4.0" 381 | resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 382 | integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= 383 | dependencies: 384 | wrappy "1" 385 | 386 | p-limit@^2.2.0: 387 | version "2.2.0" 388 | resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.2.0.tgz#417c9941e6027a9abcba5092dd2904e255b5fbc2" 389 | integrity sha512-pZbTJpoUsCzV48Mc9Nh51VbwO0X9cuPFE8gYwx9BTCt9SF8/b7Zljd2fVgOxhIF/HDTKgpVzs+GPhyKfjLLFRQ== 390 | dependencies: 391 | p-try "^2.0.0" 392 | 393 | p-locate@^4.1.0: 394 | version "4.1.0" 395 | resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" 396 | integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== 397 | dependencies: 398 | p-limit "^2.2.0" 399 | 400 | p-try@^2.0.0: 401 | version "2.2.0" 402 | resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" 403 | integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== 404 | 405 | path-exists@^4.0.0: 406 | version "4.0.0" 407 | resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" 408 | integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== 409 | 410 | path-is-absolute@^1.0.0: 411 | version "1.0.1" 412 | resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" 413 | integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= 414 | 415 | path-parse@^1.0.6: 416 | version "1.0.6" 417 | resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" 418 | integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw== 419 | 420 | pkg-dir@^4.2.0: 421 | version "4.2.0" 422 | resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" 423 | integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== 424 | dependencies: 425 | find-up "^4.0.0" 426 | 427 | prettier@^1.18.2: 428 | version "1.18.2" 429 | resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.18.2.tgz#6823e7c5900017b4bd3acf46fe9ac4b4d7bda9ea" 430 | integrity sha512-OeHeMc0JhFE9idD4ZdtNibzY0+TPHSpSSb9h8FqtP+YnoZZ1sl8Vc9b1sasjfymH3SonAF4QcA2+mzHPhMvIiw== 431 | 432 | resolve@^1.3.2: 433 | version "1.11.1" 434 | resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.11.1.tgz#ea10d8110376982fef578df8fc30b9ac30a07a3e" 435 | integrity sha512-vIpgF6wfuJOZI7KKKSP+HmiKggadPQAdsp5HiC1mvqnfp0gF1vdwgBWZIdrVft9pgqoMFQN+R7BSWZiBxx+BBw== 436 | dependencies: 437 | path-parse "^1.0.6" 438 | 439 | rimraf@^2.6.3: 440 | version "2.6.3" 441 | resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" 442 | integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA== 443 | dependencies: 444 | glob "^7.1.3" 445 | 446 | semver@^5.3.0, semver@^5.6.0: 447 | version "5.7.0" 448 | resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.0.tgz#790a7cf6fea5459bac96110b29b60412dc8ff96b" 449 | integrity sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA== 450 | 451 | source-map-support@^0.5.6: 452 | version "0.5.12" 453 | resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.12.tgz#b4f3b10d51857a5af0138d3ce8003b201613d599" 454 | integrity sha512-4h2Pbvyy15EE02G+JOZpUCmqWJuqrs+sEkzewTm++BPi7Hvn/HwcqLAcNxYAyI0x13CpPPn+kMjl+hplXMHITQ== 455 | dependencies: 456 | buffer-from "^1.0.0" 457 | source-map "^0.6.0" 458 | 459 | source-map@^0.6.0: 460 | version "0.6.1" 461 | resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" 462 | integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== 463 | 464 | sprintf-js@~1.0.2: 465 | version "1.0.3" 466 | resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" 467 | integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= 468 | 469 | supports-color@^5.3.0: 470 | version "5.5.0" 471 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" 472 | integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== 473 | dependencies: 474 | has-flag "^3.0.0" 475 | 476 | tmp-promise@^1.0.5: 477 | version "1.1.0" 478 | resolved "https://registry.yarnpkg.com/tmp-promise/-/tmp-promise-1.1.0.tgz#bb924d239029157b9bc1d506a6aa341f8b13e64c" 479 | integrity sha512-8+Ah9aB1IRXCnIOxXZ0uFozV1nMU5xiu7hhFVUSxZ3bYu+psD4TzagCzVbexUCgNNGJnsmNDQlS4nG3mTyoNkw== 480 | dependencies: 481 | bluebird "^3.5.0" 482 | tmp "0.1.0" 483 | 484 | tmp@0.1.0: 485 | version "0.1.0" 486 | resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.1.0.tgz#ee434a4e22543082e294ba6201dcc6eafefa2877" 487 | integrity sha512-J7Z2K08jbGcdA1kkQpJSqLF6T0tdQqpR2pnSUXsIchbPdTI9v3e85cLW0d6WDhwuAleOV71j2xWs8qMPfK7nKw== 488 | dependencies: 489 | rimraf "^2.6.3" 490 | 491 | ts-node@^8.3.0: 492 | version "8.3.0" 493 | resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-8.3.0.tgz#e4059618411371924a1fb5f3b125915f324efb57" 494 | integrity sha512-dyNS/RqyVTDcmNM4NIBAeDMpsAdaQ+ojdf0GOLqE6nwJOgzEkdRNzJywhDfwnuvB10oa6NLVG1rUJQCpRN7qoQ== 495 | dependencies: 496 | arg "^4.1.0" 497 | diff "^4.0.1" 498 | make-error "^1.1.1" 499 | source-map-support "^0.5.6" 500 | yn "^3.0.0" 501 | 502 | tslib@^1.7.1, tslib@^1.8.0, tslib@^1.8.1: 503 | version "1.10.0" 504 | resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.10.0.tgz#c3c19f95973fb0a62973fb09d90d961ee43e5c8a" 505 | integrity sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ== 506 | 507 | tslint-config-prettier@^1.18.0: 508 | version "1.18.0" 509 | resolved "https://registry.yarnpkg.com/tslint-config-prettier/-/tslint-config-prettier-1.18.0.tgz#75f140bde947d35d8f0d238e0ebf809d64592c37" 510 | integrity sha512-xPw9PgNPLG3iKRxmK7DWr+Ea/SzrvfHtjFt5LBl61gk2UBG/DB9kCXRjv+xyIU1rUtnayLeMUVJBcMX8Z17nDg== 511 | 512 | tslint-plugin-prettier@^2.0.1: 513 | version "2.0.1" 514 | resolved "https://registry.yarnpkg.com/tslint-plugin-prettier/-/tslint-plugin-prettier-2.0.1.tgz#95b6a3b766622ffc44375825d7760225c50c3680" 515 | integrity sha512-4FX9JIx/1rKHIPJNfMb+ooX1gPk5Vg3vNi7+dyFYpLO+O57F4g+b/fo1+W/G0SUOkBLHB/YKScxjX/P+7ZT/Tw== 516 | dependencies: 517 | eslint-plugin-prettier "^2.2.0" 518 | lines-and-columns "^1.1.6" 519 | tslib "^1.7.1" 520 | 521 | tslint@^5.18.0: 522 | version "5.18.0" 523 | resolved "https://registry.yarnpkg.com/tslint/-/tslint-5.18.0.tgz#f61a6ddcf372344ac5e41708095bbf043a147ac6" 524 | integrity sha512-Q3kXkuDEijQ37nXZZLKErssQVnwCV/+23gFEMROi8IlbaBG6tXqLPQJ5Wjcyt/yHPKBC+hD5SzuGaMora+ZS6w== 525 | dependencies: 526 | "@babel/code-frame" "^7.0.0" 527 | builtin-modules "^1.1.1" 528 | chalk "^2.3.0" 529 | commander "^2.12.1" 530 | diff "^3.2.0" 531 | glob "^7.1.1" 532 | js-yaml "^3.13.1" 533 | minimatch "^3.0.4" 534 | mkdirp "^0.5.1" 535 | resolve "^1.3.2" 536 | semver "^5.3.0" 537 | tslib "^1.8.0" 538 | tsutils "^2.29.0" 539 | 540 | tsutils@^2.29.0: 541 | version "2.29.0" 542 | resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-2.29.0.tgz#32b488501467acbedd4b85498673a0812aca0b99" 543 | integrity sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA== 544 | dependencies: 545 | tslib "^1.8.1" 546 | 547 | typechecker@^4.3.0: 548 | version "4.7.0" 549 | resolved "https://registry.yarnpkg.com/typechecker/-/typechecker-4.7.0.tgz#5249f427358f45b7250c4924fd4d01ed9ba435e9" 550 | integrity sha512-4LHc1KMNJ6NDGO+dSM/yNfZQRtp8NN7psYrPHUblD62Dvkwsp3VShsbM78kOgpcmMkRTgvwdKOTjctS+uMllgQ== 551 | dependencies: 552 | editions "^2.1.0" 553 | 554 | typescript@^3.5.2: 555 | version "3.5.2" 556 | resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.5.2.tgz#a09e1dc69bc9551cadf17dba10ee42cf55e5d56c" 557 | integrity sha512-7KxJovlYhTX5RaRbUdkAXN1KUZ8PwWlTzQdHV6xNqvuFOs7+WBo10TQUqT19Q/Jz2hk5v9TQDIhyLhhJY4p5AA== 558 | 559 | universalify@^0.1.0: 560 | version "0.1.2" 561 | resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" 562 | integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== 563 | 564 | uuid@^3.3.2: 565 | version "3.3.2" 566 | resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.2.tgz#1b4af4955eb3077c501c23872fc6513811587131" 567 | integrity sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA== 568 | 569 | wrappy@1: 570 | version "1.0.2" 571 | resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" 572 | integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= 573 | 574 | yn@^3.0.0: 575 | version "3.1.0" 576 | resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.0.tgz#fcbe2db63610361afcc5eb9e0ac91e976d046114" 577 | integrity sha512-kKfnnYkbTfrAdd0xICNFw7Atm8nKpLcLv9AZGEt+kczL/WQVai4e2V6ZN8U/O+iI6WrNuJjNNOyu4zfhl9D3Hg== 578 | --------------------------------------------------------------------------------