@serverless-devs/kv
Version:
发布 阿里云 jamstack 站点 kvstore 的组件
438 lines • 34.5 kB
JavaScript
"use strict";
var __extends = (this && this.__extends) || (function () {
var extendStatics = function (d, b) {
extendStatics = Object.setPrototypeOf ||
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
return extendStatics(d, b);
};
return function (d, b) {
extendStatics(d, b);
function __() { this.constructor = d; }
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
};
})();
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 path_1 = __importDefault(require("path"));
var os_1 = __importDefault(require("os"));
var fs_extra_1 = __importDefault(require("fs-extra"));
var js_yaml_1 = __importDefault(require("js-yaml"));
var core_1 = require("@serverless-devs/core");
var base_1 = __importDefault(require("./common/base"));
var lodash_get_1 = __importDefault(require("lodash.get"));
var request_1 = require("./common/request");
// const CONTENT_TYPE_MAP = {
// 'html': 'text/html; charset=UTF-8',
// 'text': 'text/plain; charset=UTF-8',
// 'xml': 'text/xml; charset=UTF-8',
// 'gif': 'image/gif; charset=UTF-8',
// 'jpg': 'image/jpeg; charset=UTF-8',
// 'jpeg': 'image/jpeg; charset=UTF-8',
// 'png': 'image/png; charset=UTF-8',
// 'svg': 'image/svg+xml; charset=UTF-8',
// 'xhtml': 'application/xhtml+xml; charset=UTF-8',
// 'json': 'application/json; charset=UTF-8',
// 'pdf': 'application/pdf; charset=UTF-8',
// 'js': 'application/javascript; charset=UTF-8',
// 'css': 'text/css; charset=UTF-8'
// }
var ComponentDemo = /** @class */ (function (_super) {
__extends(ComponentDemo, _super);
function ComponentDemo(props) {
return _super.call(this, props) || this;
}
ComponentDemo.prototype.setEnv = function (credentials, aliasName) {
if (aliasName === void 0) { aliasName = 'default'; }
return __awaiter(this, void 0, void 0, function () {
var accessFile, accessFileInfo;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
if (!!credentials.AccessKeyID) return [3 /*break*/, 2];
accessFile = path_1.default.join(os_1.default.homedir(), '.s', 'access.yaml');
accessFileInfo = js_yaml_1.default.load(fs_extra_1.default.readFileSync(accessFile, 'utf8') || "{}");
if (!accessFileInfo[aliasName]) return [3 /*break*/, 2];
return [4 /*yield*/, core_1.getCredential(aliasName)];
case 1:
credentials = _a.sent();
_a.label = 2;
case 2:
process.env.accessKey = credentials.AccessKeyID;
process.env.accessSecret = credentials.AccessKeySecret;
return [2 /*return*/];
}
});
});
};
/**
* 上传kv
* @param inputs
* @returns
*/
ComponentDemo.prototype.put = function (inputs) {
return __awaiter(this, void 0, void 0, function () {
var _a, argsObj, credentials, project, othersParams, _b, key, _c, value, domain, type, domainTagIndex, sPath, yamlObj;
return __generator(this, function (_d) {
switch (_d.label) {
case 0:
_a = inputs.argsObj, argsObj = _a === void 0 ? [] : _a, credentials = inputs.credentials, project = inputs.project;
return [4 /*yield*/, this.setEnv(credentials, project.access)];
case 1:
_d.sent();
othersParams = argsObj.slice(2);
_b = argsObj.slice(0, 2), key = _b[0], _c = _b[1], value = _c === void 0 ? '' : _c;
domain = '';
if (!key) {
throw new Error('请输入 key');
}
type = path_1.default.extname(key).substr(1);
if (fs_extra_1.default.existsSync(value)) {
value = fs_extra_1.default.readFileSync(value, 'utf-8');
}
if (!value) {
throw new Error('请输入 value (value 可以为具体的文件路径)');
}
if (othersParams.includes('-d')) {
domainTagIndex = othersParams.indexOf('-d');
domain = othersParams[domainTagIndex + 1];
if (!domain) {
throw new Error('请指定domain');
}
}
else {
sPath = path_1.default.join(process.cwd(), 's.yaml');
if (fs_extra_1.default.existsSync(sPath)) { // 如果有配置文件,则去解析配置文件path
yamlObj = js_yaml_1.default.load(fs_extra_1.default.readFileSync(sPath, 'utf-8'));
domain = lodash_get_1.default(yamlObj, 'vars.domain');
if (!domain) {
throw new Error('检测到当前配置文件中不存在domain ,请按在变量vars 下添加domain属性');
}
}
else {
throw new Error('检测到当前没有domain配置,您可以通过-d <domain> 指定');
}
}
if (type === 'json') {
try {
value = JSON.parse(value);
}
catch (e) {
}
}
else {
type = 'text/plain';
}
return [4 /*yield*/, request_1.putKeyValue({ domain: domain, key: key, value: value, type: type })];
case 2:
_d.sent();
return [2 /*return*/, '创建/更新成功'];
}
});
});
};
/**
* 查询所有的keys 信息
* @param inputs
* @returns
*/
ComponentDemo.prototype.list = function (inputs) {
return __awaiter(this, void 0, void 0, function () {
var _a, args, credentials, project, argsArr, othersParams, domain, domainTagIndex, sPath, yamlObj, result, keys;
return __generator(this, function (_b) {
switch (_b.label) {
case 0:
_a = inputs.args, args = _a === void 0 ? '' : _a, credentials = inputs.credentials, project = inputs.project;
return [4 /*yield*/, this.setEnv(credentials, project.access)];
case 1:
_b.sent();
argsArr = args.split(/\s/);
othersParams = argsArr.slice(2);
domain = '';
if (othersParams.includes('-d')) {
domainTagIndex = othersParams.indexOf('-d');
domain = othersParams[domainTagIndex + 1];
if (!domain) {
throw new Error('请指定domain');
}
}
else {
sPath = path_1.default.join(process.cwd(), 's.yaml');
if (fs_extra_1.default.existsSync(sPath)) { // 如果有配置文件,则去解析配置文件path
yamlObj = js_yaml_1.default.load(fs_extra_1.default.readFileSync(sPath, 'utf-8'));
domain = lodash_get_1.default(yamlObj, 'vars.domain');
if (!domain) {
throw new Error('检测到当前配置文件中不存在domain ,请按在变量vars 下添加domain属性');
}
}
else {
throw new Error('检测到当前没有domain配置,您可以通过-d <domain> 指定');
}
}
return [4 /*yield*/, request_1.listKeyValue({ domain: domain })];
case 2:
result = _b.sent();
keys = lodash_get_1.default(result, 'data.keys');
return [2 /*return*/, "\u8FD4\u56DE\u7684keys: " + keys];
}
});
});
};
/**
* 根据指定的key获取其值
* @param inputs
* @returns
*/
ComponentDemo.prototype.get = function (inputs) {
return __awaiter(this, void 0, void 0, function () {
var _a, args, credentials, project, argsArr, key, othersParams, domain, domainTagIndex, sPath, yamlObj, result, value;
return __generator(this, function (_b) {
switch (_b.label) {
case 0:
_a = inputs.args, args = _a === void 0 ? '' : _a, credentials = inputs.credentials, project = inputs.project;
return [4 /*yield*/, this.setEnv(credentials, project.access)];
case 1:
_b.sent();
argsArr = args.split(/\s/);
key = argsArr.slice(0, 2)[0];
if (!key) {
throw new Error('请输入 key');
}
othersParams = argsArr.slice(2);
domain = '';
if (othersParams.includes('-d')) {
domainTagIndex = othersParams.indexOf('-d');
domain = othersParams[domainTagIndex + 1];
if (!domain) {
throw new Error('请指定domain');
}
}
else {
sPath = path_1.default.join(process.cwd(), 's.yaml');
if (fs_extra_1.default.existsSync(sPath)) { // 如果有配置文件,则去解析配置文件path
yamlObj = js_yaml_1.default.load(fs_extra_1.default.readFileSync(sPath, 'utf-8'));
domain = lodash_get_1.default(yamlObj, 'vars.domain');
if (!domain) {
throw new Error('检测到当前配置文件中不存在domain ,请按在变量vars 下添加domain属性');
}
}
else {
throw new Error('检测到当前没有domain配置,您可以通过-d <domain> 指定');
}
}
return [4 /*yield*/, request_1.getKeyValue({ domain: domain, key: key })];
case 2:
result = _b.sent();
value = lodash_get_1.default(result, 'data.value');
return [2 /*return*/, key + "\u7684\u503C\u4E3A: " + value];
}
});
});
};
/**
* 删除指定的key 及其内容
* @param inputs
* @returns
*/
ComponentDemo.prototype.delete = function (inputs) {
return __awaiter(this, void 0, void 0, function () {
var _a, args, credentials, project, argsArr, key, othersParams, domain, domainTagIndex, sPath, yamlObj;
return __generator(this, function (_b) {
switch (_b.label) {
case 0:
_a = inputs.args, args = _a === void 0 ? '' : _a, credentials = inputs.credentials, project = inputs.project;
return [4 /*yield*/, this.setEnv(credentials, project.access)];
case 1:
_b.sent();
argsArr = args.split(/\s/);
key = argsArr.slice(0, 2)[0];
if (!key) {
throw new Error('请输入 key');
}
othersParams = argsArr.slice(2);
domain = '';
if (othersParams.includes('-d')) {
domainTagIndex = othersParams.indexOf('-d');
domain = othersParams[domainTagIndex + 1];
if (!domain) {
throw new Error('请指定domain');
}
}
else {
sPath = path_1.default.join(process.cwd(), 's.yaml');
if (fs_extra_1.default.existsSync(sPath)) { // 如果有配置文件,则去解析配置文件path
yamlObj = js_yaml_1.default.load(fs_extra_1.default.readFileSync(sPath, 'utf-8'));
domain = lodash_get_1.default(yamlObj, 'vars.domain');
if (!domain) {
throw new Error('检测到当前配置文件中不存在domain ,请按在变量vars 下添加domain属性');
}
}
else {
throw new Error('检测到当前没有domain配置,您可以通过-d <domain> 指定');
}
}
return [4 /*yield*/, request_1.deleteKeyValue({ domain: domain, key: key })];
case 2:
_b.sent();
return [2 /*return*/, '删除成功'];
}
});
});
};
/**
* 配合配置文件进行上传
* @param inputs
* @returns
*/
ComponentDemo.prototype.deploy = function (inputs) {
return __awaiter(this, void 0, void 0, function () {
var credentials, project, props, key, _a, value, domain, type, fileType;
return __generator(this, function (_b) {
switch (_b.label) {
case 0:
credentials = inputs.credentials, project = inputs.project, props = inputs.props;
return [4 /*yield*/, this.setEnv(credentials, project.access)];
case 1:
_b.sent();
key = props.key, _a = props.value, value = _a === void 0 ? '' : _a, domain = props.domain;
type = 'text/plain';
value = path_1.default.join(process.cwd(), value);
if (fs_extra_1.default.existsSync(value)) {
fileType = path_1.default.extname(value).substr(1);
type = fileType;
value = fs_extra_1.default.readFileSync(value, 'utf-8');
}
if (!key) {
throw new Error('请填写 key');
}
if (!value) {
throw new Error('请填写 value (value 可以为具体的文件路径)');
}
if (!domain) { // 如果有配置文件,则去解析配置文件path
throw new Error('请输入domain');
}
if (type === 'json') {
value = JSON.parse(value);
}
return [4 /*yield*/, request_1.putKeyValue({ domain: domain, key: key, value: value, type: type })];
case 2:
_b.sent();
return [2 /*return*/, '创建/更新成功'];
}
});
});
};
/**
* api 主动创建key value
* @param param0
*/
ComponentDemo.prototype.putApi = function (_a) {
var domain = _a.domain, key = _a.key, value = _a.value, type = _a.type, credentials = _a.credentials;
return __awaiter(this, void 0, void 0, function () {
return __generator(this, function (_b) {
switch (_b.label) {
case 0:
process.env.accessKey = credentials.AccessKeyID;
process.env.accessSecret = credentials.AccessKeySecret;
return [4 /*yield*/, request_1.putKeyValue({ domain: domain, key: key, value: value, type: type })];
case 1: return [2 /*return*/, _b.sent()];
}
});
});
};
/**
* api 获取具体的key
* @param param0
*/
ComponentDemo.prototype.getApi = function (_a) {
var domain = _a.domain, key = _a.key, credentials = _a.credentials;
return __awaiter(this, void 0, void 0, function () {
return __generator(this, function (_b) {
switch (_b.label) {
case 0:
process.env.accessKey = credentials.AccessKeyID;
process.env.accessSecret = credentials.AccessKeySecret;
return [4 /*yield*/, request_1.getKeyValue({ domain: domain, key: key })];
case 1: return [2 /*return*/, _b.sent()];
}
});
});
};
/**
* api 查看key 列表
* @param param0
*/
ComponentDemo.prototype.listApi = function (_a) {
var domain = _a.domain, key = _a.key, value = _a.value, type = _a.type, credentials = _a.credentials;
return __awaiter(this, void 0, void 0, function () {
return __generator(this, function (_b) {
switch (_b.label) {
case 0:
process.env.accessKey = credentials.AccessKeyID;
process.env.accessSecret = credentials.AccessKeySecret;
return [4 /*yield*/, request_1.listKeyValue({ domain: domain })];
case 1: return [2 /*return*/, _b.sent()];
}
});
});
};
/**
* api 主动删除key value
* @param param0
*/
ComponentDemo.prototype.deleteApi = function (_a) {
var domain = _a.domain, key = _a.key, credentials = _a.credentials;
return __awaiter(this, void 0, void 0, function () {
return __generator(this, function (_b) {
switch (_b.label) {
case 0:
process.env.accessKey = credentials.AccessKeyID;
process.env.accessSecret = credentials.AccessKeySecret;
return [4 /*yield*/, request_1.deleteKeyValue({ domain: domain, key: key })];
case 1: return [2 /*return*/, _b.sent()];
}
});
});
};
return ComponentDemo;
}(base_1.default));
exports.default = ComponentDemo;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsOENBQXdCO0FBQ3hCLDBDQUFvQjtBQUNwQixzREFBMEI7QUFDMUIsb0RBQTJCO0FBQzNCLDhDQUFzRDtBQUN0RCx1REFBMEM7QUFHMUMsMERBQTZCO0FBQzdCLDRDQUEwRjtBQUUxRiw2QkFBNkI7QUFDN0Isd0NBQXdDO0FBQ3hDLHlDQUF5QztBQUN6QyxzQ0FBc0M7QUFDdEMsdUNBQXVDO0FBQ3ZDLHdDQUF3QztBQUN4Qyx5Q0FBeUM7QUFDekMsdUNBQXVDO0FBQ3ZDLDJDQUEyQztBQUMzQyxxREFBcUQ7QUFDckQsK0NBQStDO0FBQy9DLDZDQUE2QztBQUM3QyxtREFBbUQ7QUFDbkQscUNBQXFDO0FBQ3JDLElBQUk7QUFFSjtJQUEyQyxpQ0FBYTtJQUN0RCx1QkFBWSxLQUFLO2VBQ2Ysa0JBQU0sS0FBSyxDQUFDO0lBQ2QsQ0FBQztJQUNhLDhCQUFNLEdBQXBCLFVBQXFCLFdBQXlCLEVBQUUsU0FBcUI7UUFBckIsMEJBQUEsRUFBQSxxQkFBcUI7Ozs7Ozs2QkFDL0QsQ0FBQyxXQUFXLENBQUMsV0FBVyxFQUF4Qix3QkFBd0I7d0JBQ3BCLFVBQVUsR0FBRyxjQUFJLENBQUMsSUFBSSxDQUFDLFlBQUUsQ0FBQyxPQUFPLEVBQUUsRUFBRSxJQUFJLEVBQUUsYUFBYSxDQUFDLENBQUM7d0JBQzFELGNBQWMsR0FBRyxpQkFBSSxDQUFDLElBQUksQ0FBQyxrQkFBRSxDQUFDLFlBQVksQ0FBQyxVQUFVLEVBQUUsTUFBTSxDQUFDLElBQUksSUFBSSxDQUFDLENBQUM7NkJBQzFFLGNBQWMsQ0FBQyxTQUFTLENBQUMsRUFBekIsd0JBQXlCO3dCQUNiLHFCQUFNLG9CQUFhLENBQUMsU0FBUyxDQUFDLEVBQUE7O3dCQUE1QyxXQUFX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