UNPKG

@serverless-devs/alireadme

Version:

This is a component demo for Serverless Devs Tool

254 lines 19 kB
"use strict"; var __assign = (this && this.__assign) || function () { __assign = Object.assign || function(t) { for (var s, i = 1, n = arguments.length; i < n; i++) { s = arguments[i]; for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; } return t; }; return __assign.apply(this, arguments); }; 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 __generator = (this && this.__generator) || function (thisArg, body) { var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; function verb(n) { return function (v) { return step([n, v]); }; } function step(op) { if (f) throw new TypeError("Generator is already executing."); while (_) try { if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; if (y = 0, t) op = [op[0] & 2, t.value]; switch (op[0]) { case 0: case 1: t = op; break; case 4: _.label++; return { value: op[1], done: false }; case 5: _.label++; y = op[1]; op = [0]; continue; case 7: op = _.ops.pop(); _.trys.pop(); continue; default: if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } if (t[2]) _.ops.pop(); _.trys.pop(); continue; } op = body.call(thisArg, _); } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; } }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); var koa_1 = __importDefault(require("koa")); var core_1 = require("@serverless-devs/core"); var koa_onerror_1 = __importDefault(require("koa-onerror")); var koa_router_1 = __importDefault(require("koa-router")); var cors_1 = __importDefault(require("@koa/cors")); var open_1 = __importDefault(require("open")); var path_1 = __importDefault(require("path")); var raw_body_1 = __importDefault(require("raw-body")); var koa_views_1 = __importDefault(require("koa-views")); var koa_static_1 = __importDefault(require("koa-static")); var util_1 = require("./util"); var stencil_1 = require("./util/stencil"); var logger_1 = __importDefault(require("./common/logger")); var constant_1 = require("./constant"); var router = (0, koa_router_1.default)(); var Server = /** @class */ (function () { function Server() { this.PORT = 9000; this.HOST = 'localhost'; this.app = new koa_1.default(); } Server.prototype.start = function () { var _this = this; (0, koa_onerror_1.default)(this.app); this.app.use((0, cors_1.default)()); this.app.use((0, koa_views_1.default)(path_1.default.join(__dirname, 'view'), { extension: 'ejs' })); this.app.use((0, koa_static_1.default)(path_1.default.join(__dirname, 'view'))); // @ts-ignore this.app.use(router.routes(), router.allowedMethods()); // error-handling this.app.on("error", function (err, ctx) { console.error("server error", err, ctx); ctx.body = { "code": 400, "msg": err.message, }; }); var server = this.app.listen(this.PORT, this.HOST); server.on('error', function (err) { // @ts-ignore if (err.code === 'EADDRINUSE') { _this.PORT = _this.PORT + 1; _this.start(); } else { throw err; } }); server.on('listening', function () { var addr = "http://".concat(_this.HOST, ":").concat(_this.PORT); (0, open_1.default)(addr); }); server.timeout = 0; server.setTimeout(0); server.keepAliveTimeout = 0; this.handleRouter(); }; Server.prototype.getBody = function (ctx) { return __awaiter(this, void 0, void 0, function () { return __generator(this, function (_a) { switch (_a.label) { case 0: return [4 /*yield*/, new Promise(function (r) { return (0, raw_body_1.default)(ctx.req, function (_err, body) { return r(body); }); })]; case 1: return [2 /*return*/, _a.sent()]; } }); }); }; Server.prototype.handleRouter = function () { var _this = this; router.get('/', function (ctx) { return __awaiter(_this, void 0, void 0, function () { var values; return __generator(this, function (_a) { switch (_a.label) { case 0: values = (0, util_1.getInitValues)(); return [4 /*yield*/, ctx.render('index', __assign(__assign({}, values), { SERVICES: JSON.stringify(constant_1.SERVICES) }))]; case 1: _a.sent(); return [2 /*return*/]; } }); }); }); router.post('/image', function (ctx) { return __awaiter(_this, void 0, void 0, function () { var token, resData, body, _a, _b, base64, res, ex_1; var _c, _d, _e; return __generator(this, function (_f) { switch (_f.label) { case 0: try { token = core_1.fse.readFileSync("".concat((0, core_1.getRootHome)(), "/serverless-devs-platform.dat"), 'utf-8'); if (!token) { ctx.body = { "code": 422, "msg": 'you need to login to registry: s cli registry login', }; return [2 /*return*/]; } } catch (ex) { ctx.body = { "code": 422, "msg": 'you need to login to registry: s cli registry login', }; } _f.label = 1; case 1: _f.trys.push([1, 8, , 9]); return [4 /*yield*/, (0, core_1.request)('http://editor.devsapp.cn/images', { method: 'POST', form: true, body: { 'safety_code': token } })]; case 2: resData = _f.sent(); logger_1.default.debug("http://editor.devsapp.cn/images resData: ".concat(JSON.stringify(resData))); if (!resData.error) return [3 /*break*/, 3]; ctx.body = { "code": 422, "msg": resData.error, }; return [3 /*break*/, 7]; case 3: if (!((_c = resData.Response) === null || _c === void 0 ? void 0 : _c.Error)) return [3 /*break*/, 4]; ctx.body = { "code": 422, "msg": 'login failed', }; return [3 /*break*/, 7]; case 4: _b = (_a = JSON).parse; return [4 /*yield*/, this.getBody(ctx)]; case 5: body = _b.apply(_a, [(_f.sent()).toString()]); base64 = (body.file || '').replace(/^data:image\/\w+;base64,/, ""); return [4 /*yield*/, (0, core_1.request)(resData.upload, { 'method': 'PUT', json: false, body: Buffer.from(base64, 'base64'), })]; case 6: res = _f.sent(); logger_1.default.debug("\u4E0A\u4F20 res: ".concat(JSON.stringify(res))); if ((_e = (_d = res === null || res === void 0 ? void 0 : res.body) === null || _d === void 0 ? void 0 : _d.includes) === null || _e === void 0 ? void 0 : _e.call(_d, "Error")) { ctx.body = { "code": 422, "msg": 'unknown error, please try again later', }; } else { ctx.body = { "code": 200, url: resData.url, }; } _f.label = 7; case 7: return [3 /*break*/, 9]; case 8: ex_1 = _f.sent(); logger_1.default.error("\u51FA\u73B0\u4E86\u5F02\u5E38: ".concat(ex_1)); ctx.body = { "code": 422, "msg": ex_1.message, }; return [3 /*break*/, 9]; case 9: return [2 /*return*/]; } }); }); }); router.post('/save', function (ctx) { return __awaiter(_this, void 0, void 0, function () { var body, _a, _b, values, _c, Description, Name, str; return __generator(this, function (_d) { switch (_d.label) { case 0: _b = (_a = JSON).parse; return [4 /*yield*/, this.getBody(ctx)]; case 1: body = _b.apply(_a, [(_d.sent()).toString()]); values = (0, util_1.getInitValues)(); _c = (0, util_1.getPublishValue)(), Description = _c.Description, Name = _c.Name; body.appName = Name; body.appDescription = Description; str = (0, stencil_1.genReadmeStr)(core_1.lodash.defaults(body, values)); // console.log(str); core_1.fse.writeFileSync((0, stencil_1.getReadmePath)(), str); core_1.fse.writeFileSync((0, stencil_1.getSrcReadmePath)(), str); ctx.body = { "code": 200, "msg": 'success', }; return [2 /*return*/]; } }); }); }); }; return Server; }()); exports.default = Server; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3NlcnZlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsNENBQXNCO0FBQ3RCLDhDQUErRTtBQUMvRSw0REFBa0M7QUFDbEMsMERBQWdDO0FBQ2hDLG1EQUE2QjtBQUM3Qiw4Q0FBd0I7QUFDeEIsOENBQXdCO0FBQ3hCLHNEQUFrQztBQUNsQyx3REFBOEI7QUFDOUIsMERBQStCO0FBQy9CLCtCQUF3RDtBQUN4RCwwQ0FBK0U7QUFDL0UsMkRBQXFDO0FBQ3JDLHVDQUFzQztBQUV0QyxJQUFNLE1BQU0sR0FBRyxJQUFBLG9CQUFNLEdBQUUsQ0FBQztBQUV4QjtJQUtFO1FBSkEsU0FBSSxHQUFHLElBQUksQ0FBQztRQUNaLFNBQUksR0FBRyxXQUFXLENBQUM7UUFJakIsSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLGFBQUcsRUFBRSxDQUFDO0lBQ3ZCLENBQUM7SUFFRCxzQkFBSyxHQUFMO1FBQUEsaUJBc0NDO1FBckNDLElBQUEscUJBQU8sRUFBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7UUFFbEIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsSUFBQSxjQUFJLEdBQUUsQ0FBQyxDQUFDO1FBQ3JCLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLElBQUEsbUJBQUssRUFBQyxjQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxNQUFNLENBQUMsRUFBRTtZQUMvQyxTQUFTLEVBQUUsS0FBSztTQUNqQixDQUFDLENBQUMsQ0FBQztRQUNKLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLElBQUEsb0JBQUssRUFBQyxjQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDbEQsYUFBYTtRQUNiLElBQUksQ0FB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