@serverless-devs/alireadme
Version:
This is a component demo for Serverless Devs Tool
254 lines • 19 kB
JavaScript
"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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