UNPKG

lizi-wxapp-cli

Version:

微信小程序快速创建cli脚手架

246 lines 35 kB
"use strict"; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); const inquirer_autocomplete_prompt_1 = __importDefault(require("@moyuyc/inquirer-autocomplete-prompt")); const chalk_1 = __importDefault(require("chalk")); const fuzzy_1 = __importDefault(require("fuzzy")); const inquirer_1 = __importDefault(require("inquirer")); const json_format_1 = __importDefault(require("json-format")); const ora_1 = __importDefault(require("ora")); const path_1 = __importDefault(require("path")); const ulits_1 = require("../ulits/ulits"); const base_1 = __importDefault(require("./base")); class Create extends base_1.default { constructor() { super(); this._name = ''; this._isSubpackage = false; this._selectSubpackage = ''; this.newItemRoot = ''; this.newItemJsonRoot = ''; this.newItemJsonName = ''; } init() { return __awaiter(this, void 0, void 0, function* () { yield this.getAppJson(); inquirer_1.default.registerPrompt('autocomplete', inquirer_autocomplete_prompt_1.default); inquirer_1.default.prompt([ this.__checkName(), this.__isSubPackage(), this.__modifyName(), this.__selectSubPackage(), this.__createSubPackage(), this.__modifySubPackageChildName(), this.__isIndependent() ]).then((answers) => { let { name, isSubpackage, selectSubpackage, createMain, isIndependent } = answers; this._name = name; this._isSubpackage = isSubpackage; this._selectSubpackage = selectSubpackage; this._createMain = createMain; this._isIndependent = isIndependent; }).then(() => this.create()).catch((error) => { console.log(error); }); }); } create() { return __awaiter(this, void 0, void 0, function* () { const loading = ora_1.default(`creating ${this.typeRoot}...`).start(); loading.text = `创建${this.typeName}目录`; yield this.makeProjectDir(); loading.text = `正在创建${this.typeName}文件`; yield this.copyProjectFiles(); loading.text = '正在修改【app.json】文件'; yield this.modifyAppJson(); return Promise.resolve(loading); }); } makeProjectDir() { return __awaiter(this, void 0, void 0, function* () { let newItemRoot = path_1.default.join(this.projectRoot, this.typeRoot, this._name); if (this._isSubpackage) { let name = this._selectSubpackage === '新增分包' && this._createMain ? path_1.default.join(this.subpackageRoot, this._createMain) : this._selectSubpackage; newItemRoot = path_1.default.join(this.projectRoot, name, this.typeRoot, this._name); } this.newItemRoot = newItemRoot; if (!(yield this.checkFileIsExists(newItemRoot))) this.makeDir(newItemRoot); }); } copyProjectFiles() { this.getProjectConfig().then(() => __awaiter(this, void 0, void 0, function* () { const copyRoot = path_1.default.join(this.templateRoot, 'component'); yield this.copyFilesArr(copyRoot, this.newItemRoot, ['index.wxml', 'index.json']) .catch(({ result }) => this.fileIsRepeat(result)); this._copyTypeFiles(copyRoot, this.projectMode); this._copyTypeFiles(copyRoot, this.projectCss); })); } modifyAppJson() { return __awaiter(this, void 0, void 0, function* () { let newItemJson = path_1.default.join(this.typeRoot, this._name, 'index').split(path_1.default.sep).join('/'); let newItemName = this._name; if (this._isSubpackage) { if (this._selectSubpackage === '新增分包' && this._createMain) { this.AppJson.subpackages.push({ root: path_1.default.join(this.subpackageRoot, this._createMain), pages: this.typeRoot === 'pages' ? [newItemJson] : [], components: this.typeRoot === 'components' ? [newItemJson] : [], isIndependent: this._isIndependent }); newItemName = path_1.default.join(this._createMain, this._name); newItemJson = path_1.default.join(this.subpackageRoot, this._createMain, newItemJson); } else { let index = this.subRoots.findIndex(v => v === this._selectSubpackage); this.AppJson.subpackages[index][this.typeRoot].push(newItemJson); newItemName = path_1.default.join(this._selectSubpackage.replace(this.subpackageRoot + '/', ''), this._name); newItemJson = path_1.default.join(this._selectSubpackage, newItemJson); } } else { this.AppJson[this.typeRoot].push(newItemJson); } this.newItemJsonRoot = newItemJson.split(path_1.default.sep).join('/'); this.newItemJsonName = newItemName.split(path_1.default.sep).join('/'); yield this.writeFile(this.projectRoot, 'app.json', json_format_1.default(this.AppJson)); }); } _copyTypeFiles(copyRoot, type) { return __awaiter(this, void 0, void 0, function* () { const root = path_1.default.join(copyRoot, type); const files = yield this.readDirs(root); yield this.copyFilesArr(root, this.newItemRoot, files) .catch(({ result }) => this.fileIsRepeat(result)); }); } __checkName() { return { type: 'input', name: 'name', message: `请输入${this.typeName}名:`, validate: (input) => { return new Promise((resolve) => { if (!ulits_1.regName.test(input)) resolve(chalk_1.default.red(`输入的${this.typeName}名不正确!`)); resolve(true); }); } }; } __isSubPackage() { return { type: 'confirm', name: 'isSubpackage', message: `当前${this.typeName}是否分包:`, default: false }; } __modifyName() { return { type: 'input', name: 'name', message: answer => `【${this.typeRoot}】中已存在【${answer.name}】${this.typeName},请重新输入${this.typeName}名:`, when: answer => { return !answer.isSubpackage && this.mainRoots.find(v => v === answer.name) !== undefined; }, validate: (input) => { return new Promise(resolve => { if (this.mainRoots.find(v => v === input)) resolve(chalk_1.default.red(`${this.typeName}名重复,请更换!`)); resolve(true); }); } }; } __selectSubPackage() { return { type: 'autocomplete', name: 'selectSubpackage', message: `选择${this.typeName}所属分包:`, choices: [], suggestOnly: false, source: (_answers, input) => { return Promise.resolve(fuzzy_1.default.filter(input, ['新增分包', ...this.subRoots]).map(e => e.original)); }, when: (answer) => { return answer.isSubpackage && this.subRoots.length >= 0; } }; } __createSubPackage() { return { type: 'input', name: 'createMain', message: '创建新的分包:', when: (answer) => { return answer.isSubpackage && this.subRoots.length <= 0 || answer.selectSubpackage === '新增分包'; }, validate: (input) => { return new Promise(resolve => { if (!ulits_1.regName.test(input)) { resolve(chalk_1.default.red('输入的分包名不正确!')); } else if (this.subRoots.find(v => v === input)) resolve(chalk_1.default.red('该分包已存在,请换个分包名!')); resolve(true); }); } }; } __modifySubPackageChildName() { return { type: 'input', name: 'name', message: answer => `【${answer.selectSubpackage}】分包已存在【${answer.name}】${this.typeName},请更换${this.typeName}名:`, when: answer => { return answer.isSubpackage && answer.selectSubpackage !== '新增分包' && this.subChild[answer.selectSubpackage].find(v => v === answer.name) !== undefined; }, validate: (input, answers) => { return new Promise(resolve => { if (!ulits_1.regName.test(input)) { resolve(chalk_1.default.red(`输入的${this.typeName}名不正确!`)); } else if (this.subChild[answers.selectSubpackage].find(v => v === input)) { resolve(chalk_1.default.red(`${this.typeName}名重复,请更换${this.typeName}名!`)); } resolve(true); }); } }; } __isIndependent() { return { type: 'confirm', name: 'isIndependent', message: '是否设置独立分包:', default: false, when: (answers) => { return answers.isSubpackage && answers.selectSubpackage === '新增分包' && answers.createMain; } }; } } exports.default = Create; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiY3JlYXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7QUFBQSx3R0FBK0Q7QUFDL0Qsa0RBQXlCO0FBQ3pCLGtEQUF5QjtBQUN6Qix3REFBNEU7QUFDNUUsOERBQW9DO0FBQ3BDLDhDQUE4QjtBQUM5QixnREFBdUI7QUFDdkIsMENBQXdDO0FBQ3hDLGtEQUF5QjtBQWV6QixNQUE4QixNQUFPLFNBQVEsY0FBSTtJQVUvQztRQUNFLEtBQUssRUFBRSxDQUFBO1FBVkMsVUFBSyxHQUFXLEVBQUUsQ0FBQTtRQUNsQixrQkFBYSxHQUFZLEtBQUssQ0FBQTtRQUM5QixzQkFBaUIsR0FBVyxFQUFFLENBQUE7UUFHOUIsZ0JBQVcsR0FBVyxFQUFFLENBQUE7UUFDeEIsb0JBQWUsR0FBVyxFQUFFLENBQUE7UUFDNUIsb0JBQWUsR0FBVyxFQUFFLENBQUE7SUFJdEMsQ0FBQztJQUVZLElBQUk7O1lBQ2YsTUFBTSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUE7WUFFdkIsa0JBQVEsQ0FBQyxjQUFjLENBQUMsY0FBYyxFQUFFLHNDQUFZLENBQUMsQ0FBQTtZQUNyRCxrQkFBUSxDQUFDLE1BQU0sQ0FBQztnQkFDZCxJQUFJLENBQUMsV0FBVyxFQUFFO2dCQUNsQixJQUFJLENBQUMsY0FBYyxFQUFFO2dCQUNyQixJQUFJLENBQUMsWUFBWSxFQUFFO2dCQUNuQixJQUFJLENBQUMsa0JBQWtCLEVBQUU7Z0JBQ3pCLElBQUksQ0FBQyxrQkFBa0IsRUFBRTtnQkFDekIsSUFBSSxDQUFDLDJCQUEyQixFQUFFO2dCQUNsQyxJQUFJLENBQUMsZUFBZSxFQUFFO2FBQ3ZCLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFZLEVBQUUsRUFBRTtnQkFDdkIsSUFBSSxFQUFDLElBQUksRUFBRSxZQUFZLEVBQUUsZ0JBQWdCLEVBQUUsVUFBVSxFQUFFLGFBQWEsRUFBQyxHQUFHLE9BQU8sQ0FBQTtn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O0lBQ0gsQ0FBQztJQUdPLGVBQWU7UUFDckIsT0FBTztZQUNMLElBQUksRUFBRSxTQUFTO1lBQ2YsSUFBSSxFQUFFLGVBQWU7WUFDckIsT0FBTyxFQUFFLFdBQVc7WUFDcEIsT0FBTyxFQUFFLEtBQUs7WUFDZCxJQUFJLEVBQUUsQ0FBQyxPQUFPLEVBQUUsRUFBRTtnQkFDaEIsT0FBTyxPQUFPLENBQUMsWUFBWTtvQkFDekIsT0FBTyxDQUFDLGdCQUFnQixLQUFLLE1BQU07b0JBQ25DLE9BQU8sQ0FBQyxVQUFVLENBQUE7WUFDdEIsQ0FBQztTQUNGLENBQUE7SUFDSCxDQUFDO0NBRUY7QUFqUEQseUJBaVBDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGF1dG9jb21wbGV0ZSBmcm9tICdAbW95dXljL2lucXVpcmVyLWF1dG9jb21wbGV0ZS1wcm9tcHQnXG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnXG5pbXBvcnQgZnV6enkgZnJvbSAnZnV6enknXG5pbXBvcnQgaW5xdWlyZXIsIHsgQW5zd2VycywgQ29uZmlybVF1ZXN0aW9uLCBJbnB1dFF1ZXN0aW9uIH0gZnJvbSAnaW5xdWlyZXInXG5pbXBvcnQganNvbkZvcm1hdCBmcm9tICdqc29uLWZvcm1hdCdcbmltcG9ydCBvcmEsIHsgT3JhIH0gZnJvbSAnb3JhJ1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCdcbmltcG9ydCB7IHJlZ05hbWUgfSBmcm9tICcuLi91bGl0cy91bGl0cydcbmltcG9ydCBCYXNlIGZyb20gJy4vYmFzZSdcblxuaW50ZXJmYWNlIENyZWF0ZUZzIHtcbiAgaW5pdCgpOiBQcm9taXNlPHZvaWQ+XG5cbiAgbWFrZVByb2plY3REaXIoKTogUHJvbWlzZTxhbnk+XG5cbiAgY29weVByb2plY3RGaWxlcygpOiB2b2lkXG5cbiAgbW9kaWZ5QXBwSnNvbigpOiBQcm9taXNlPHZvaWQ+XG5cbiAgY3JlYXRlKCk6IFByb21pc2U8T3JhPlxuXG59XG5cbmV4cG9ydCBkZWZhdWx0IGFic3RyYWN0IGNsYXNzIENyZWF0ZSBleHRlbmRzIEJhc2UgaW1wbGVtZW50cyBDcmVhdGVGcyB7XG4gIHByb3RlY3RlZCBfbmFtZTogc3RyaW5nID0gJydcbiAgcHJvdGVjdGVkIF9pc1N1YnBhY2thZ2U6IGJvb2xlYW4gPSBmYWxzZVxuICBwcm90ZWN0ZWQgX3NlbGVjdFN1YnBhY2thZ2U6IHN0cmluZyA9ICcnXG4gIHByb3RlY3RlZCBfY3JlYXRlTWFpbj86IHN0cmluZ1xuICBwcm90ZWN0ZWQgX2lzSW5kZXBlbmRlbnQ/OiBib29sZWFuXG4gIHByb3RlY3RlZCBuZXdJdGVtUm9vdDogc3RyaW5nID0gJydcbiAgcHJvdGVjdGVkIG5ld0l0ZW1Kc29uUm9vdDogc3RyaW5nID0gJydcbiAgcHJvdGVjdGVkIG5ld0l0ZW1Kc29uTmFtZTogc3RyaW5nID0gJydcblxuICBwcm90ZWN0ZWQgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKVxuICB9XG5cbiAgcHVibGljIGFzeW5jIGluaXQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5nZXRBcHBKc29uKClcbiAgICAvLyDms6jlhozmj5Lku7ZcbiAgICBpbnF1aXJlci5yZWdpc3RlclByb21wdCgnYXV0b2NvbXBsZXRlJywgYXV0b2NvbXBsZXRlKVxuICAgIGlucXVpcmVyLnByb21wdChbXG4gICAgICB0aGlzLl9fY2hlY2tOYW1lKCksXG4gICAgICB0aGlzLl9faXNTdWJQYWNrYWdlKCksXG4gICAgICB0aGlzLl9fbW9kaWZ5TmFtZSgpLFxuICAgICAgdGhpcy5fX3NlbGVjdFN1YlBhY2thZ2UoKSxcbiAgICAgIHRoaXMuX19jcmVhdGVTdWJQYWNrYWdlKCksXG4gICAgICB0aGlzLl9fbW9kaWZ5U3ViUGFja2FnZUNoaWxkTmFtZSgpLFxuICAgICAgdGhpcy5fX2lzSW5kZXBlbmRlbnQoKVxuICAgIF0pLnRoZW4oKGFuc3dlcnM6IGFueSkgPT4ge1xuICAgICAgbGV0IHtuYW1lLCBpc1N1YnBhY2thZ2UsIHNlbGVjdFN1YnBhY2thZ2UsIGNyZWF0ZU1haW4sIGlzSW5kZXBlbmRlbnR9ID0gYW5zd2Vyc1xuICAgICAgdGhpcy5fbmFtZSA9IG5hbWVcbiAgICAgIHRoaXMuX2lzU3VicGFja2FnZSA9IGlzU3VicGFja2FnZVxuICAgICAgdGhpcy5fc2VsZWN0U3VicGFja2FnZSA9IHNlbGVjdFN1YnBhY2thZ2VcbiAgICAgIHRoaXMuX2NyZWF0ZU1haW4gPSBjcmVhdGVNYWluXG4gICAgICB0aGlzLl9pc0luZGVwZW5kZW50ID0gaXNJbmRlcGVuZGVudFxuICAgIH0pLnRoZW4oKCkgPT4gdGhpcy5jcmVhdGUoKSkuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICBjb25zb2xlLmxvZyhlcnJvcilcbiAgICB9KVxuICB9XG5cbiAgcHVibGljIGFzeW5jIGNyZWF0ZSgpOiBQcm9taXNlPE9yYT4ge1xuICAgIGNvbnN0IGxvYWRpbmc6IE9yYSA9IG9yYShgY3JlYXRpbmcgJHt0aGlzLnR5cGVSb290fS4uLmApLnN0YXJ0KClcbiAgICBsb2FkaW5nLnRleHQgPSBg5Yib5bu6JHt0aGlzLnR5cGVOYW1lfeebruW9lWBcbiAgICBhd2FpdCB0aGlzLm1ha2VQcm9qZWN0RGlyKClcbiAgICBsb2FkaW5nLnRleHQgPSBg5q2j5Zyo5Yib5bu6JHt0aGlzLnR5cGVOYW1lfeaWh+S7tmBcbiAgICBhd2FpdCB0aGlzLmNvcHlQcm9qZWN0RmlsZXMoKVxuICAgIGxvYWRpbmcudGV4dCA9ICfmraPlnKjkv67mlLnjgJBhcHAuanNvbuOAkeaWh+S7tidcbiAgICBhd2FpdCB0aGlzLm1vZGlmeUFwcEpzb24oKVxuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUobG9hZGluZylcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBtYWtlUHJvamVjdERpcigpOiBQcm9taXNlPGFueT4ge1xuICAgIC8vIOm7mOiupOS4jeWIhuWMhVxuICAgIGxldCBuZXdJdGVtUm9vdCA9IHBhdGguam9pbih0aGlzLnByb2plY3RSb290LCB0aGlzLnR5cGVSb290LCB0aGlzLl9uYW1lKVxuICAgIC8vIOWmguaenOWIhuWMhVxuICAgIGlmICh0aGlzLl9pc1N1YnBhY2thZ2UpIHtcbiAgICAgIGxldCBuYW1lOiBzdHJpbmcgPSB0aGlzLl9zZWxlY3RTdWJwYWNrYWdlID09PSAn5paw5aKe5YiG5YyFJyAmJiB0aGlzLl9jcmVhdGVNYWluID9cbiAgICAgICAgcGF0aC5qb2luKHRoaXMuc3VicGFja2FnZVJvb3QsIHRoaXMuX2NyZWF0ZU1haW4pIDpcbiAgICAgICAgdGhpcy5fc2VsZWN0U3VicGFja2FnZVxuICAgICAgbmV3SXRlbVJvb3QgPSBwYXRoLmpvaW4odGhpcy5wcm9qZWN0Um9vdCwgbmFtZSwgdGhpcy50eXBlUm9vdCwgdGhpcy5fbmFtZSlcbiAgICB9XG4gICAgdGhpcy5uZXdJdGVtUm9vdCA9IG5ld0l0ZW1Sb290XG4gICAgLy8g5Yik5pat5LiL5paH5Lu25piv5ZCm5a2Y5ZyoXG4gICAgaWYgKCFhd2FpdCB0aGlzLmNoZWNrRmlsZUlzRXhpc3RzKG5ld0l0ZW1Sb290KSkgdGhpcy5tYWtlRGlyKG5ld0l0ZW1Sb290KVxuICB9XG5cbiAgcHVibGljIGNvcHlQcm9qZWN0RmlsZXMoKTogdm9pZCB7XG4gICAgLy8g6K+75Y+WcHJvamVjdC5jb25maWcuanNvbuiOt+WPlumFjee9ruS/oeaBr1xuICAgIHRoaXMuZ2V0UHJvamVjdENvbmZpZygpLnRoZW4oYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgY29weVJvb3QgPSBwYXRoLmpvaW4odGhpcy50ZW1wbGF0ZVJvb3QsICdjb21wb25lbnQnKVxuICAgICAgLy8g5aSN5Yi2d3htbCxqc29u5paH5Lu2XG4gICAgICBhd2FpdCB0aGlzLmNvcHlGaWxlc0Fycihjb3B5Um9vdCwgdGhpcy5uZXdJdGVtUm9vdCwgWydpbmRleC53eG1sJywgJ2luZGV4Lmpzb24nXSlcbiAgICAgICAgLmNhdGNoKCh7cmVzdWx0fSkgPT4gdGhpcy5maWxlSXNSZXBlYXQocmVzdWx0KSlcbiAgICAgIC8vIOWkjeWItuiEmuacrOaWh+S7tlxuICAgICAgdGhpcy5fY29weVR5cGVGaWxlcyhjb3B5Um9vdCwgdGhpcy5wcm9qZWN0TW9kZSlcbiAgICAgIC8vIOWkjeWItuagt+W8j+aWh+S7tlxuICAgICAgdGhpcy5fY29weVR5cGVGaWxlcyhjb3B5Um9vdCwgdGhpcy5wcm9qZWN0Q3NzKVxuICAgIH0pXG4gIH1cblxuICBwdWJsaWMgYXN5bmMgbW9kaWZ5QXBwSnNvbigpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyDmmK/lkKbliIbljIVcbiAgICBsZXQgbmV3SXRlbUpzb246IHN0cmluZyA9IHBhdGguam9pbih0aGlzLnR5cGVSb290LCB0aGlzLl9uYW1lLCAnaW5kZXgnKS5zcGxpdChwYXRoLnNlcCkuam9pbignLycpXG4gICAgbGV0IG5ld0l0ZW1OYW1lOiBzdHJpbmcgPSB0aGlzLl9uYW1lXG4gICAgaWYgKHRoaXMuX2lzU3VicGFja2FnZSkge1xuICAgICAgaWYgKHRoaXMuX3NlbGVjdFN1YnBhY2thZ2UgPT09ICfmlrDlop7liIbljIUnICYmIHRoaXMuX2NyZWF0ZU1haW4pIHtcbiAgICAgICAgdGhpcy5BcHBKc29uLnN1YnBhY2thZ2VzLnB1c2goe1xuICAgICAgICAgIHJvb3Q6IHBhdGguam9pbih0aGlzLnN1YnBhY2thZ2VSb290LCB0aGlzLl9jcmVhdGVNYWluKSxcbiAgICAgICAgICBwYWdlczogdGhpcy50eXBlUm9vdCA9PT0gJ3BhZ2VzJyA/IFtuZXdJdGVtSnNvbl0gOiBbXSxcbiAgICAgICAgICBjb21wb25lbnRzOiB0aGlzLnR5cGVSb290ID09PSAnY29tcG9uZW50cycgPyBbbmV3SXRlbUpzb25dIDogW10sXG4gICAgICAgICAgaXNJbmRlcGVuZGVudDogdGhpcy5faXNJbmRlcGVuZGVudFxuICAgICAgICB9KVxuICAgICAgICBuZXdJdGVtTmFtZSA9IHBhdGguam9pbih0aGlzLl9jcmVhdGVNYWluLCB0aGlzLl9uYW1lKVxuICAgICAgICBuZXdJdGVtSnNvbiA9IHBhdGguam9pbih0aGlzLnN1YnBhY2thZ2VSb290LCB0aGlzLl9jcmVhdGVNYWluLCBuZXdJdGVtSnNvbilcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxldCBpbmRleDogbnVtYmVyID0gdGhpcy5zdWJSb290cy5maW5kSW5kZXgodiA9PiB2ID09PSB0aGlzLl9zZWxlY3RTdWJwYWNrYWdlKVxuICAgICAgICB0aGlzLkFwcEpzb24uc3VicGFja2FnZXNbaW5kZXhdW3RoaXMudHlwZVJvb3RdLnB1c2gobmV3SXRlbUpzb24pXG4gICAgICAgIG5ld0l0ZW1OYW1lID0gcGF0aC5qb2luKHRoaXMuX3NlbGVjdFN1YnBhY2thZ2UucmVwbGFjZSh0aGlzLnN1YnBhY2thZ2VSb290ICsgJy8nLCAnJyksIHRoaXMuX25hbWUpXG4gICAgICAgIG5ld0l0ZW1Kc29uID0gcGF0aC5qb2luKHRoaXMuX3NlbGVjdFN1YnBhY2thZ2UsIG5ld0l0ZW1Kc29uKVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLkFwcEpzb25bdGhpcy50eXBlUm9vdF0ucHVzaChuZXdJdGVtSnNvbilcbiAgICB9XG4gICAgdGhpcy5uZXdJdGVtSnNvblJvb3QgPSBuZXdJdGVtSnNvbi5zcGxpdChwYXRoLnNlcCkuam9pbignLycpXG4gICAgdGhpcy5uZXdJdGVtSnNvbk5hbWUgPSBuZXdJdGVtTmFtZS5zcGxpdChwYXRoLnNlcCkuam9pbignLycpXG4gICAgYXdhaXQgdGhpcy53cml0ZUZpbGUodGhpcy5wcm9qZWN0Um9vdCwgJ2FwcC5qc29uJywganNvbkZvcm1hdCh0aGlzLkFwcEpzb24pKVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBfY29weVR5cGVGaWxlcyhjb3B5Um9vdCwgdHlwZSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHJvb3Q6IHN0cmluZyA9IHBhdGguam9pbihjb3B5Um9vdCwgdHlwZSlcbiAgICBjb25zdCBmaWxlczogc3RyaW5nW10gPSBhd2FpdCB0aGlzLnJlYWREaXJzKHJvb3QpXG4gICAgYXdhaXQgdGhpcy5jb3B5RmlsZXNBcnIocm9vdCwgdGhpcy5uZXdJdGVtUm9vdCwgZmlsZXMpXG4gICAgICAuY2F0Y2goKHtyZXN1bHR9KSA9PiB0aGlzLmZpbGVJc1JlcGVhdChyZXN1bHQpKVxuICB9XG5cbiAgLy8g6aqM6K+B5ZCN56ewXG4gIHByaXZhdGUgX19jaGVja05hbWUoKTogSW5wdXRRdWVzdGlvbjxBbnN3ZXJzPiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHR5cGU6ICdpbnB1dCcsXG4gICAgICBuYW1lOiAnbmFtZScsXG4gICAgICBtZXNzYWdlOiBg6K+36L6T5YWlJHt0aGlzLnR5cGVOYW1lfeWQje+8mmAsXG4gICAgICB2YWxpZGF0ZTogKGlucHV0OiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4gfCBzdHJpbmc+ID0+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlPGJvb2xlYW4gfCBzdHJpbmc+KChyZXNvbHZlKSA9PiB7XG4gICAgICAgICAgLy8g6aqM6K+B5ZCN5piv5ZCm5q2j56GuXG4gICAgICAgICAgaWYgKCFyZWdOYW1lLnRlc3QoaW5wdXQpKSByZXNvbHZlKGNoYWxrLnJlZChg6L6T5YWl55qEJHt0aGlzLnR5cGVOYW1lfeWQjeS4jeato+ehru+8gWApKVxuICAgICAgICAgIHJlc29sdmUodHJ1ZSlcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyDmmK/lkKbliIbljIVcbiAgcHJpdmF0ZSBfX2lzU3ViUGFja2FnZSgpOiBDb25maXJtUXVlc3Rpb248QW5zd2Vycz4ge1xuICAgIHJldHVybiB7XG4gICAgICB0eXBlOiAnY29uZmlybScsXG4gICAgICBuYW1lOiAnaXNTdWJwYWNrYWdlJyxcbiAgICAgIG1lc3NhZ2U6IGDlvZPliY0ke3RoaXMudHlwZU5hbWV95piv5ZCm5YiG5YyF77yaYCxcbiAgICAgIGRlZmF1bHQ6IGZhbHNlXG4gICAgfVxuICB9XG5cbiAgLy8g5aaC5p6c5LiN5YiG5YyF77yM5Yik5pat5piv5ZCm6YeN5aSNXG4gIHByaXZhdGUgX19tb2RpZnlOYW1lKCk6IElucHV0UXVlc3Rpb248QW5zd2Vycz4ge1xuICAgIHJldHVybiB7XG4gICAgICB0eXBlOiAnaW5wdXQnLFxuICAgICAgbmFtZTogJ25hbWUnLFxuICAgICAgbWVzc2FnZTogYW5zd2VyID0+IGDjgJAke3RoaXMudHlwZVJvb3R944CR5Lit5bey5a2Y5Zyo44CQJHthbnN3ZXIubmFtZX3jgJEke3RoaXMudHlwZU5hbWV977yM6K+36YeN5paw6L6T5YWlJHt0aGlzLnR5cGVOYW1lfeWQje+8mmAsXG4gICAgICB3aGVuOiBhbnN3ZXIgPT4ge1xuICAgICAgICByZXR1cm4gIWFuc3dlci5pc1N1YnBhY2thZ2UgJiZcbiAgICAgICAgICB0aGlzLm1haW5Sb290cy5maW5kKHYgPT4gdiA9PT0gYW5zd2VyLm5hbWUpICE9PSB1bmRlZmluZWRcbiAgICAgIH0sXG4gICAgICB2YWxpZGF0ZTogKGlucHV0OiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4gfCBzdHJpbmc+ID0+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlPGJvb2xlYW4gfCBzdHJpbmc+KHJlc29sdmUgPT4ge1xuICAgICAgICAgIGlmICh0aGlzLm1haW5Sb290cy5maW5kKHYgPT4gdiA9PT0gaW5wdXQpKSByZXNvbHZlKGNoYWxrLnJlZChgJHt0aGlzLnR5cGVOYW1lfeWQjemHjeWkje+8jOivt+abtOaNou+8gWApKVxuICAgICAgICAgIHJlc29sdmUodHJ1ZSlcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyDpgInmi6nliIbljIVcbiAgcHJpdmF0ZSBfX3NlbGVjdFN1YlBhY2thZ2UoKTogb2JqZWN0IHtcbiAgICByZXR1cm4ge1xuICAgICAgdHlwZTogJ2F1dG9jb21wbGV0ZScsXG4gICAgICBuYW1lOiAnc2VsZWN0U3VicGFja2FnZScsXG4gICAgICBtZXNzYWdlOiBg6YCJ5oupJHt0aGlzLnR5cGVOYW1lfeaJgOWxnuWIhuWMhe+8mmAsXG4gICAgICBjaG9pY2VzOiBbXSxcbiAgICAgIHN1Z2dlc3RPbmx5OiBmYWxzZSxcbiAgICAgIHNvdXJjZTogKF9hbnN3ZXJzLCBpbnB1dDogc3RyaW5nKSA9PiB7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoZnV6enkuZmlsdGVyKGlucHV0LCBbJ+aWsOWinuWIhuWMhScsIC4uLnRoaXMuc3ViUm9vdHNdKS5tYXAoZSA9PiBlLm9yaWdpbmFsKSlcbiAgICAgIH0sXG4gICAgICB3aGVuOiAoYW5zd2VyKSA9PiB7XG4gICAgICAgIHJldHVybiBhbnN3ZXIuaXNTdWJwYWNrYWdlICYmXG4gICAgICAgICAgdGhpcy5zdWJSb290cy5sZW5ndGggPj0gMFxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIOWIm+W7uuWIhuWMhVxuICBwcml2YXRlIF9fY3JlYXRlU3ViUGFja2FnZSgpOiBJbnB1dFF1ZXN0aW9uPEFuc3dlcnM+IHtcbiAgICByZXR1cm4ge1xuICAgICAgdHlwZTogJ2lucHV0JyxcbiAgICAgIG5hbWU6ICdjcmVhdGVNYWluJyxcbiAgICAgIG1lc3NhZ2U6ICfliJvlu7rmlrDnmoTliIbljIXvvJonLFxuICAgICAgd2hlbjogKGFuc3dlcikgPT4ge1xuICAgICAgICByZXR1cm4gYW5zd2VyLmlzU3VicGFja2FnZSAmJlxuICAgICAgICAgIHRoaXMuc3ViUm9vdHMubGVuZ3RoIDw9IDAgfHxcbiAgICAgICAgICBhbnN3ZXIuc2VsZWN0U3VicGFja2FnZSA9PT0gJ+aWsOWinuWIhuWMhSdcbiAgICAgIH0sXG4gICAgICB2YWxpZGF0ZTogKGlucHV0OiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4gfCBzdHJpbmc+ID0+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlPGJvb2xlYW4gfCBzdHJpbmc+KHJlc29sdmUgPT4ge1xuICAgICAgICAgIC8vIOmqjOivgeWQjeaYr+WQpuato+ehrlxuICAgICAgICAgIGlmICghcmVnTmFtZS50ZXN0KGlucHV0KSkge1xuICAgICAgICAgICAgcmVzb2x2ZShjaGFsay5yZWQoJ+i+k+WFpeeahOWIhuWMheWQjeS4jeato+ehru+8gScpKVxuICAgICAgICAgIH0vLyDmo4Dmn6XliIbljIXlkI3mmK/lkKbph43lpI1cbiAgICAgICAgICBlbHNlIGlmICh0aGlzLnN1YlJvb3RzLmZpbmQodiA9PiB2ID09PSBpbnB1dCkpIHJlc29sdmUoY2hhbGsucmVkKCfor6XliIbljIXlt7LlrZjlnKjvvIzor7fmjaLkuKrliIbljIXlkI3vvIEnKSlcbiAgICAgICAgICByZXNvbHZlKHRydWUpXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8g5YiG5YyF5LiL55qE5a2Q5YyF5aaC5p6c6YeN5aSN5YiZ6ZyA6KaB5L+u5pS55a2Q5YyF5ZCNXG4gIHByaXZhdGUgX19tb2RpZnlTdWJQYWNrYWdlQ2hpbGROYW1lKCk6IElucHV0UXVlc3Rpb248QW5zd2Vycz4ge1xuICAgIHJldHVybiB7XG4gICAgICB0eXBlOiAnaW5wdXQnLFxuICAgICAgbmFtZTogJ25hbWUnLFxuICAgICAgbWVzc2FnZTogYW5zd2VyID0+IGDjgJAke2Fuc3dlci5zZWxlY3RTdWJwYWNrYWdlfeOAkeWIhuWMheW3suWtmOWcqOOAkCR7YW5zd2VyLm5hbWV944CRJHt0aGlzLnR5cGVOYW1lfe+8jOivt+abtOaNoiR7dGhpcy50eXBlTmFtZX3lkI3vvJpgLFxuICAgICAgd2hlbjogYW5zd2VyID0+IHtcbiAgICAgICAgcmV0dXJuIGFuc3dlci5pc1N1YnBhY2thZ2UgJiZcbiAgICAgICAgICBhbnN3ZXIuc2VsZWN0U3VicGFja2FnZSAhPT0gJ+aWsOWinuWIhuWMhScgJiZcbiAgICAgICAgICB0aGlzLnN1YkNoaWxkW2Fuc3dlci5zZWxlY3RTdWJwYWNrYWdlXS5maW5kKHYgPT4gdiA9PT0gYW5zd2VyLm5hbWUpICE9PSB1bmRlZmluZWRcbiAgICAgIH0sXG4gICAgICB2YWxpZGF0ZTogKGlucHV0OiBzdHJpbmcsIGFuc3dlcnM6IGFueSk6IFByb21pc2U8Ym9vbGVhbiB8IHN0cmluZz4gPT4ge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2U8Ym9vbGVhbiB8IHN0cmluZz4ocmVzb2x2ZSA9PiB7XG4gICAgICAgICAgLy8g6aqM6K+B5ZCN5piv5ZCm5q2j56GuXG4gICAgICAgICAgaWYgKCFyZWdOYW1lLnRlc3QoaW5wdXQpKSB7XG4gICAgICAgICAgICByZXNvbHZlKGNoYWxrLnJlZChg6L6T5YWl55qEJHt0aGlzLnR5cGVOYW1lfeWQjeS4jeato+ehru+8gWApKVxuICAgICAgICAgIH0vLyDpqozor4HmmK/lkKbph43lpI1cbiAgICAgICAgICBlbHNlIGlmICh0aGlzLnN1YkNoaWxkW2Fuc3dlcnMuc2VsZWN0U3VicGFja2FnZV0uZmluZCh2ID0+IHYgPT09IGlucHV0KSkge1xuICAgICAgICAgICAgcmVzb2x2ZShjaGFsay5yZWQoYCR7dGhpcy50eXBlTmFtZX3lkI3ph43lpI3vvIzor7fmm7TmjaIke3RoaXMudHlwZU5hbWV95ZCN77yBYCkpXG4gICAgICAgICAgfVxuICAgICAgICAgIHJlc29sdmUodHJ1ZSlcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyDmlrDlop7liIbljIXmmK/lkKbkuLrni6znq4vliIbljIVcbiAgcHJpdmF0ZSBfX2lzSW5kZXBlbmRlbnQoKTogQ29uZmlybVF1ZXN0aW9uPEFuc3dlcnM+IHtcbiAgICByZXR1cm4ge1xuICAgICAgdHlwZTogJ2NvbmZpcm0nLFxuICAgICAgbmFtZTogJ2lzSW5kZXBlbmRlbnQnLFxuICAgICAgbWVzc2FnZTogJ+aYr+WQpuiuvue9rueLrOeri+WIhuWMhe+8micsXG4gICAgICBkZWZhdWx0OiBmYWxzZSxcbiAgICAgIHdoZW46IChhbnN3ZXJzKSA9PiB7XG4gICAgICAgIHJldHVybiBhbnN3ZXJzLmlzU3VicGFja2FnZSAmJlxuICAgICAgICAgIGFuc3dlcnMuc2VsZWN0U3VicGFja2FnZSA9PT0gJ+aWsOWinuWIhuWMhScgJiZcbiAgICAgICAgICBhbnN3ZXJzLmNyZWF0ZU1haW5cbiAgICAgIH1cbiAgICB9XG4gIH1cblxufVxuIl19