add public fix and pnpm init asst
This commit is contained in:
parent
a05f2cd291
commit
5cc1e33b29
@ -43,3 +43,11 @@ const deleteCommand = new Command('delete')
|
|||||||
logger.debug(info);
|
logger.debug(info);
|
||||||
});
|
});
|
||||||
appManagerCommand.addCommand(deleteCommand);
|
appManagerCommand.addCommand(deleteCommand);
|
||||||
|
|
||||||
|
const uploadCommand = new Command('upload')
|
||||||
|
.description('上传应用')
|
||||||
|
.option('-i, --id <id>', '应用名称 root/app-name 的格式,如果是后端,会自动解析为 app-name')
|
||||||
|
.option('-t, --type <type>', '应用类型', 'web')
|
||||||
|
.action(async (options) => {
|
||||||
|
//
|
||||||
|
});
|
||||||
|
@ -63,3 +63,27 @@ const removeCommand = new Command('remove')
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
program.addCommand(removeCommand);
|
program.addCommand(removeCommand);
|
||||||
|
|
||||||
|
const npmCommand = new Command('pnpm')
|
||||||
|
.description('助手pnpm命令')
|
||||||
|
.option('-p --path <path>', '助手路径,默认为执行命令的目录,如果助手路径不存在则创建。')
|
||||||
|
.action((opts) => {
|
||||||
|
if (opts.path && !opts.path.startsWith('/')) {
|
||||||
|
opts.path = path.join(process.cwd(), opts.path);
|
||||||
|
} else if (opts.path) {
|
||||||
|
opts.path = path.resolve(opts.path);
|
||||||
|
}
|
||||||
|
const configDir = AssistantInit.detectConfigDir(opts.path);
|
||||||
|
console.log('configDir', configDir);
|
||||||
|
const assistantInit = new AssistantInit({
|
||||||
|
path: configDir,
|
||||||
|
});
|
||||||
|
const initRes = assistantInit.initPnpm();
|
||||||
|
if (initRes?.create) {
|
||||||
|
console.log(chalk.blue('助手pnpm命令初始化成功,创建了新文件'));
|
||||||
|
} else {
|
||||||
|
console.log(chalk.green('助手pnpm命令初始化成功'));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
Init.addCommand(npmCommand);
|
||||||
|
@ -60,8 +60,12 @@ export const initConfig = (configRootPath: string) => {
|
|||||||
};
|
};
|
||||||
export type ReturnInitConfigType = ReturnType<typeof initConfig>;
|
export type ReturnInitConfigType = ReturnType<typeof initConfig>;
|
||||||
|
|
||||||
|
type AuthPermission = {
|
||||||
|
type?: 'auth-proxy' | 'public' | 'private' | 'project';
|
||||||
|
};
|
||||||
export type AssistantConfigData = {
|
export type AssistantConfigData = {
|
||||||
pageApi?: string; // https://kevisual.cn
|
pageApi?: string; // https://kevisual.cn
|
||||||
|
token?: string;
|
||||||
registry?: string; // https://kevisual.cn
|
registry?: string; // https://kevisual.cn
|
||||||
proxy?: ProxyInfo[];
|
proxy?: ProxyInfo[];
|
||||||
apiProxyList?: ProxyInfo[];
|
apiProxyList?: ProxyInfo[];
|
||||||
@ -78,6 +82,7 @@ export type AssistantConfigData = {
|
|||||||
scripts?: {
|
scripts?: {
|
||||||
[key: string]: string;
|
[key: string]: string;
|
||||||
};
|
};
|
||||||
|
auth?: AuthPermission;
|
||||||
};
|
};
|
||||||
let assistantConfig: AssistantConfigData;
|
let assistantConfig: AssistantConfigData;
|
||||||
type AssistantConfigOptions = {
|
type AssistantConfigOptions = {
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
import { app } from '../app.ts';
|
import { Query } from '@kevisual/query';
|
||||||
|
import { app, assistantConfig } from '../app.ts';
|
||||||
import './config/index.ts';
|
import './config/index.ts';
|
||||||
import './shop-install/index.ts';
|
import './shop-install/index.ts';
|
||||||
|
|
||||||
@ -8,7 +9,34 @@ app
|
|||||||
id: 'auth',
|
id: 'auth',
|
||||||
})
|
})
|
||||||
.define(async (ctx) => {
|
.define(async (ctx) => {
|
||||||
//
|
const config = assistantConfig.getConfig();
|
||||||
|
const { auth } = config;
|
||||||
|
const host = config.pageApi || config.registry || 'https://kevisual.cn';
|
||||||
|
const url = new URL('/api/router', host);
|
||||||
|
const token = ctx.token;
|
||||||
|
if (auth && auth.type !== 'public') {
|
||||||
|
if (!token) {
|
||||||
|
return ctx.throw(4001, 'not login');
|
||||||
|
}
|
||||||
|
url.searchParams.set('token', token);
|
||||||
|
// 鉴权代理
|
||||||
|
// TODO:
|
||||||
|
const query = new Query({ baseURL: url.toString() });
|
||||||
|
const res = await query.post({
|
||||||
|
path: 'user',
|
||||||
|
key: 'me',
|
||||||
|
});
|
||||||
|
console.log('res', res);
|
||||||
|
if (res.code !== 200) {
|
||||||
|
return ctx.throw(4001, 'not login');
|
||||||
|
}
|
||||||
|
const tokenUser = res.data || {};
|
||||||
|
ctx.state = {
|
||||||
|
...ctx.state,
|
||||||
|
tokenUser,
|
||||||
|
};
|
||||||
|
const { username } = tokenUser;
|
||||||
|
}
|
||||||
})
|
})
|
||||||
.addTo(app);
|
.addTo(app);
|
||||||
|
|
||||||
|
@ -72,6 +72,58 @@ export class AssistantInit extends AssistantConfig {
|
|||||||
console.log(chalk.green('助手配置文件assistant-config.json创建成功'));
|
console.log(chalk.green('助手配置文件assistant-config.json创建成功'));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
initPnpm() {
|
||||||
|
const pnpmPath = path.join(this.configDir, 'assistant-app', 'pnpm.yaml');
|
||||||
|
let create = false;
|
||||||
|
if (!checkFileExists(pnpmPath, true)) {
|
||||||
|
create = true;
|
||||||
|
fs.writeFileSync(
|
||||||
|
pnpmPath,
|
||||||
|
`packages:
|
||||||
|
- 'apps/**/*'
|
||||||
|
- 'pages/**/*'
|
||||||
|
`,
|
||||||
|
);
|
||||||
|
console.log(chalk.green('助手 pnpm.yaml 文件创建成功'));
|
||||||
|
}
|
||||||
|
const packagePath = path.join(this.configDir, 'assistant-app', 'package.json');
|
||||||
|
if (!checkFileExists(packagePath, true)) {
|
||||||
|
create = true;
|
||||||
|
fs.writeFileSync(
|
||||||
|
packagePath,
|
||||||
|
`{
|
||||||
|
"name": "assistant-app",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"description": "assistant-app package pnpm, node pkgs projects",
|
||||||
|
"type": "module",
|
||||||
|
"scripts": {
|
||||||
|
"start": "pm2 start apps/code-center/dist/app.mjs --name code-center",
|
||||||
|
"proxy": "pm2 start apps/page-proxy/dist/app.mjs --name page-proxy"
|
||||||
|
},
|
||||||
|
"keywords": [],
|
||||||
|
"author": "",
|
||||||
|
"license": "ISC",
|
||||||
|
"dependencies": {
|
||||||
|
"@kevisual/router": "^0.0.20",
|
||||||
|
"@kevisual/use-config": "^1.0.17",
|
||||||
|
"ioredis": "^5.6.1",
|
||||||
|
"minio": "^8.0.5",
|
||||||
|
"pg": "^8.16.0",
|
||||||
|
"pm2": "^6.0.6",
|
||||||
|
"sequelize": "^6.37.7",
|
||||||
|
"sqlite3": "^5.1.7",
|
||||||
|
"socket.io": "^4.8.1",
|
||||||
|
"dotenv": "^16.5.0"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
`,
|
||||||
|
);
|
||||||
|
console.log(chalk.green('助手 package.json 文件创建成功'));
|
||||||
|
}
|
||||||
|
return {
|
||||||
|
create,
|
||||||
|
};
|
||||||
|
}
|
||||||
protected getDefaultInitAssistantConfig() {
|
protected getDefaultInitAssistantConfig() {
|
||||||
return {
|
return {
|
||||||
description: '助手配置文件',
|
description: '助手配置文件',
|
||||||
|
25
assistant/src/services/init/package.json
Normal file
25
assistant/src/services/init/package.json
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
{
|
||||||
|
"name": "assistant-app",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"description": "assistant-app package pnpm, node pkgs projects",
|
||||||
|
"type": "module",
|
||||||
|
"scripts": {
|
||||||
|
"start": "pm2 start apps/code-center/dist/app.mjs --name code-center",
|
||||||
|
"proxy": "pm2 start apps/page-proxy/dist/app.mjs --name page-proxy"
|
||||||
|
},
|
||||||
|
"keywords": [],
|
||||||
|
"author": "",
|
||||||
|
"license": "ISC",
|
||||||
|
"dependencies": {
|
||||||
|
"@kevisual/router": "^0.0.20",
|
||||||
|
"@kevisual/use-config": "^1.0.17",
|
||||||
|
"ioredis": "^5.6.1",
|
||||||
|
"minio": "^8.0.5",
|
||||||
|
"pg": "^8.16.0",
|
||||||
|
"pm2": "^6.0.6",
|
||||||
|
"sequelize": "^6.37.7",
|
||||||
|
"sqlite3": "^5.1.7",
|
||||||
|
"socket.io": "^4.8.1",
|
||||||
|
"dotenv": "^16.5.0"
|
||||||
|
}
|
||||||
|
}
|
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@kevisual/envision-cli",
|
"name": "@kevisual/envision-cli",
|
||||||
"version": "0.0.51",
|
"version": "0.0.52-beta.0",
|
||||||
"description": "envision command tools",
|
"description": "envision command tools",
|
||||||
"main": "dist/app.mjs",
|
"main": "dist/app.mjs",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
|
@ -167,7 +167,7 @@ const rvm = new Command('registry')
|
|||||||
.option('-s, --set <registry>', 'set registry')
|
.option('-s, --set <registry>', 'set registry')
|
||||||
.action(async (opts) => {
|
.action(async (opts) => {
|
||||||
const config = getConfig();
|
const config = getConfig();
|
||||||
const defaultRegistry = ['https://kevisual.cn', 'https://kevisual.silkyai.cn', 'https://kevisual.xiongxiao.me'];
|
const defaultRegistry = ['https://kevisual.cn', 'https://kevisual.silkyai.cn', 'https://kevisual.xiongxiao.me', 'http://localhost:4005'];
|
||||||
if (opts.list) {
|
if (opts.list) {
|
||||||
showList(defaultRegistry);
|
showList(defaultRegistry);
|
||||||
return;
|
return;
|
||||||
@ -208,6 +208,14 @@ const xiongxiao = new Command('me').description('xiongxiao registry').action(asy
|
|||||||
showList(defaultRegistry);
|
showList(defaultRegistry);
|
||||||
});
|
});
|
||||||
baseURL.addCommand(xiongxiao);
|
baseURL.addCommand(xiongxiao);
|
||||||
|
const local = new Command('local').description('local registry').action(async (opts) => {
|
||||||
|
console.log('local registry');
|
||||||
|
const config = getConfig();
|
||||||
|
const defaultRegistry = ['http://localhost:4005'];
|
||||||
|
writeConfig({ ...config, baseURL: defaultRegistry[0] });
|
||||||
|
showList(defaultRegistry);
|
||||||
|
});
|
||||||
|
baseURL.addCommand(local);
|
||||||
|
|
||||||
const kv = new Command('kevisual').description('kevisual registry').action(async (opts) => {
|
const kv = new Command('kevisual').description('kevisual registry').action(async (opts) => {
|
||||||
console.log('kevisual registry');
|
console.log('kevisual registry');
|
||||||
|
@ -205,7 +205,7 @@ export const pack = async (opts: { isTar: boolean; packDist?: string }) => {
|
|||||||
const readmeContent = fs.readFileSync(readme, 'utf-8');
|
const readmeContent = fs.readFileSync(readme, 'utf-8');
|
||||||
collection.readme = readmeContent;
|
collection.readme = readmeContent;
|
||||||
}
|
}
|
||||||
return { collection, outputFilePath };
|
return { collection, outputFilePath, dir: cwd };
|
||||||
};
|
};
|
||||||
export const getPackageInfo = async () => {
|
export const getPackageInfo = async () => {
|
||||||
const cwd = process.cwd();
|
const cwd = process.cwd();
|
||||||
@ -287,14 +287,22 @@ export const packByIgnore = async (opts: PackByIgnoreOpts) => {
|
|||||||
const readmeContent = fs.readFileSync(readme, 'utf-8');
|
const readmeContent = fs.readFileSync(readme, 'utf-8');
|
||||||
collection.readme = readmeContent;
|
collection.readme = readmeContent;
|
||||||
}
|
}
|
||||||
return { collection, outputFilePath };
|
return { collection, outputFilePath, dir: cwd };
|
||||||
};
|
};
|
||||||
/**
|
/**
|
||||||
* 打包应用
|
* 打包应用
|
||||||
* @param ignore 是否忽略 .npmignore 文件
|
* @param ignore 是否忽略 .npmignore 文件
|
||||||
* @returns 打包结果
|
* @returns 打包结果
|
||||||
*/
|
*/
|
||||||
export const packLib = async ({ ignore = false, tar = false, packDist = 'pack-dist' }: { ignore?: boolean; tar?: boolean; packDist?: string }) => {
|
export const packLib = async ({
|
||||||
|
ignore = false,
|
||||||
|
tar = false,
|
||||||
|
packDist = 'pack-dist',
|
||||||
|
}: {
|
||||||
|
ignore?: boolean;
|
||||||
|
tar?: boolean;
|
||||||
|
packDist?: string;
|
||||||
|
}): Promise<{ collection: Record<string, any>; outputFilePath: string; dir: string }> => {
|
||||||
if (ignore) {
|
if (ignore) {
|
||||||
return await packByIgnore({ isTar: tar, packDist });
|
return await packByIgnore({ isTar: tar, packDist });
|
||||||
}
|
}
|
||||||
@ -367,6 +375,7 @@ const packCommand = new Command('pack')
|
|||||||
.option('-t, --tar', '打包为 tgz 文件')
|
.option('-t, --tar', '打包为 tgz 文件')
|
||||||
.option('-d, --packDist <dist>', '打包目录')
|
.option('-d, --packDist <dist>', '打包目录')
|
||||||
.option('-y, --yes', '确定,直接打包', true)
|
.option('-y, --yes', '确定,直接打包', true)
|
||||||
|
.option('-c, --clean', '清理 package.json中的 devDependencies')
|
||||||
.action(async (opts) => {
|
.action(async (opts) => {
|
||||||
const packDist = opts.packDist || 'pack-dist';
|
const packDist = opts.packDist || 'pack-dist';
|
||||||
const packageInfo = await getPackageInfo();
|
const packageInfo = await getPackageInfo();
|
||||||
@ -409,16 +418,20 @@ const packCommand = new Command('pack')
|
|||||||
]);
|
]);
|
||||||
appKey = answers.appKey || appKey;
|
appKey = answers.appKey || appKey;
|
||||||
}
|
}
|
||||||
let value: { collection: Record<string, any>; outputFilePath: string } = await packLib({
|
let value = await packLib({
|
||||||
ignore: opts.ignore,
|
ignore: opts.ignore,
|
||||||
tar: opts.tar,
|
tar: opts.tar,
|
||||||
packDist,
|
packDist,
|
||||||
});
|
});
|
||||||
|
if (opts?.clean) {
|
||||||
|
const newPackageJson = { ...packageInfo };
|
||||||
|
delete newPackageJson.devDependencies;
|
||||||
|
fs.writeFileSync(path.join(process.cwd(), 'pack-dist', 'package.json'), JSON.stringify(newPackageJson, null, 2));
|
||||||
|
}
|
||||||
if (opts.publish) {
|
if (opts.publish) {
|
||||||
// 运行 deploy 命令
|
// 运行 deploy 命令
|
||||||
const runDeployCommand = 'envision pack-deploy ' + value.outputFilePath + ' -k ' + appKey;
|
const runDeployCommand = 'envision pack-deploy ' + value.outputFilePath + ' -k ' + appKey;
|
||||||
const [_app, _command] = process.argv;
|
const [_app, _command] = process.argv;
|
||||||
console.log(chalk.blue('example: '), runDeployCommand);
|
|
||||||
let deployDist = opts.isTar ? value.outputFilePath : packDist;
|
let deployDist = opts.isTar ? value.outputFilePath : packDist;
|
||||||
const deployCommand = [_app, _command, 'deploy', deployDist, '-k', appKey, '-v', version, '-u'];
|
const deployCommand = [_app, _command, 'deploy', deployDist, '-k', appKey, '-v', version, '-u'];
|
||||||
if (opts.org) {
|
if (opts.org) {
|
||||||
@ -430,6 +443,9 @@ const packCommand = new Command('pack')
|
|||||||
if (opts.yes) {
|
if (opts.yes) {
|
||||||
deployCommand.push('-y', 'yes');
|
deployCommand.push('-y', 'yes');
|
||||||
}
|
}
|
||||||
|
console.log(chalk.blue('deploy doing: '), deployCommand.slice(2).join(' '), '\n\n');
|
||||||
|
console.log('pack deploy services', chalk.blue('example: '), runDeployCommand);
|
||||||
|
|
||||||
program.parse(deployCommand);
|
program.parse(deployCommand);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
Loading…
x
Reference in New Issue
Block a user