ghinfo
Version:
CLI util for generating a GitHub project information file
107 lines (106 loc) • 5.03 kB
JavaScript
var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
if (kind === "m") throw new TypeError("Private method is not writable");
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
};
var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
};
var _Builder_dir, _Builder_frame, _Builder_message, _Builder_timer, _Builder_type;
import figures from 'figures';
import { promises as fs } from 'fs';
import { glob } from 'glob';
import { Package } from 'package-json-helper';
import gh from 'parse-github-url';
import path from 'path';
import UpdateManager from 'stdout-update';
import { AvailableMediaFile } from './types.js';
const TIMEOUT = 80;
const INDENT = 2;
const manager = UpdateManager.getInstance();
const frames = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'];
const GLOB_OPTIONS = { dot: true, strict: true, nodir: true };
export class Builder {
constructor(dir, type) {
_Builder_dir.set(this, void 0);
_Builder_frame.set(this, 0);
_Builder_message.set(this, '');
_Builder_timer.set(this, null);
_Builder_type.set(this, void 0);
__classPrivateFieldSet(this, _Builder_dir, dir, "f");
__classPrivateFieldSet(this, _Builder_type, type, "f");
}
async generate() {
this.start();
try {
const paths = glob.sync(`${__classPrivateFieldGet(this, _Builder_dir, "f")}/**/*.*`, GLOB_OPTIONS);
const pkg = new Package();
await pkg.read();
if (pkg.repository?.url) {
const git = gh(pkg.repository?.url);
if (git && git.repo) {
await fs.writeFile('.ghinfo', JSON.stringify(this.build(paths, pkg, git.repo), null, INDENT));
this.end();
}
else {
throw new Error('Invalid package repository url!');
}
}
else {
throw new Error('Package repository is undefined!');
}
}
catch (error) {
if (error instanceof Error) {
this.end([`${figures.cross} Error!`]);
throw error;
}
}
}
build(paths, pkg, repo) {
const { name, version, description, homepage } = pkg;
const availableFiles = Object.values(AvailableMediaFile);
if (!name)
throw new Error('Package name is undefined!');
if (!version)
throw new Error('Package name is undefined!');
if (!description)
throw new Error('Package name is undefined!');
return {
name,
version,
description,
keywords: [...pkg.keywords.values()],
repo,
type: __classPrivateFieldGet(this, _Builder_type, "f"),
links: {
homepage,
git: `https://github.com/${repo}`,
...(pkg.private ? {} : { npm: `https://www.npmjs.com/package/${name}` }),
},
files: paths.reduce((acc, filePath) => {
const { name: fileName } = path.parse(filePath);
return ~availableFiles.indexOf(fileName) ? { ...acc, [fileName]: filePath } : acc;
}, {}),
};
}
end(msg = [`${figures.tick} .ghinfo created!`]) {
if (__classPrivateFieldGet(this, _Builder_timer, "f")) {
clearInterval(__classPrivateFieldGet(this, _Builder_timer, "f"));
manager.update(msg, 0);
manager.unhook(false);
}
}
start() {
manager.hook();
__classPrivateFieldSet(this, _Builder_timer, setInterval(() => {
var _a;
manager.update([`${frames[(__classPrivateFieldSet(this, _Builder_frame, __classPrivateFieldSet(this, _Builder_frame, (_a = __classPrivateFieldGet(this, _Builder_frame, "f"), ++_a), "f") % frames.length, "f"))]} process: ${__classPrivateFieldGet(this, _Builder_message, "f")}`]);
}, TIMEOUT), "f");
}
}
_Builder_dir = new WeakMap(), _Builder_frame = new WeakMap(), _Builder_message = new WeakMap(), _Builder_timer = new WeakMap(), _Builder_type = new WeakMap();
export default Builder;