从@abearxiong/config拷贝过来
This commit is contained in:
		
							
								
								
									
										7
									
								
								.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,7 @@
 | 
				
			|||||||
 | 
					node_modules
 | 
				
			||||||
 | 
					dist
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.DS_Store
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					app.config.json5
 | 
				
			||||||
 | 
					
 | 
				
			||||||
							
								
								
									
										3
									
								
								.npmrc
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								.npmrc
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,3 @@
 | 
				
			|||||||
 | 
					//npm.xiongxiao.me/:_authToken=${ME_NPM_TOKEN}
 | 
				
			||||||
 | 
					@abearxiong:registry=https://npm.pkg.github.com
 | 
				
			||||||
 | 
					//registry.npmjs.org/:_authToken=${NPM_TOKEN}
 | 
				
			||||||
							
								
								
									
										87
									
								
								config/app-schema.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										87
									
								
								config/app-schema.json
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,87 @@
 | 
				
			|||||||
 | 
					{
 | 
				
			||||||
 | 
					  "$schema": "http://json-schema.org/draft-07/schema#",
 | 
				
			||||||
 | 
					  "title": "App Configuration Schema",
 | 
				
			||||||
 | 
					  "type": "object",
 | 
				
			||||||
 | 
					  "properties": {
 | 
				
			||||||
 | 
					    "type": {
 | 
				
			||||||
 | 
					      "type": "string",
 | 
				
			||||||
 | 
					      "enum": [
 | 
				
			||||||
 | 
					        "inline-app",
 | 
				
			||||||
 | 
					        "micro-app"
 | 
				
			||||||
 | 
					      ],
 | 
				
			||||||
 | 
					      "$comment": "Type must be either 'inline-app' or 'micro-app'"
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "single": {
 | 
				
			||||||
 | 
					      "type": "boolean",
 | 
				
			||||||
 | 
					      "$comment": "是否单例模式,独立启动服务。"
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "port": {
 | 
				
			||||||
 | 
					      "type": "integer",
 | 
				
			||||||
 | 
					      "minimum": 0,
 | 
				
			||||||
 | 
					      "maximum": 65535,
 | 
				
			||||||
 | 
					      "$comment": "开发和单例启动服务的端口"
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "remote": {
 | 
				
			||||||
 | 
					      "type": "object",
 | 
				
			||||||
 | 
					      "properties": {
 | 
				
			||||||
 | 
					        "host": {
 | 
				
			||||||
 | 
					          "type": "string",
 | 
				
			||||||
 | 
					          "format": "hostname"
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        "path": {
 | 
				
			||||||
 | 
					          "type": "string",
 | 
				
			||||||
 | 
					          "pattern": "^/.*"
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      "required": [
 | 
				
			||||||
 | 
					        "host",
 | 
				
			||||||
 | 
					        "path"
 | 
				
			||||||
 | 
					      ]
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "micro": {
 | 
				
			||||||
 | 
					      "type": "object",
 | 
				
			||||||
 | 
					      "properties": {
 | 
				
			||||||
 | 
					        "serve": {
 | 
				
			||||||
 | 
					          "type": "object",
 | 
				
			||||||
 | 
					          "properties": {
 | 
				
			||||||
 | 
					            "name": {
 | 
				
			||||||
 | 
					              "type": "string",
 | 
				
			||||||
 | 
					              "pattern": "^[a-z0-9-]+$",
 | 
				
			||||||
 | 
					              "$comment": "服务名称"
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            "port": {
 | 
				
			||||||
 | 
					              "type": "integer",
 | 
				
			||||||
 | 
					              "minimum": 0,
 | 
				
			||||||
 | 
					              "maximum": 65535,
 | 
				
			||||||
 | 
					              "$comment": "启动的服务端口"
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					          },
 | 
				
			||||||
 | 
					          "required": []
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        "remote": {
 | 
				
			||||||
 | 
					          "type": "object",
 | 
				
			||||||
 | 
					          "properties": {
 | 
				
			||||||
 | 
					            "host": {
 | 
				
			||||||
 | 
					              "type": "string",
 | 
				
			||||||
 | 
					              "format": "hostname"
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            "port": {
 | 
				
			||||||
 | 
					              "type": "integer",
 | 
				
			||||||
 | 
					              "minimum": 0,
 | 
				
			||||||
 | 
					              "maximum": 65535,
 | 
				
			||||||
 | 
					              "$comment": "链接的远程地址的端口"
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					          },
 | 
				
			||||||
 | 
					          "required": [
 | 
				
			||||||
 | 
					            "host",
 | 
				
			||||||
 | 
					            "port"
 | 
				
			||||||
 | 
					          ]
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      "required": []
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  "required": [
 | 
				
			||||||
 | 
					    "type"
 | 
				
			||||||
 | 
					  ]
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										15
									
								
								config/demo/inline-app.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								config/demo/inline-app.json
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,15 @@
 | 
				
			|||||||
 | 
					{
 | 
				
			||||||
 | 
					  "$schema": "../schema.json",
 | 
				
			||||||
 | 
					  "app": {
 | 
				
			||||||
 | 
					    "type": "inline-app",
 | 
				
			||||||
 | 
					    "port": 14000,
 | 
				
			||||||
 | 
					    "remote": {
 | 
				
			||||||
 | 
					      "host": "localhost",
 | 
				
			||||||
 | 
					      "path": "/api/router"
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "micro": {
 | 
				
			||||||
 | 
					      "name": "micro-app",
 | 
				
			||||||
 | 
					      "port": 3001
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										17
									
								
								config/demo/micro-app.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										17
									
								
								config/demo/micro-app.json
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,17 @@
 | 
				
			|||||||
 | 
					{
 | 
				
			||||||
 | 
					  "$schema": "../schema.json",
 | 
				
			||||||
 | 
					  "app": {
 | 
				
			||||||
 | 
					    "type": "micro-app",
 | 
				
			||||||
 | 
					    "port": 14000,
 | 
				
			||||||
 | 
					    "remote": {
 | 
				
			||||||
 | 
					      "host": "localhost",
 | 
				
			||||||
 | 
					      "path": "/api/router"
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "micro": {
 | 
				
			||||||
 | 
					      "remote": {
 | 
				
			||||||
 | 
					        "host": "localhost",
 | 
				
			||||||
 | 
					        "port": 3001
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										13
									
								
								config/schema.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								config/schema.json
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,13 @@
 | 
				
			|||||||
 | 
					{
 | 
				
			||||||
 | 
					  "$schema": "http://json-schema.org/draft-07/schema#",
 | 
				
			||||||
 | 
					  "title": "Packages JSON Schema",
 | 
				
			||||||
 | 
					  "type": "object",
 | 
				
			||||||
 | 
					  "properties": {
 | 
				
			||||||
 | 
					    "app": {
 | 
				
			||||||
 | 
					      "$ref": "./app-schema.json"
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  "required": [
 | 
				
			||||||
 | 
					    "app"
 | 
				
			||||||
 | 
					  ]
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										16
									
								
								demo/package.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								demo/package.json
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,16 @@
 | 
				
			|||||||
 | 
					{
 | 
				
			||||||
 | 
					  "name": "demo",
 | 
				
			||||||
 | 
					  "version": "0.0.1",
 | 
				
			||||||
 | 
					  "description": "",
 | 
				
			||||||
 | 
					  "main": "index.js",
 | 
				
			||||||
 | 
					  "scripts": {
 | 
				
			||||||
 | 
					    "test": "echo \"Error: no test specified\" && exit 1"
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  "keywords": [],
 | 
				
			||||||
 | 
					  "author": "abearxiong <xiongxiao@xiongxiao.me>",
 | 
				
			||||||
 | 
					  "license": "MIT",
 | 
				
			||||||
 | 
					  "type": "module",
 | 
				
			||||||
 | 
					  "dependencies": {
 | 
				
			||||||
 | 
					    "@kevisual/user-config": "link:.."
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										5
									
								
								demo/src/app/a.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								demo/src/app/a.ts
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,5 @@
 | 
				
			|||||||
 | 
					import { getApps } from '@kevisual/user-config/pkgs';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const apps = getApps();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// apps.micro
 | 
				
			||||||
							
								
								
									
										4
									
								
								demo/src/index.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										4
									
								
								demo/src/index.ts
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,4 @@
 | 
				
			|||||||
 | 
					import { useConfig } from '@kevisual/user-config';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// console.log(useConfig);
 | 
				
			||||||
 | 
					console.log(useConfig());
 | 
				
			||||||
							
								
								
									
										50
									
								
								package.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										50
									
								
								package.json
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,50 @@
 | 
				
			|||||||
 | 
					{
 | 
				
			||||||
 | 
					  "name": "@kevisual/user-config",
 | 
				
			||||||
 | 
					  "version": "1.0.1",
 | 
				
			||||||
 | 
					  "types": "dist/config.d.ts",
 | 
				
			||||||
 | 
					  "scripts": {
 | 
				
			||||||
 | 
					    "build": "npm run clean && rollup -c",
 | 
				
			||||||
 | 
					    "watch": " rollup -c -w",
 | 
				
			||||||
 | 
					    "clean": "rimraf dist"
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  "files": [
 | 
				
			||||||
 | 
					    "dist",
 | 
				
			||||||
 | 
					    "src",
 | 
				
			||||||
 | 
					    "config"
 | 
				
			||||||
 | 
					  ],
 | 
				
			||||||
 | 
					  "keywords": [],
 | 
				
			||||||
 | 
					  "author": "abearxiong <xiongxiao@xiongxiao.me>",
 | 
				
			||||||
 | 
					  "license": "UNLICENSED",
 | 
				
			||||||
 | 
					  "type": "module",
 | 
				
			||||||
 | 
					  "devDependencies": {
 | 
				
			||||||
 | 
					    "@rollup/plugin-alias": "^5.1.1",
 | 
				
			||||||
 | 
					    "@rollup/plugin-commonjs": "^28.0.1",
 | 
				
			||||||
 | 
					    "@rollup/plugin-json": "^6.1.0",
 | 
				
			||||||
 | 
					    "@rollup/plugin-node-resolve": "^15.3.0",
 | 
				
			||||||
 | 
					    "@rollup/plugin-replace": "^6.0.1",
 | 
				
			||||||
 | 
					    "@rollup/plugin-typescript": "^12.1.1",
 | 
				
			||||||
 | 
					    "@types/node": "^22.9.0",
 | 
				
			||||||
 | 
					    "chalk": "^5.3.0",
 | 
				
			||||||
 | 
					    "commander": "^12.1.0",
 | 
				
			||||||
 | 
					    "glob": "^11.0.0",
 | 
				
			||||||
 | 
					    "json-schema-to-ts": "^3.1.1",
 | 
				
			||||||
 | 
					    "json5": "^2.2.3",
 | 
				
			||||||
 | 
					    "rollup": "^4.26.0",
 | 
				
			||||||
 | 
					    "rollup-plugin-copy": "^3.5.0",
 | 
				
			||||||
 | 
					    "rollup-plugin-dts": "^6.1.1",
 | 
				
			||||||
 | 
					    "rollup-plugin-esbuild": "^6.1.1",
 | 
				
			||||||
 | 
					    "rollup-plugin-inject": "^3.0.2",
 | 
				
			||||||
 | 
					    "tslib": "^2.8.1",
 | 
				
			||||||
 | 
					    "typescript": "^5.6.2"
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  "exports": {
 | 
				
			||||||
 | 
					    ".": {
 | 
				
			||||||
 | 
					      "import": "./dist/config.mjs",
 | 
				
			||||||
 | 
					      "types": "./dist/config.d.ts"
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "./pkgs": {
 | 
				
			||||||
 | 
					      "import": "./dist/pkgs.mjs",
 | 
				
			||||||
 | 
					      "types": "./dist/pkgs.d.ts"
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										52
									
								
								rollup.config.mjs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										52
									
								
								rollup.config.mjs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,52 @@
 | 
				
			|||||||
 | 
					// rollup.config.js
 | 
				
			||||||
 | 
					import typescript from '@rollup/plugin-typescript';
 | 
				
			||||||
 | 
					import resolve from '@rollup/plugin-node-resolve';
 | 
				
			||||||
 | 
					import commonjs from '@rollup/plugin-commonjs';
 | 
				
			||||||
 | 
					import { dts } from 'rollup-plugin-dts';
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * @type {import('rollup').RollupOptions}
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					export default [
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    input: 'src/config.ts', // TypeScript 入口文件
 | 
				
			||||||
 | 
					    output: {
 | 
				
			||||||
 | 
					      file: 'dist/config.mjs', // 输出文件
 | 
				
			||||||
 | 
					      format: 'es', // 输出格式设置为 ES 模块
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    plugins: [
 | 
				
			||||||
 | 
					      resolve(), // 使用 @rollup/plugin-node-resolve 解析 node_modules 中的模块
 | 
				
			||||||
 | 
					      commonjs(),
 | 
				
			||||||
 | 
					      typescript(), // 使用 @rollup/plugin-typescript 处理 TypeScript 文件
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					    external: [],
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    input: 'src/config.ts',
 | 
				
			||||||
 | 
					    output: {
 | 
				
			||||||
 | 
					      file: 'dist/config.d.ts',
 | 
				
			||||||
 | 
					      format: 'es',
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    plugins: [dts()],
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    input: 'src/pkgs.ts', // TypeScript 入口文件
 | 
				
			||||||
 | 
					    output: {
 | 
				
			||||||
 | 
					      file: 'dist/pkgs.mjs', // 输出文件
 | 
				
			||||||
 | 
					      format: 'es', // 输出格式设置为 ES 模块
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    plugins: [
 | 
				
			||||||
 | 
					      resolve(), // 使用 @rollup/plugin-node-resolve 解析 node_modules 中的模块
 | 
				
			||||||
 | 
					      commonjs(),
 | 
				
			||||||
 | 
					      typescript(), // 使用 @rollup/plugin-typescript 处理 TypeScript 文件
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					    external: [],
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    input: 'src/pkgs.ts',
 | 
				
			||||||
 | 
					    output: {
 | 
				
			||||||
 | 
					      file: 'dist/pkgs.d.ts',
 | 
				
			||||||
 | 
					      format: 'es',
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    plugins: [dts()],
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					];
 | 
				
			||||||
							
								
								
									
										139
									
								
								src/config.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										139
									
								
								src/config.ts
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,139 @@
 | 
				
			|||||||
 | 
					import JSON5 from 'json5';
 | 
				
			||||||
 | 
					import fs from 'fs';
 | 
				
			||||||
 | 
					import path from 'path';
 | 
				
			||||||
 | 
					import { fileURLToPath } from 'url';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const __filename = fileURLToPath(import.meta.url); // 当前模块的文件路径
 | 
				
			||||||
 | 
					const __dirname = path.dirname(__filename); // 当前模块的目录路径
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// 配置类型
 | 
				
			||||||
 | 
					export type Config = {
 | 
				
			||||||
 | 
					  port: number;
 | 
				
			||||||
 | 
					  tokenSecret?: string;
 | 
				
			||||||
 | 
					  redis?: {
 | 
				
			||||||
 | 
					    host?: string;
 | 
				
			||||||
 | 
					    port?: number;
 | 
				
			||||||
 | 
					    password?: string;
 | 
				
			||||||
 | 
					    version?: string;
 | 
				
			||||||
 | 
					    [key: string]: any;
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					  posgtres?: {
 | 
				
			||||||
 | 
					    host?: string;
 | 
				
			||||||
 | 
					    port?: number;
 | 
				
			||||||
 | 
					    user?: string;
 | 
				
			||||||
 | 
					    password?: string;
 | 
				
			||||||
 | 
					    database?: string;
 | 
				
			||||||
 | 
					    [key: string]: any;
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					  minio?: {
 | 
				
			||||||
 | 
					    endPoint?: string;
 | 
				
			||||||
 | 
					    bucketName?: string;
 | 
				
			||||||
 | 
					    useSSL?: boolean;
 | 
				
			||||||
 | 
					    accessKey?: string;
 | 
				
			||||||
 | 
					    secretKey?: string;
 | 
				
			||||||
 | 
					    [key: string]: any;
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					  mongo?: {
 | 
				
			||||||
 | 
					    uri?: string;
 | 
				
			||||||
 | 
					    [key: string]: any;
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					  [key: string]: any;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					export const initConfig: Config = {
 | 
				
			||||||
 | 
					  port: 3000,
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					export const fileIsExist = (path: string) => {
 | 
				
			||||||
 | 
					  try {
 | 
				
			||||||
 | 
					    fs.accessSync(path, fs.constants.F_OK);
 | 
				
			||||||
 | 
					    return true;
 | 
				
			||||||
 | 
					  } catch (e) {
 | 
				
			||||||
 | 
					    return false;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					export const getDirname = () => {
 | 
				
			||||||
 | 
					  const isDev = getNODE_ENV() === 'development';
 | 
				
			||||||
 | 
					  if (isDev) {
 | 
				
			||||||
 | 
					    return path.resolve();
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  return __dirname;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					export const getConfigFile = (fileName = 'app.config.json5') => {
 | 
				
			||||||
 | 
					  const dirname = getDirname();
 | 
				
			||||||
 | 
					  // 本级
 | 
				
			||||||
 | 
					  const benPath = dirname + '/' + fileName;
 | 
				
			||||||
 | 
					  const ben = fileIsExist(benPath);
 | 
				
			||||||
 | 
					  if (ben) return benPath;
 | 
				
			||||||
 | 
					  // 上级
 | 
				
			||||||
 | 
					  const lastPath = path.join(dirname, '../' + fileName);
 | 
				
			||||||
 | 
					  const last = fileIsExist(lastPath);
 | 
				
			||||||
 | 
					  if (last) return lastPath;
 | 
				
			||||||
 | 
					  // 上上级
 | 
				
			||||||
 | 
					  const lastLastPath = path.join(dirname, '../../' + fileName);
 | 
				
			||||||
 | 
					  const lastLast = fileIsExist(lastLastPath);
 | 
				
			||||||
 | 
					  if (lastLast) return lastLastPath;
 | 
				
			||||||
 | 
					  return '';
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					// 初始化读取配置文件
 | 
				
			||||||
 | 
					export const init = (initConfigBase?: any): Config => {
 | 
				
			||||||
 | 
					  const dirname = getDirname();
 | 
				
			||||||
 | 
					  try {
 | 
				
			||||||
 | 
					    // 配置读取路径,3级判断
 | 
				
			||||||
 | 
					    const filePath = getConfigFile();
 | 
				
			||||||
 | 
					    console.log('config pathname:', filePath);
 | 
				
			||||||
 | 
					    if (!filePath) {
 | 
				
			||||||
 | 
					      throw new Error('未找到配置文件');
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    const configString = fs.readFileSync(filePath, {
 | 
				
			||||||
 | 
					      encoding: 'utf-8',
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					    const value = JSON5.parse(configString);
 | 
				
			||||||
 | 
					    return value;
 | 
				
			||||||
 | 
					  } catch (e) {
 | 
				
			||||||
 | 
					    const root = dirname + '/app.config.json5';
 | 
				
			||||||
 | 
					    if (!fileIsExist(root)) {
 | 
				
			||||||
 | 
					      fs.writeFileSync(root, JSON5.stringify(initConfigBase || initConfig, null, 2), {
 | 
				
			||||||
 | 
					        encoding: 'utf8',
 | 
				
			||||||
 | 
					      });
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    console.error('未找到配置文件,初始化配置', root);
 | 
				
			||||||
 | 
					    // console.error('error', e);
 | 
				
			||||||
 | 
					    return initConfig;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * 从全局获取
 | 
				
			||||||
 | 
					 * @param initConfig 在全局未找到配置时,初始化配置的内容
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * @returns Config
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					export const useConfig = <T>(initConfig?: any): Config & T => {
 | 
				
			||||||
 | 
					  const config = (global as any).config;
 | 
				
			||||||
 | 
					  const _config = config || init(initConfig);
 | 
				
			||||||
 | 
					  !config && ((global as any)['config'] = _config);
 | 
				
			||||||
 | 
					  return _config;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export const useContext = (key: string, value: any): any => {
 | 
				
			||||||
 | 
					  const _context = global as any;
 | 
				
			||||||
 | 
					  if (key && value) {
 | 
				
			||||||
 | 
					    _context[key] = value;
 | 
				
			||||||
 | 
					    return _context;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  if (key) {
 | 
				
			||||||
 | 
					    return _context[key];
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  return _context;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					export const deleteContext = (key: string): any => {
 | 
				
			||||||
 | 
					  const _context = global as any;
 | 
				
			||||||
 | 
					  if (key && _context[key]) {
 | 
				
			||||||
 | 
					    delete _context[key];
 | 
				
			||||||
 | 
					    return _context;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  return _context;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export const getNODE_ENV = (): string => {
 | 
				
			||||||
 | 
					  return process?.env?.NODE_ENV || 'production';
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
							
								
								
									
										23
									
								
								src/pkgs.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								src/pkgs.ts
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,23 @@
 | 
				
			|||||||
 | 
					import path from 'path';
 | 
				
			||||||
 | 
					import fs from 'fs';
 | 
				
			||||||
 | 
					import type { App } from './read-app-schema.ts';
 | 
				
			||||||
 | 
					import { fileURLToPath } from 'url';
 | 
				
			||||||
 | 
					import { getConfigFile } from './config.ts';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const __filename = fileURLToPath(import.meta.url); // 当前模块的文件路径
 | 
				
			||||||
 | 
					const __dirname = path.dirname(__filename); // 当前模块的目录路径
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export const getPkgs = () => {
 | 
				
			||||||
 | 
					  const configFile = getConfigFile();
 | 
				
			||||||
 | 
					  if (!configFile) {
 | 
				
			||||||
 | 
					    console.error('配置文件不存在');
 | 
				
			||||||
 | 
					    return {};
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  const config = JSON.parse(fs.readFileSync(configFile, 'utf-8'));
 | 
				
			||||||
 | 
					  return config;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export const getApps = (): App => {
 | 
				
			||||||
 | 
					  const config = getPkgs();
 | 
				
			||||||
 | 
					  return config.apps || {};
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
							
								
								
									
										79
									
								
								src/read-app-schema.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										79
									
								
								src/read-app-schema.ts
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,79 @@
 | 
				
			|||||||
 | 
					import { FromSchema } from 'json-schema-to-ts';
 | 
				
			||||||
 | 
					const App = {
 | 
				
			||||||
 | 
					  $schema: 'http://json-schema.org/draft-07/schema#',
 | 
				
			||||||
 | 
					  title: 'App Configuration Schema',
 | 
				
			||||||
 | 
					  type: 'object',
 | 
				
			||||||
 | 
					  properties: {
 | 
				
			||||||
 | 
					    type: {
 | 
				
			||||||
 | 
					      type: 'string',
 | 
				
			||||||
 | 
					      enum: ['inline-app', 'micro-app'],
 | 
				
			||||||
 | 
					      $comment: "Type must be either 'inline-app' or 'micro-app'",
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    single: {
 | 
				
			||||||
 | 
					      type: 'boolean',
 | 
				
			||||||
 | 
					      $comment: '是否单例模式,独立启动服务。',
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    port: {
 | 
				
			||||||
 | 
					      type: 'integer',
 | 
				
			||||||
 | 
					      minimum: 0,
 | 
				
			||||||
 | 
					      maximum: 65535,
 | 
				
			||||||
 | 
					      $comment: '开发和单例启动服务的端口',
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    remote: {
 | 
				
			||||||
 | 
					      type: 'object',
 | 
				
			||||||
 | 
					      properties: {
 | 
				
			||||||
 | 
					        host: {
 | 
				
			||||||
 | 
					          type: 'string',
 | 
				
			||||||
 | 
					          format: 'hostname',
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        path: {
 | 
				
			||||||
 | 
					          type: 'string',
 | 
				
			||||||
 | 
					          pattern: '^/.*',
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      required: ['host', 'path'],
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    micro: {
 | 
				
			||||||
 | 
					      type: 'object',
 | 
				
			||||||
 | 
					      properties: {
 | 
				
			||||||
 | 
					        serve: {
 | 
				
			||||||
 | 
					          type: 'object',
 | 
				
			||||||
 | 
					          properties: {
 | 
				
			||||||
 | 
					            name: {
 | 
				
			||||||
 | 
					              type: 'string',
 | 
				
			||||||
 | 
					              pattern: '^[a-z0-9-]+$',
 | 
				
			||||||
 | 
					              $comment: '服务名称',
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            port: {
 | 
				
			||||||
 | 
					              type: 'integer',
 | 
				
			||||||
 | 
					              minimum: 0,
 | 
				
			||||||
 | 
					              maximum: 65535,
 | 
				
			||||||
 | 
					              $comment: '启动的服务端口',
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					          },
 | 
				
			||||||
 | 
					          required: [],
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        remote: {
 | 
				
			||||||
 | 
					          type: 'object',
 | 
				
			||||||
 | 
					          properties: {
 | 
				
			||||||
 | 
					            host: {
 | 
				
			||||||
 | 
					              type: 'string',
 | 
				
			||||||
 | 
					              format: 'hostname',
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            port: {
 | 
				
			||||||
 | 
					              type: 'integer',
 | 
				
			||||||
 | 
					              minimum: 0,
 | 
				
			||||||
 | 
					              maximum: 65535,
 | 
				
			||||||
 | 
					              $comment: '链接的远程地址的端口',
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					          },
 | 
				
			||||||
 | 
					          required: ['host', 'port'],
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      required: [],
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  required: ['type'],
 | 
				
			||||||
 | 
					} as const;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export type App = FromSchema<typeof App>;
 | 
				
			||||||
							
								
								
									
										34
									
								
								tsconfig.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										34
									
								
								tsconfig.json
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,34 @@
 | 
				
			|||||||
 | 
					{
 | 
				
			||||||
 | 
					  "compilerOptions": {
 | 
				
			||||||
 | 
					    "module": "NodeNext",
 | 
				
			||||||
 | 
					    "target": "esnext",
 | 
				
			||||||
 | 
					    "noImplicitAny": false,
 | 
				
			||||||
 | 
					    "outDir": "./dist",
 | 
				
			||||||
 | 
					    "sourceMap": false,
 | 
				
			||||||
 | 
					    "allowJs": true,
 | 
				
			||||||
 | 
					    "newLine": "LF",
 | 
				
			||||||
 | 
					    "baseUrl": "./",
 | 
				
			||||||
 | 
					    "typeRoots": [
 | 
				
			||||||
 | 
					      "node_modules/@types",
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					    "declaration": false,
 | 
				
			||||||
 | 
					    "noEmit": true,
 | 
				
			||||||
 | 
					    "allowImportingTsExtensions": true,
 | 
				
			||||||
 | 
					    "moduleResolution": "NodeNext",
 | 
				
			||||||
 | 
					    "experimentalDecorators": true,
 | 
				
			||||||
 | 
					    "emitDecoratorMetadata": true,
 | 
				
			||||||
 | 
					    "esModuleInterop": true,
 | 
				
			||||||
 | 
					    "paths": {
 | 
				
			||||||
 | 
					      "@/*": [
 | 
				
			||||||
 | 
					        "src/*"
 | 
				
			||||||
 | 
					      ],
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  "include": [
 | 
				
			||||||
 | 
					    "src/**/*.ts"
 | 
				
			||||||
 | 
					  ],
 | 
				
			||||||
 | 
					  "exclude": [
 | 
				
			||||||
 | 
					    "node_modules",
 | 
				
			||||||
 | 
					    "rollup.config.js",
 | 
				
			||||||
 | 
					  ]
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
		Reference in New Issue
	
	Block a user