UNPKG

@edools/epm

Version:

Edools apps management tool

379 lines (319 loc) 11.4 kB
var _createClass = require('babel-runtime/helpers/create-class')['default']; var _classCallCheck = require('babel-runtime/helpers/class-call-check')['default']; var _slicedToArray = require('babel-runtime/helpers/sliced-to-array')['default']; var _Object$assign = require('babel-runtime/core-js/object/assign')['default']; (function (global, factory) { typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('s3'), require('q'), require('rest'), require('rest/interceptor/pathPrefix'), require('rest/interceptor/mime'), require('rest/interceptor/defaultRequest'), require('rest/interceptor/errorCode'), require('ramda'), require('through2'), require('vinyl'), require('gulp-util')) : typeof define === 'function' && define.amd ? define(['exports', 's3', 'q', 'rest', 'rest/interceptor/pathPrefix', 'rest/interceptor/mime', 'rest/interceptor/defaultRequest', 'rest/interceptor/errorCode', 'ramda', 'through2', 'vinyl', 'gulp-util'], factory) : factory(global.index.js = {}, global.s3, global.Q, global.rest, global.pathPrefix, global.mime, global.defaultRequest, global.errorCode, global.R, global.through, global.File, global.gulp_util); })(this, function (exports, s3, Q, rest, pathPrefix, mime, defaultRequest, errorCode, R, through, File, gulp_util) { 'use strict'; Q = 'default' in Q ? Q['default'] : Q; rest = 'default' in rest ? rest['default'] : rest; pathPrefix = 'default' in pathPrefix ? pathPrefix['default'] : pathPrefix; mime = 'default' in mime ? mime['default'] : mime; defaultRequest = 'default' in defaultRequest ? defaultRequest['default'] : defaultRequest; errorCode = 'default' in errorCode ? errorCode['default'] : errorCode; R = 'default' in R ? R['default'] : R; through = 'default' in through ? through['default'] : through; File = 'default' in File ? File['default'] : File; var Source = (function () { function Source(file, release, config) { _classCallCheck(this, Source); this.file = file; this.release = release; this.config = config; this.client = this.createS3Client(config); } _createClass(Source, [{ key: 'remoteKey', get: function () { var release = this.release; return 'libs/edools-school/' + release.app + '/' + release.version + '/' + this.file.relative; } }, { key: 'createS3Client', value: function createS3Client(config) { return s3.createClient({ s3Options: config.s3Options }); } }, { key: 'upload', value: function upload() { var deferred = Q.defer(); var uploader = this.client.uploadFile({ localFile: this.file.base + this.file.relative, s3Params: { Bucket: this.config.s3Options.bucket, Key: this.remoteKey, ACL: 'public-read' } }); uploader.on('progress', function () { deferred.notify(uploader.progressAmount); }); uploader.on('error', deferred.reject); uploader.on('end', deferred.resolve); return deferred.promise; } }]); return Source; })(); function getDefaultHeaders(config) { return { Accept: 'application/vnd.edools.themes.v1+json', Authorization: 'Token token=' + config.token }; } function restClient(config) { return rest.wrap(mime).wrap(pathPrefix, { prefix: 'https://api.myedools.com' }).wrap(defaultRequest, { headers: getDefaultHeaders(config) }).wrap(errorCode, { code: 400 }).wrap(errorCode, { code: 404 }).wrap(errorCode, { code: 500 }); } var ThemeClient = (function () { function ThemeClient(config) { _classCallCheck(this, ThemeClient); this.client = restClient(config); } _createClass(ThemeClient, [{ key: 'update', value: function update(theme) { return this.client({ method: 'PUT', path: '/themes/' + theme.id, entity: { theme: theme }, headers: { 'Content-Type': 'application/json' } }); } }]); return ThemeClient; })(); var ReleaseClient = (function () { function ReleaseClient(config) { _classCallCheck(this, ReleaseClient); this.client = restClient(config); } _createClass(ReleaseClient, [{ key: 'getOne', value: function getOne(release) { return this.client('/apps/' + release.app + '/releases/' + release.version); } }, { key: 'getList', value: function getList(app) { return this.client('/apps/' + app + '/releases'); } }, { key: 'create', value: function create(release) { return this.client({ method: 'POST', path: '/apps/' + release.app + '/releases', entity: { app_release: release }, headers: { 'Content-Type': 'application/json' } }); } }, { key: 'update', value: function update(release) { return this.client({ method: 'PUT', path: '/apps/' + release.app + '/releases/' + release.version, entity: { app_release: release }, headers: { 'Content-Type': 'application/json' } }); } }, { key: 'remove', value: function remove(release) { return this.client({ method: 'DELETE', path: '/apps/' + release.app + '/releases/' + release.version }); } }]); return ReleaseClient; })(); var Release = (function () { function Release(config) { _classCallCheck(this, Release); _Object$assign(this, { app: config.app }); _Object$assign(this, config.manifest); this.client = new ReleaseClient(config); } _createClass(Release, [{ key: 'save', value: function save() { var _this = this; return this.exists().then(function () { return _this.client.update(_this); })['catch'](function () { return _this.client.create(_this); }); } }, { key: 'exists', value: function exists() { var deferred = Q.defer(); this.client.getOne(this).then(deferred.resolve)['catch'](deferred.reject); return deferred.promise; } }]); return Release; })(); var AppHandler = (function () { function AppHandler() { _classCallCheck(this, AppHandler); } _createClass(AppHandler, null, [{ key: 'deploy', value: function deploy(config, files) { var release = new Release(config), sources = R.map(function (file) { return new Source(file, release, config); }, files); return Q.all(R.map(function (source) { return source.upload(); }, sources)).then(function () { return release.save(); }); } }]); return AppHandler; })(); exports.AppHandler = AppHandler; var AppStream = (function () { function AppStream() { _classCallCheck(this, AppStream); } _createClass(AppStream, null, [{ key: 'deploy', value: function deploy(config) { return through.obj(function (file, enc, cb) { AppHandler.deploy(config, [file]).then(function () { return cb(null, file); })['catch'](function (err) { throw err; }); }); } }, { key: 'config', value: function config(manifest) { return through.obj(function (file, enc, cb) { var _file$relative$split = file.relative.split('.'); var _file$relative$split2 = _slicedToArray(_file$relative$split, 2); var prop = _file$relative$split2[0]; var extension = _file$relative$split2[1]; if (extension !== 'json') { throw new gulp_util.PluginError('epm', 'Config file must be a JSON'); } manifest[prop] = JSON.parse(file.contents.toString()); cb(); }, function (cb) { this.push(new File({ path: 'manifest.json', contents: new Buffer(JSON.stringify(manifest)) })); cb(); }); } }]); return AppStream; })(); exports.AppStream = AppStream; var Theme = (function () { function Theme(config) { _classCallCheck(this, Theme); this.id = config.id; this.package_url = config.package_url; this.client = new ThemeClient(config); this.schooljs_version = config.dependencies.bamboo; } _createClass(Theme, [{ key: 'deploy', value: function deploy(dependencies) { this.dependencies = dependencies; return this.client.update(this); } }]); return Theme; })(); var DepsResolver = (function () { function DepsResolver(config) { _classCallCheck(this, DepsResolver); this.releaseClient = new ReleaseClient(config); } _createClass(DepsResolver, [{ key: 'resolve', value: function resolve(dependencies) { var _this2 = this; return this.getDeps(dependencies).then(function (deps) { return _this2.format(deps); }); } }, { key: 'getDeps', value: function getDeps(dependencies) { var _this3 = this; dependencies = this.depsToArray(dependencies).filter(function (dep) { return dep.app !== 'bamboo'; }); return Q.all(R.map(function (dep) { return _this3.releaseClient.getOne(dep).then(function (res) { return res.entity; }); }, dependencies)); } }, { key: 'depsToArray', value: function depsToArray(dependencies) { return R.map(function (key) { return { app: key, version: dependencies[key] }; }, R.keys(dependencies)); } }, { key: 'format', value: function format(dependencies) { dependencies = R.concat(dependencies, this.getSubDeps(dependencies)); return R.reduce(function (acc, dep) { acc[dep.app || dep.name] = dep.version; return acc; }, {}, dependencies); } }, { key: 'getSubDeps', value: function getSubDeps(dependencies) { var _this4 = this; var subDeps = R.reduce(function (acc, dep) { return R.concat(acc, _this4.depsToArray(dep.dependencies)); }, [], dependencies); subDeps = R.uniqWith(function (dep1, dep2) { return dep1.app === dep2.app; }, subDeps); subDeps = R.filter(function (subDep) { return !R.contains(subDep.app, R.map(R.prop('name'), dependencies)); }, subDeps); return subDeps; } }]); return DepsResolver; })(); var ThemeHandler = (function () { function ThemeHandler() { _classCallCheck(this, ThemeHandler); } _createClass(ThemeHandler, null, [{ key: 'deploy', value: function deploy(config) { var theme = new Theme(config), depsResolver = new DepsResolver(config); return depsResolver.resolve(config.dependencies).then(function (dependencies) { return theme.deploy(dependencies); })['catch'](function (err) { throw err; }); } }]); return ThemeHandler; })(); exports.ThemeHandler = ThemeHandler; }); //# sourceMappingURL=./index.js.map