fix: remove abearxiong/use-config
This commit is contained in:
parent
40f42ca89b
commit
503727c6c4
@ -69,6 +69,7 @@
|
||||
},
|
||||
"devDependencies": {
|
||||
"@abearxiong/use-file-store": "^0.0.1",
|
||||
"@kevisual/use-config": "^1.0.1",
|
||||
"@rollup/plugin-alias": "^5.1.1",
|
||||
"@rollup/plugin-commonjs": "^28.0.1",
|
||||
"@rollup/plugin-json": "^6.1.0",
|
||||
|
8
pnpm-lock.yaml
generated
8
pnpm-lock.yaml
generated
@ -126,6 +126,9 @@ importers:
|
||||
'@abearxiong/use-file-store':
|
||||
specifier: ^0.0.1
|
||||
version: 0.0.1(esbuild@0.23.1)(typescript@5.6.3)
|
||||
'@kevisual/use-config':
|
||||
specifier: ^1.0.1
|
||||
version: 1.0.1
|
||||
'@rollup/plugin-alias':
|
||||
specifier: ^5.1.1
|
||||
version: 5.1.1(rollup@4.27.2)
|
||||
@ -1063,6 +1066,9 @@ packages:
|
||||
'@kevisual/router@0.0.5-alpha-2':
|
||||
resolution: {integrity: sha512-9cCa7CEji4q2ByMxxaxzqia42EzbBGdNGKqvs25c2qedAvnXbYaRpaiOdNSNiIXg+eTPQ0ah5HDNRcY2XApD8Q==}
|
||||
|
||||
'@kevisual/use-config@1.0.1':
|
||||
resolution: {integrity: sha512-3osr7pSS/PgvrIGG1Hiv0PUDubkFLei11hI0b9JNHZhnNhqHYv5W21Mr/vUOLJhvn+y5ltlL81ojUePmnYPH7w==}
|
||||
|
||||
'@langchain/core@0.3.3':
|
||||
resolution: {integrity: sha512-WAtkmhbdl2T41qzimTzhb3pXCHQxO4onqxzPxgdf3KftQdTwLq0YYBDhozRMZLNAd/+cfH0ymZGaZSsnc9Ogsg==}
|
||||
engines: {node: '>=18'}
|
||||
@ -4921,6 +4927,8 @@ snapshots:
|
||||
- bufferutil
|
||||
- utf-8-validate
|
||||
|
||||
'@kevisual/use-config@1.0.1': {}
|
||||
|
||||
'@langchain/core@0.3.3(openai@4.65.0(encoding@0.1.13)(zod@3.23.8))':
|
||||
dependencies:
|
||||
ansi-styles: 5.2.0
|
||||
|
@ -1,4 +1,4 @@
|
||||
import { useConfig } from '@abearxiong/use-config';
|
||||
import { useConfig } from '@kevisual/use-config';
|
||||
import { Sequelize } from 'sequelize';
|
||||
import path from 'path';
|
||||
import os from 'os';
|
||||
|
@ -1,5 +1,5 @@
|
||||
import { App } from '@kevisual/router';
|
||||
import { useConfig } from '@abearxiong/use-config';
|
||||
import { useConfig } from '@kevisual/use-config';
|
||||
import { dynamicImport } from './lib/dynamic-import.ts';
|
||||
import { redisPublisher, redisSubscriber, redis } from './modules/redis.ts';
|
||||
import { minioClient } from './modules/minio.ts';
|
||||
|
@ -1,4 +1,4 @@
|
||||
import { useConfig } from '@abearxiong/use-config';
|
||||
import { useConfig } from '@kevisual/use-config';
|
||||
import { app } from './app.ts';
|
||||
import './route.ts';
|
||||
const config = useConfig();
|
||||
|
@ -1,4 +1,4 @@
|
||||
import { useConfig } from '@abearxiong/use-config';
|
||||
import { useConfig } from '@kevisual/use-config';
|
||||
import { sequelize } from '@/modules/sequelize.ts';
|
||||
import { DataTypes, Model, Op } from 'sequelize';
|
||||
import { createToken, checkToken } from '@kevisual/auth/token';
|
||||
|
@ -1,5 +1,5 @@
|
||||
import { Queue } from 'bullmq';
|
||||
import { useConfig } from '@abearxiong/use-config';
|
||||
import { useConfig } from '@kevisual/use-config';
|
||||
const config = useConfig();
|
||||
|
||||
export const connection = {
|
||||
|
@ -1,5 +1,5 @@
|
||||
import { Client, ClientOptions } from 'minio';
|
||||
import { useConfig } from '@abearxiong/use-config';
|
||||
import { useConfig } from '@kevisual/use-config';
|
||||
|
||||
type MinioConfig = {
|
||||
minio: ClientOptions & { bucketName: string };
|
||||
|
@ -1,5 +1,5 @@
|
||||
import Neode from 'neode';
|
||||
import { useConfig } from '@abearxiong/use-config';
|
||||
import { useConfig } from '@kevisual/use-config';
|
||||
import neo4j from 'neo4j-driver';
|
||||
|
||||
type NeodeConfig = {
|
||||
|
@ -1,4 +1,4 @@
|
||||
import { useConfig } from '@abearxiong/use-config';
|
||||
import { useConfig } from '@kevisual/use-config';
|
||||
import { Ollama, Message, ChatRequest } from 'ollama';
|
||||
|
||||
const config = useConfig<{ ollama: Ollama['config'] & { model: string } }>();
|
||||
|
@ -1,5 +1,5 @@
|
||||
import { Redis } from 'ioredis';
|
||||
import { useConfig } from '@abearxiong/use-config';
|
||||
import { useConfig } from '@kevisual/use-config';
|
||||
|
||||
const config = useConfig<{
|
||||
redis: ConstructorParameters<typeof Redis>;
|
||||
|
@ -1,4 +1,4 @@
|
||||
import { useConfig } from '@abearxiong/use-config';
|
||||
import { useConfig } from '@kevisual/use-config';
|
||||
import { Sequelize } from 'sequelize';
|
||||
|
||||
type PostgresConfig = {
|
||||
|
@ -1,4 +1,4 @@
|
||||
import { useConfig } from '@abearxiong/use-config';
|
||||
import { useConfig } from '@kevisual/use-config';
|
||||
import { Sequelize } from 'sequelize';
|
||||
|
||||
type PostgresConfig = {
|
||||
|
@ -2,7 +2,7 @@
|
||||
// import { app as adminApp, appendTo } from './admin/index.ts';
|
||||
import './routes/index.ts';
|
||||
import { app } from './app.ts';
|
||||
import { useConfig } from '@abearxiong/use-config';
|
||||
import { useConfig } from '@kevisual/use-config';
|
||||
import { createAuthRoute } from '@kevisual/auth';
|
||||
const config = useConfig<{ tokenSecret: string }>();
|
||||
|
||||
|
@ -1,5 +1,5 @@
|
||||
import fetch from 'node-fetch';
|
||||
import { useConfig } from '@abearxiong/use-config';
|
||||
import { useConfig } from '@kevisual/use-config';
|
||||
|
||||
type GithubConfig = {
|
||||
clientId: string;
|
||||
|
22
src/routes/micro-app/lib/app-file.ts
Normal file
22
src/routes/micro-app/lib/app-file.ts
Normal file
@ -0,0 +1,22 @@
|
||||
import { useFileStore } from '@abearxiong/use-file-store';
|
||||
import glob from 'fast-glob';
|
||||
import fs from 'fs';
|
||||
import path from 'path';
|
||||
|
||||
export const appsPath = useFileStore('apps', { needExists: true });
|
||||
|
||||
export const loadAppInfo = async () => {
|
||||
const apps = await glob(`${appsPath}/*/\.config.json`, {
|
||||
cwd: appsPath,
|
||||
});
|
||||
const result = apps.map((app) => {
|
||||
const json = fs.readFileSync(path.join(appsPath, app), 'utf-8');
|
||||
const pkg = JSON.parse(json);
|
||||
const { name, version, app: appInfo } = pkg;
|
||||
if (!name || !version || !appInfo) {
|
||||
throw new Error('Invalid package.json');
|
||||
}
|
||||
return { key: app.split('/')[0], ...appInfo };
|
||||
});
|
||||
return result;
|
||||
};
|
10
src/routes/micro-app/lib/file.ts
Normal file
10
src/routes/micro-app/lib/file.ts
Normal file
@ -0,0 +1,10 @@
|
||||
import fs from 'fs';
|
||||
export const fileIsExist = (filePath: string): boolean => {
|
||||
try {
|
||||
// 使用 F_OK 检查文件或目录是否存在
|
||||
fs.accessSync(filePath, fs.constants.F_OK);
|
||||
return true;
|
||||
} catch (err) {
|
||||
return false;
|
||||
}
|
||||
};
|
1
src/routes/micro-app/lib/index.ts
Normal file
1
src/routes/micro-app/lib/index.ts
Normal file
@ -0,0 +1 @@
|
||||
export * from './app-file.ts';
|
@ -3,6 +3,7 @@ import { MicroAppModel } from './models.ts';
|
||||
import { appCheck, installApp } from './module/install-app.ts';
|
||||
import { loadApp } from './module/load-app.ts';
|
||||
|
||||
// 应用上传到 应用管理 的平台
|
||||
app
|
||||
.route({
|
||||
path: 'micro-app',
|
||||
@ -38,6 +39,10 @@ app
|
||||
.addTo(app);
|
||||
|
||||
// curl http://localhost:4002/api/router?path=micro-app&key=deploy
|
||||
// 把对应的应用安装到系统的apps目录下,并解压,然后把配置项写入数据库配置
|
||||
// key 是应用的唯一标识,和package.json中的key一致,绑定关系
|
||||
// 安装就就一定存在状态。这个时候需要判断这个应用的依赖关系,这个应用的开启状态。
|
||||
// 修改app的类型,这些模块是存在添加,不存在则删除。
|
||||
app
|
||||
.route({
|
||||
path: 'micro-app',
|
||||
|
@ -1,12 +1,10 @@
|
||||
import { minioClient } from '@/app.ts';
|
||||
import { bucketName } from '@/modules/minio.ts';
|
||||
import { checkFileExistsSync } from '@/routes/page/module/cache-file.ts';
|
||||
import { useFileStore } from '@abearxiong/use-file-store';
|
||||
import { fileIsExist } from '../lib/file.ts';
|
||||
import fs from 'fs';
|
||||
import path from 'path';
|
||||
import * as tar from 'tar';
|
||||
|
||||
const appsPath = useFileStore('apps', { needExists: true });
|
||||
import { appsPath } from '../lib/index.ts';
|
||||
|
||||
export type InstallAppOpts = {
|
||||
path?: string;
|
||||
@ -15,7 +13,7 @@ export type InstallAppOpts = {
|
||||
export const appCheck = async (opts: InstallAppOpts) => {
|
||||
const { key } = opts;
|
||||
const directory = path.join(appsPath, key);
|
||||
if (checkFileExistsSync(directory)) {
|
||||
if (fileIsExist(directory)) {
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
@ -25,7 +23,7 @@ export const installApp = async (opts: InstallAppOpts) => {
|
||||
const fileStream = await minioClient.getObject(bucketName, opts.path);
|
||||
const pathName = opts.path.split('/').pop();
|
||||
const directory = path.join(appsPath, key);
|
||||
if (!checkFileExistsSync(directory)) {
|
||||
if (!fileIsExist(directory)) {
|
||||
fs.mkdirSync(directory, { recursive: true });
|
||||
}
|
||||
const filePath = path.join(directory, pathName);
|
||||
@ -44,7 +42,7 @@ export const installApp = async (opts: InstallAppOpts) => {
|
||||
cwd: extractPath,
|
||||
});
|
||||
const pkgs = path.join(extractPath, 'package.json');
|
||||
if (!checkFileExistsSync(pkgs)) {
|
||||
if (!fileIsExist(pkgs)) {
|
||||
throw new Error('Invalid package.json');
|
||||
}
|
||||
const json = fs.readFileSync(pkgs, 'utf-8');
|
||||
@ -58,3 +56,5 @@ export const installApp = async (opts: InstallAppOpts) => {
|
||||
// fs.unlinkSync(filePath);
|
||||
return { path: filePath };
|
||||
};
|
||||
|
||||
|
||||
|
@ -1,16 +1,17 @@
|
||||
import { checkFileExistsSync } from '@/routes/page/module/cache-file.ts';
|
||||
import { fileIsExist } from '../lib/file.ts';
|
||||
import { useFileStore } from '@abearxiong/use-file-store';
|
||||
import fs from 'fs';
|
||||
import path from 'path';
|
||||
|
||||
const appsPath = useFileStore('apps', { needExists: true });
|
||||
export const loadApp = async (key: string) => {
|
||||
export const appsPath = useFileStore('apps', { needExists: true });
|
||||
|
||||
export const loadAppInfo = async (key: string) => {
|
||||
const directory = path.join(appsPath, key);
|
||||
if (!checkFileExistsSync(directory)) {
|
||||
if (!fileIsExist(directory)) {
|
||||
throw new Error('app not found');
|
||||
}
|
||||
const pkgs = path.join(directory, 'package.json');
|
||||
if (!checkFileExistsSync(pkgs)) {
|
||||
if (!fileIsExist(pkgs)) {
|
||||
throw new Error('Invalid package.json');
|
||||
}
|
||||
const json = fs.readFileSync(pkgs, 'utf-8');
|
||||
@ -21,9 +22,21 @@ export const loadApp = async (key: string) => {
|
||||
}
|
||||
|
||||
const mainEntry = path.join(directory, app.entry);
|
||||
if (!checkFileExistsSync(mainEntry)) {
|
||||
if (!fileIsExist(mainEntry)) {
|
||||
throw new Error('Invalid main entry');
|
||||
}
|
||||
return { mainEntry, app };
|
||||
};
|
||||
|
||||
export const loadApp = async (key: string) => {
|
||||
const { mainEntry } = await loadAppInfo(key);
|
||||
// 1. 查询数据库,获取app信息,查看是否运行中
|
||||
// 2. 如果运行中,直接返回
|
||||
// 3. 如果不在运行中,加载app
|
||||
// 3.1 查看app的类型,如果是 system-app,直接加载
|
||||
// 3.2 如果是 micro-app,查找相关的依赖,如果依赖不存在,先加载依赖
|
||||
// 3.3 使用fork加载app
|
||||
// 4. 记录app的运行状态,程序重新启动时,重新加载
|
||||
const main = await import(mainEntry);
|
||||
return main;
|
||||
};
|
||||
|
37
src/routes/micro-app/module/manager.ts
Normal file
37
src/routes/micro-app/module/manager.ts
Normal file
@ -0,0 +1,37 @@
|
||||
export enum AppType {
|
||||
SystemApp = 'system-app',
|
||||
MicroApp = 'micro-app',
|
||||
GatewayApp = 'gateway-app',
|
||||
}
|
||||
export type AppInfo = {
|
||||
status?: 'active' | 'inactive'; // 默认运行状态
|
||||
key: string;
|
||||
type?: AppType; // 默认类型
|
||||
entry?: string; // 入口文件
|
||||
path?: string; // 文件路径
|
||||
};
|
||||
|
||||
export class Manager<T extends AppInfo = any> {
|
||||
apps: Map<string, T>;
|
||||
constructor() {
|
||||
this.apps = new Map();
|
||||
}
|
||||
/**
|
||||
* 检查key是否存在
|
||||
* @param key
|
||||
* @returns
|
||||
*/
|
||||
checkKey(key: string) {
|
||||
return this.apps.has(key);
|
||||
}
|
||||
/*
|
||||
* 获取app信息
|
||||
* @param key
|
||||
*/
|
||||
add(app: T) {
|
||||
this.apps.set(app.key, app);
|
||||
}
|
||||
load() {
|
||||
// 从apps文件夹列表当中中加载app信息
|
||||
}
|
||||
}
|
11
src/routes/micro-app/routes/manager.ts
Normal file
11
src/routes/micro-app/routes/manager.ts
Normal file
@ -0,0 +1,11 @@
|
||||
import { app } from '@/app.ts';
|
||||
|
||||
app
|
||||
.route({
|
||||
path: 'micro-app-manager',
|
||||
key: 'list',
|
||||
})
|
||||
.define(async (ctx) => {
|
||||
//
|
||||
})
|
||||
.addTo(app);
|
Loading…
x
Reference in New Issue
Block a user