diff --git a/package.json b/package.json index 681694d..64e6705 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@kevisual/envision-cli", - "version": "0.0.26", + "version": "0.0.27", "description": "envision command tools", "main": "dist/index.js", "type": "module", diff --git a/src/command/login.ts b/src/command/login.ts index 60aed70..cbda3af 100644 --- a/src/command/login.ts +++ b/src/command/login.ts @@ -34,6 +34,13 @@ export const getTokenList = async () => { } return res; }; +export const setTokenList = async (data: any[]) => { + const res = await runApp({ path: 'config', key: 'setTokenList', payload: { data } }); + if (res.code !== 200) { + console.log('set token list failed', res.message || ''); + } + return res; +}; // 定义login命令,支持 `-u` 和 `-p` 参数来输入用户名和密码 const loginCommand = new Command('login') .description('Login to the application') @@ -45,7 +52,7 @@ const loginCommand = new Command('login') const config = getConfig(); let { username, password } = options; if (options.web) { - await loginInCommand(); + await loginInCommand(saveToken); return; } // 如果没有传递参数,则通过交互式输入 diff --git a/src/command/ls-token.ts b/src/command/ls-token.ts index 9e50bda..0a85186 100644 --- a/src/command/ls-token.ts +++ b/src/command/ls-token.ts @@ -3,7 +3,7 @@ import { getConfig, query, writeConfig } from '@/module/index.ts'; import inquirer from 'inquirer'; import util from 'util'; -import { saveToken, switchToken, deleteToken, getTokenList } from './login.ts'; +import { saveToken, switchToken, deleteToken, getTokenList, setTokenList } from './login.ts'; const token = new Command('token').description('show token').action(async () => { const config = getConfig(); console.log('token', config.token); @@ -51,7 +51,7 @@ const baseURL = new Command('baseURL') .option('-l, --list', 'list baseURL') .option('-c, --clear', 'clear baseURL') .action(async (opts) => { - const config = getConfig(); + let config = getConfig(); let list = (config.baseURLList as Array) || []; const quineList = (list: string[]) => { const newList = new Set(list); @@ -62,18 +62,34 @@ const baseURL = new Command('baseURL') console.log('expand baseURLList is empty'); return; } + const config = getConfig(); console.log('----current baseURL:' + config.baseURL + '----\n'); list.forEach((item, index) => { console.log(`${index + 1}: ${item}`); }); }; - if (opts.add) { - list.push(opts.add); - list = quineList(list); - console.log('add baseURL success\n'); - writeConfig({ ...config, baseURLList: list }); - showList(list); - return; + function isNumeric(str: string) { + return /^-?\d+\.?\d*$/.test(str); + } + if (opts.add || opts.set) { + let change = false; + if (opts.add) { + change = true; + list.push(opts.add); + } else if (opts.set) { + if (!isNumeric(opts.set)) { + change = true; + list.push(opts.set); + writeConfig({ ...config, baseURL: opts.set }); + config = getConfig(); + } + } + if (change) { + list = quineList(list); + writeConfig({ ...config, baseURLList: list }); + config = getConfig(); + showList(list); + } } if (opts.remove) { const index = Number(opts.remove) - 1; @@ -89,7 +105,7 @@ const baseURL = new Command('baseURL') return; } if (opts.set) { - const isNumber = !isNaN(Number(opts.set)); + const isNumber = isNumeric(opts.set); let baseURL = ''; if (isNumber) { const index = Number(opts.set) - 1; @@ -99,17 +115,9 @@ const baseURL = new Command('baseURL') } baseURL = list[index]; writeConfig({ ...config, baseURL: list[index] }); - console.log('set baseURL success:', list[index]); + showList(list); } else { - try { - new URL(opts.set); - } catch (error) { - console.log('invalid baseURL:', opts.set); - return; - } baseURL = opts.set; - writeConfig({ ...config, baseURL: opts.set }); - console.log('set baseURL success:', opts.set); } baseURL && switchToken(baseURL); return; @@ -120,25 +128,34 @@ const baseURL = new Command('baseURL') } if (opts.clear) { writeConfig({ ...config, baseURLList: [] }); + setTokenList([]); return; } console.log('current baseURL:', config.baseURL); }); app.addCommand(baseURL); -const setBaseURL = new Command('set').description('set baseURL').action(async () => { - const config = getConfig(); - const answers = await inquirer.prompt([ - { - type: 'input', - name: 'baseURL', - message: `Enter your baseURL:(current: ${config.baseURL})`, - }, - ]); - const baseURL = answers.baseURL; - writeConfig({ ...config, baseURL }); - baseURL && switchToken(baseURL); -}); +const setBaseURL = new Command('set') + .option('-b, --baseURL ', 'set baseURL') + // .argument('', 'set baseURL', '') + .description('set baseURL') + .action(async (opt) => { + const config = getConfig(); + let baseURL = opt.baseURL; + // let baseURL = opt; + if (!baseURL) { + const answers = await inquirer.prompt([ + { + type: 'input', + name: 'baseURL', + message: `Enter your baseURL:(current: ${config.baseURL})`, + }, + ]); + baseURL = answers.baseURL; + } + writeConfig({ ...config, baseURL }); + baseURL && switchToken(baseURL); + }); baseURL.addCommand(setBaseURL); diff --git a/src/module/get-config.ts b/src/module/get-config.ts index c59dd6c..2a7f4b8 100644 --- a/src/module/get-config.ts +++ b/src/module/get-config.ts @@ -44,4 +44,5 @@ export const getConfig = () => { export const writeConfig = (config: Record) => { fs.writeFileSync(configPath, JSON.stringify(config, null, 2)); + return config; }; diff --git a/src/module/login/login-by-web.ts b/src/module/login/login-by-web.ts index 20ec29c..6ce9a97 100644 --- a/src/module/login/login-by-web.ts +++ b/src/module/login/login-by-web.ts @@ -4,13 +4,7 @@ import { chalk } from '../chalk.ts'; import jsonwebtoken from 'jsonwebtoken'; import { BaseLoad } from '@kevisual/load'; import { getConfig, writeConfig } from '../get-config.ts'; -const saveToken = async (token: string) => { - const config = await getConfig(); - writeConfig({ - ...config, - token, - }); -}; + type LoginWithWebOptions = {}; export const loginWithWeb = async (opts?: LoginWithWebOptions) => { const baseURL = getBaseURL(); @@ -36,6 +30,7 @@ export const loginWithWeb = async (opts?: LoginWithWebOptions) => { type PollLoginOptions = { tokenSecret: string; + saveToken?: any; }; export const pollLoginStatus = async (token: string, opts: PollLoginOptions) => { const load = new BaseLoad(); @@ -75,8 +70,9 @@ export const pollLoginStatus = async (token: string, opts: PollLoginOptions) => }; const userToken = payload.userToken; // console.log('token:\n\n', userToken); - console.log(chalk.green('登录成功', payload?.user?.username)); - await saveToken(userToken.token); + console.log(chalk.green('网页登录成功', payload?.user?.username)); + console.log(chalk.green('token:', userToken.token)); + await opts?.saveToken(userToken.token); return; } catch (error) { console.log(chalk.red('登录失败'), error); @@ -85,9 +81,9 @@ export const pollLoginStatus = async (token: string, opts: PollLoginOptions) => console.log(chalk.red('登录失败'), res); }; -export const loginInCommand = async () => { +export const loginInCommand = async (saveToken: any) => { const { url, token, tokenSecret } = await loginWithWeb(); - await pollLoginStatus(token, { tokenSecret }); + await pollLoginStatus(token, { tokenSecret, saveToken }); return url; }; diff --git a/src/route/system-config/cache-token.ts b/src/route/system-config/cache-token.ts index b866d39..60d0623 100644 --- a/src/route/system-config/cache-token.ts +++ b/src/route/system-config/cache-token.ts @@ -1,6 +1,7 @@ import { app } from '@/app.ts'; import { Config } from './model/config.ts'; -import { writeConfig } from '@/module/get-config.ts'; +import { getConfig, writeConfig } from '@/module/get-config.ts'; +import { queryMe } from '@/query/index.ts'; const cacheToken = 'tokenList'; export type TokenCacheItem = { baseURL?: string; @@ -151,13 +152,20 @@ app const tokenList: TokenCacheItem[] = configRes.body?.value || []; const index = tokenList.findIndex((item) => item.baseURL === baseURL); const token = index > -1 ? tokenList[index].token : ''; - if (index > -1 && token) { - writeConfig({ token: tokenList[index].token }); + if (token) { + const config = getConfig(); + const resMe = await queryMe(); + if (resMe.code !== 200) { + writeConfig({ ...config, token: '' }); + ctx.throw(resMe.code, resMe.message || 'cache token is invalid'); + } + writeConfig({ ...config, token: token }); ctx.body = { baseURL: baseURL, token: tokenList[index].token, }; } else { + writeConfig({ ...getConfig(), token: '' }); ctx.throw(404, 'Token not found'); } })