codess
Version:
vscode代码片段管理器,通过 本地包(本地某个文件夹) 或官网的 远程包(代码片段集合) 生成本地项目的 vscode 代码片段配置。
156 lines (155 loc) • 7.6 kB
JavaScript
;
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);
});
}