UNPKG

codess

Version:

vscode代码片段管理器,通过 本地包(本地某个文件夹) 或官网的 远程包(代码片段集合) 生成本地项目的 vscode 代码片段配置。

156 lines (155 loc) 7.6 kB
"use strict"; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } 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) : adopt(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 }); exports.search = search; const chalk_1 = __importDefault(require("chalk")); const inquirer_1 = __importDefault(require("inquirer")); const scopeConfig_1 = require("../config/scopeConfig"); const apiSnippets_1 = require("../http/apiSnippets"); const getRepository_1 = require("../http/getRepository"); const snippetsAPI_1 = require("../http/snippetsAPI"); const package_1 = require("../package"); const snippet_1 = require("../snippet"); const web_i_1 = require("../web_i"); const ArrayUtils_1 = require("../yayaluoya-tool/ArrayUtils"); const is_1 = require("../yayaluoya-tool/is"); function search(name, prefix = '', languages = '') { return snippetsAPI_1.SnippetsAPI.search(name) .then((res) => __awaiter(this, void 0, void 0, function* () { if (!(0, is_1.isArray)(res)) { console.table([res], ['name', 'version', 'prefix', 'home', 'repository', 'description']); let snippets = (0, apiSnippets_1.parseApiSnippets)((0, apiSnippets_1.apiSnippetsToTree)(res.snippets)); if (res.repository) { let packageConfig = (0, package_1.parsePackageNameStr)(res.repository); if (packageConfig && packageConfig.type == 'github') { snippets.push(...(yield (0, getRepository_1.getRepoSnippets)(packageConfig.op.repository, packageConfig.type).catch((e) => { console.log(res.name, chalk_1.default.red(`"${res.repository}" download error`)); console.log(e); return []; }))); } else { console.log(chalk_1.default.red(`${res.name}: repository "${res.repository}" is unrecognized`)); } } let c = (s) => { return s.filter((_) => { if (_.type == 'group' && _.children && (_.children = c(_.children)).length > 0) { return true; } if (_.type == 'snippet' && _.body.length > 0) { return true; } return false; }); }; let f = (s) => { if (!s || s.length <= 0) { return ''; } return s.reduce((a, b) => { a[b.prefix] = f(b.children); return a; }, {}); }; let jsonSnippets = (0, snippet_1.toSnippetConfig)(snippets); console.log(`There are ${Object.keys(jsonSnippets).length} snippets in this package`); let filter = (prefix_1, ...args_1) => __awaiter(this, [prefix_1, ...args_1], void 0, function* (prefix, ls = '') { let ls_ = ls .split(',') .filter(Boolean) .map((_) => (0, scopeConfig_1.suffixToScope)(_)); let list = (0, web_i_1.filterSnippets)(prefix, ls_, Object.keys(jsonSnippets).map((_) => { return Object.assign(Object.assign({}, jsonSnippets[_]), { key: _ }); })).map((item) => { let item_ = Object.assign(Object.assign({ rootLable: '', label: '' }, item.snippet), { key: item.snippet['key'] }); let labels = [...ArrayUtils_1.ArrayUtils.arraify(item_.prefix).join('')]; item_.rootLable = labels.join(''); for (let { start, end } of item.labelHighlights || []) { if (start == end) { continue; } for (let i = start + 1; i < end; i++) { labels[start] += labels[i]; labels[i] = ''; } labels[start] = chalk_1.default.red(labels[start]); } item_.label = labels.join(''); item_.body = ArrayUtils_1.ArrayUtils.arraify(item_.body).join('\n'); return item_; }); let maxLabelLenth = Math.max(...list.map((_) => _.rootLable.length)); list.forEach((_) => { _.label = _.label.padEnd(maxLabelLenth + _.label.length - _.rootLable.length, ' ') + ' ' + _.key; }); if (list.length > 0) { yield inquirer_1.default .prompt({ type: 'list', name: '_', message: `Select the snippet you want to view ['${prefix}' '${ls}'] (${list.length}):`, choices: list.map((_) => { return { value: _, name: _.label, }; }), }) .then(({ _ }) => { console.log([ `${chalk_1.default.green('##')} ${_.prefix}`, `#### ${_.key}`, _.description && chalk_1.default.gray(_.description), `\`\`\` ${_.scope || ''}`, _.body, `\`\`\``, ] .filter(Boolean) .join('\n')); }) .catch(() => ''); } else { console.log(chalk_1.default.yellow(`Not found snippet ['${prefix}' '${ls}']`)); } inquirer_1.default .prompt({ type: 'input', name: 'input', message: 'Please enter [prefix] [languages] to get the code snippet (empty quit):', }) .then(({ input }) => { if (input) { let s = input.split(/\s+/); filter(s[0], s[1] || languages); } }) .catch(() => ''); }); yield filter(prefix, languages); } else { console.log(chalk_1.default.yellow(`Search found ${res.length} similar package:\n`)); res.length > 0 && console.table(res, ['name', 'version', 'prefix', 'home', 'description']); } })) .catch((e) => { console.log(chalk_1.default.red('Search error:')); console.log(e); }); }