firmament-yargs
Version:
Typescript classes for building CLI node applications
200 lines • 8.32 kB
JavaScript
;
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
return c > 3 && r && Object.defineProperty(target, key, r), r;
};
var __metadata = (this && this.__metadata) || function (k, v) {
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
};
var __param = (this && this.__param) || function (paramIndex, decorator) {
return function (target, key) { decorator(target, key, paramIndex); }
};
Object.defineProperty(exports, "__esModule", { value: true });
const request = require("request");
const inversify_1 = require("inversify");
const path = require("path");
const fs = require("fs");
const nodeUrl = require("url");
const _ = require("lodash");
const __1 = require("..");
const fileExists = require('file-exists');
const async = require('async');
let RemoteCatalogGetterImpl = class RemoteCatalogGetterImpl extends __1.ForceErrorImpl {
constructor(commandUtil, safeJson) {
super();
this.commandUtil = commandUtil;
this.safeJson = safeJson;
}
getCatalogFromUrl(url, cb) {
const me = this;
cb = me.checkCallback(cb);
if (me.checkForceError('RemoteCatalogGetterImpl.getCatalogFromUrl', cb)) {
return;
}
me.getParsedUrl(url, (err, parsedUrl) => {
if (me.commandUtil.callbackIfError(cb, err)) {
return;
}
const baseUrl = (parsedUrl.protocol)
? `${parsedUrl.protocol}//${parsedUrl.hostname}${path.dirname(parsedUrl.path)}`
: path.dirname(parsedUrl.path);
me.getRemoteResource(parsedUrl, 'root', (err, remoteCatalogResource) => {
if (me.commandUtil.callbackIfError(cb, err)) {
return;
}
try {
const remoteCatalog = remoteCatalogResource.parsedObject;
const fnArray = [];
async.each(remoteCatalog.entries, (entry, cb) => {
async.each(entry.urls, (url, cb) => {
me.getParsedUrl(url, (err, parsedUrl) => {
if (me.commandUtil.callbackIfError(cb, err)) {
return;
}
if (!parsedUrl.protocol) {
url = path.isAbsolute(parsedUrl.path) ? parsedUrl.path : `${baseUrl}/${parsedUrl.path}`;
}
fnArray.push(async.apply(me.getRemoteResource.bind(me), url, entry.name));
});
cb();
}, (err) => {
me.commandUtil.logError(err);
cb();
});
}, (err) => {
if (me.commandUtil.callbackIfError(cb, err)) {
return;
}
async.parallel(fnArray, (err, results) => {
if (me.commandUtil.callbackIfError(cb, err)) {
return;
}
remoteCatalog.entries.forEach(entry => {
entry.resources =
_.filter(results, { parentCatalogEntryName: entry.name });
});
cb(null, remoteCatalog);
});
});
}
catch (err) {
me.commandUtil.callbackIfError(cb, err);
}
});
});
}
getRemoteResource(url, parentCatalogEntryName, cb) {
const me = this;
cb = me.checkCallback(cb);
if (me.checkForceError('RemoteCatalogGetterImpl.getRemoteResource', cb)) {
return;
}
me.resolveTextResourceFromUrl(url, (err, text, absoluteUrl) => {
if (me.commandUtil.callbackIfError(cb, err)) {
return;
}
me.safeJson.safeParse(text, (err, parsedObject) => {
const name = path.basename(absoluteUrl);
cb(err, {
absoluteUrl,
name,
text,
parsedObject,
parentCatalogEntryName
});
});
});
}
resolveJsonObjectFromUrl(url, cb) {
const me = this;
cb = me.checkCallback(cb);
if (me.checkForceError('RemoteCatalogGetterImpl.resolveJsonObjectFromUrl', cb)) {
return;
}
me.resolveTextResourceFromUrl(url, (err, text, absoluteUrl) => {
if (me.commandUtil.callbackIfError(cb, err, undefined)) {
return;
}
me.safeJson.safeParse(text, (err, jsonObject) => {
cb(err, jsonObject, absoluteUrl);
});
});
}
resolveTextResourceFromUrl(url, cb) {
const me = this;
try {
me.throwException();
cb = me.checkCallback(cb);
if (me.checkForceError('RemoteCatalogGetterImpl.resolveTextResourceFromUrl', cb)) {
return;
}
me.getParsedUrl(url, (err, parsedUrl) => {
if (err) {
return cb(err, '', null);
}
try {
me.throwException();
if (!parsedUrl.protocol) {
const urlString = parsedUrl.path;
return fileExists(urlString, (err, exists) => {
if (!exists) {
return cb(new Error(`Url: '${url}' does not exist`), '', urlString);
}
fs.readFile(urlString, 'utf8', (err, data) => {
cb(err, data.toString(), urlString);
});
});
}
request(parsedUrl.href, (err, res, text) => {
if (err) {
return cb(err, '', parsedUrl.href);
}
if (res.statusCode !== 200) {
return cb(new Error(`Error retrieving '${parsedUrl.href}'`), '', parsedUrl.href);
}
return cb(null, text.toString(), parsedUrl.href);
});
}
catch (err) {
return cb(err, null);
}
});
}
catch (err) {
cb(err);
}
}
getParsedUrl(url, cb) {
const me = this;
try {
me.throwException();
cb = me.checkCallback(cb);
if (me.checkForceError('RemoteCatalogGetterImpl.getParsedUrl', cb)) {
return;
}
const url_ctor = url.constructor;
if (url_ctor.name === 'Url') {
return cb(null, url);
}
if (url_ctor.name === 'String') {
if (!url) {
return cb(new Error('Empty string is not a url'));
}
const parsedUrl = nodeUrl.parse(url);
return cb(null, parsedUrl);
}
}
catch (err) {
cb(err);
}
}
};
RemoteCatalogGetterImpl = __decorate([
__param(0, inversify_1.inject('CommandUtil')),
__param(1, inversify_1.inject('SafeJson')),
__metadata("design:paramtypes", [Object, Object])
], RemoteCatalogGetterImpl);
exports.RemoteCatalogGetterImpl = RemoteCatalogGetterImpl;
//# sourceMappingURL=remote-catalog-impl.js.map