UNPKG

firmament-yargs

Version:

Typescript classes for building CLI node applications

200 lines 8.32 kB
"use strict"; 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