UNPKG

@idealworld/cli

Version:
317 lines (316 loc) 11.8 kB
"use strict"; /* * 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;