@idealworld/cli
Version:
Dew Serviceless CLI
317 lines (316 loc) • 11.8 kB
JavaScript
;
/*
* Copyright 2021. gudaoxuri
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.run = void 0;
const inquirer_1 = __importDefault(require("inquirer"));
const gitHelper = __importStar(require("./util/GitHelper"));
const chalk_1 = __importDefault(require("chalk"));
const clear_1 = __importDefault(require("clear"));
const figlet_1 = __importDefault(require("figlet"));
const fileHelper = __importStar(require("./util/FileHelper"));
const path_1 = __importDefault(require("path"));
const sdk_1 = require("@idealworld/sdk");
const package_json_1 = __importDefault(require("../package.json"));
const TEMPLATE_SIMPLE_GIT_ADDR = 'https://github.com/ideal-world/dew-serviceless-template-simple.git';
const GATEWAY_SERVER_URL = "https://gateway.serviceless.org";
const SDK_VERSION = package_json_1.default.version;
const createAppWithNewTenantSteps = [
{
type: 'input',
message: '请输入租户名称:',
name: 'tenantName',
when: function (answers) {
return answers.kind === '创建应用'
&& answers.createTenant;
},
validate: function (val) {
if (!val.trim()) {
return '请输入租户名称';
}
return true;
},
filter: function (val) {
return val.trim();
}
}, {
type: 'input',
message: '请输入管理员用户名:',
name: 'tenantAdminUsername',
default: 'admin',
when: function (answers) {
return answers.kind === '创建应用'
&& answers.createTenant;
},
validate: function (val) {
if (!val.trim()) {
return '请输入管理员用户名';
}
return true;
},
filter: function (val) {
return val.trim();
}
}, {
type: 'input',
message: '请输入管理员密码:',
name: 'tenantAdminPassword',
default: 'Dew93Xi2@s!',
when: function (answers) {
return answers.kind === '创建应用'
&& answers.createTenant;
},
validate: function (val) {
if (!val.trim()) {
return '请输入管理员密码';
}
return true;
},
},
];
const createAppWithExistTenantSteps = [
{
type: 'input',
message: '请输入要创建应用的租户管理员用户名:',
name: 'tenantAdminUsername',
when: function (answers) {
return answers.kind === '创建应用'
&& !answers.createTenant;
},
validate: function (val) {
if (!val.trim()) {
return '请输入要创建应用的租户管理员用户名';
}
return true;
},
filter: function (val) {
return val.trim();
}
}, {
type: 'password',
message: '请输入要创建应用的租户管理员密码:',
name: 'tenantAdminPassword',
when: function (answers) {
return answers.kind === '创建应用'
&& !answers.createTenant;
},
validate: function (val) {
if (!val.trim()) {
return '请输入要创建应用的租户管理员密码';
}
return true;
},
}, {
type: 'input',
message: '请输入要创建应用的租户管理员的应用Id:',
name: 'tenantAdminAppId',
when: function (answers) {
return answers.kind === '创建应用'
&& !answers.createTenant;
},
validate: function (val) {
if (!val.trim()) {
return '请输入要创建应用的租户管理员的应用Id';
}
return true;
},
filter: function (val) {
return val.trim();
}
},
];
const createAppSteps = [
{
type: 'input',
message: '请输入应用名:',
name: 'appName',
when: function (answers) {
return answers.kind === '创建应用';
},
validate: function (val) {
if (!val.trim()) {
return '请输入应用名称';
}
let path = path_1.default.resolve(fileHelper.pwd(), val.trim());
if (fileHelper.exists(path)) {
return '该应用名称在当前路径下已存在,请更换应用名称或路径';
}
return true;
},
filter: function (val) {
return val.trim();
}
}, {
type: 'confirm',
message: "是否新建租户?",
name: "createTenant",
when: function (answers) {
return answers.kind === '创建应用';
}
}
].concat(createAppWithExistTenantSteps, createAppWithNewTenantSteps);
const allSteps = [
{
type: 'input',
message: '请输入服务地址:',
name: 'serverUrl',
default: GATEWAY_SERVER_URL,
validate: function (val) {
if (!val.trim()) {
return '请输入服务地址';
}
sdk_1.DewSDK.setting.serverUrl(val);
return true;
}
}, {
type: 'list',
message: '请选择操作:',
name: 'kind',
choices: [
"创建应用",
]
}
].concat(createAppSteps);
async function createApp(answers) {
let confirmMessage;
if (!answers.createTenant) {
sdk_1.DewSDK.setting.appId(answers.tenantAdminAppId);
await sdk_1.DewSDK.iam.account.login(answers.tenantAdminUsername, answers.tenantAdminPassword);
let tenantName = (await sdk_1.DewSDK.iam.tenant.fetch()).name;
confirmMessage = '即将在租户 [' + tenantName + '] 中创建应用 [' + answers.appName + ']';
}
else {
sdk_1.DewSDK.setting.appId('');
confirmMessage = '即将创建应用 [' + answers.appName + ']';
}
let confirmAnswer = await inquirer_1.default.prompt([{
type: 'confirm',
message: confirmMessage + ',是否确认?',
name: "confirm"
}]);
if (!confirmAnswer) {
return;
}
let appCode;
if (answers.createTenant) {
let identOptInfo = await sdk_1.DewSDK.iam.tenant.register(answers.tenantName, answers.appName, answers.tenantAdminUsername, answers.tenantAdminPassword);
sdk_1.DewSDK.iam.auth.set(identOptInfo);
appCode = identOptInfo.appCode;
}
else {
let identOptInfo = await sdk_1.DewSDK.iam.app.register(answers.appName);
sdk_1.DewSDK.iam.auth.set(identOptInfo);
appCode = identOptInfo.appCode;
}
let identAKInfo = (await sdk_1.DewSDK.iam.app.ident.list()).objects[0];
let identSk = await sdk_1.DewSDK.iam.app.ident.fetchSk(identAKInfo.id);
let path = path_1.default.resolve(fileHelper.pwd(), answers.appName);
console.log(chalk_1.default.yellow('正在创建模板到 [' + path + ']'));
await gitHelper.clone(TEMPLATE_SIMPLE_GIT_ADDR, path, 1);
let packagePath = path_1.default.resolve(path, 'package.json');
console.log(chalk_1.default.yellow('正在添加基本信息到 [' + packagePath + ']'));
let packageJsonFile = JSON.parse(fileHelper.readFile(packagePath));
if (!packageJsonFile.hasOwnProperty('dependencies')) {
packageJsonFile['dependencies'] = {};
}
if (!packageJsonFile.hasOwnProperty('devDependencies')) {
packageJsonFile['devDependencies'] = {};
}
packageJsonFile['dependencies']['@idealworld/sdk'] = SDK_VERSION;
packageJsonFile['devDependencies']['@idealworld/plugin-gulp'] = SDK_VERSION;
packageJsonFile['dew'] = {
"serverUrl": answers.serverUrl,
"appId": appCode
};
fileHelper.writeFile(packagePath, JSON.stringify(packageJsonFile, null, 2));
let dewCrtPath = path_1.default.resolve(path, 'dew.json');
console.log(chalk_1.default.yellow('正在添加认证信息到 [' + dewCrtPath + ']'));
if (!fileHelper.exists(dewCrtPath)) {
fileHelper.writeFile(dewCrtPath, JSON.stringify({
"ak": identAKInfo.ak,
"sk": identSk,
"env": {
"dev": {},
"test": {},
"prod": {}
}
}, null, 2));
}
else {
let dewCrtContent = JSON.parse(fileHelper.readFile(dewCrtPath));
dewCrtContent['ak'] = identAKInfo.ak;
dewCrtContent['sk'] = identSk;
fileHelper.writeFile(dewCrtPath, JSON.stringify(dewCrtContent, null, 2));
}
let gitignorePath = path_1.default.resolve(path, '.npmignore');
if (fileHelper.exists(gitignorePath)) {
if (fileHelper.readFile(gitignorePath).indexOf('dew.json') === -1) {
fileHelper.append(gitignorePath, '\ndew.json');
}
}
else {
fileHelper.writeFile(gitignorePath, '\ndew.json');
}
console.log(chalk_1.default.green.bold('应用创建完成,请到 [' + path + '] 中查看。\r\n' +
'===================\r\n' +
'应用Id(AppId): ' + appCode + '\r\n' +
'应用管理员: ' + answers.tenantAdminUsername + '\r\n' +
'管理员密码: ' + answers.tenantAdminPassword + '\r\n' +
'[dew.json]存放了密钥数据,请妥善保存!\r\n' +
'==================='));
}
/**
* 执行入口.
*
*/
async function run() {
clear_1.default();
console.log(chalk_1.default.green(figlet_1.default.textSync('Dew CLI', { horizontalLayout: 'full' })));
let answers = await inquirer_1.default.prompt(allSteps);
try {
switch (answers.kind) {
case '创建应用':
await createApp(answers);
break;
}
}
catch (e) {
console.log(chalk_1.default.red.bold('执行错误,请检查修正。'));
}
}
exports.run = run;