@aicblock/nserve 1.0.4 → 1.0.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -4,7 +4,7 @@
4
4
  ![npm](https://img.shields.io/npm/dm/@aicblock/nserve)
5
5
  ![NPM](https://img.shields.io/npm/l/@aicblock/nserve)
6
6
 
7
- # NServe 用户使用文档
7
+ # NServe 1.0.8 用户使用文档
8
8
 
9
9
  ## 1. 项目简介
10
10
 
@@ -32,6 +32,17 @@ $ yarn create nserve@latest
32
32
  $ pnpm create nserve@latest
33
33
  ```
34
34
 
35
+ 选择空白模板或 MySQL 模板并输入项目名后,进入生成的项目目录:
36
+
37
+ ```bash
38
+ cd <项目目录>
39
+ npm install
40
+ npm run gen
41
+ npm run dev
42
+ ```
43
+
44
+ MySQL 模板启动前需要在 `nserve.config.ts` 配置 `yamlConfig.MYSQL_CONF`,并准备可连接的数据库。默认接口前缀为 `/api`,健康检查地址为 `http://localhost:3000/api/health`。
45
+
35
46
  ## 3. 核心功能
36
47
 
37
48
  ### 3.1 命令行接口
@@ -98,25 +109,20 @@ export default DefineNserveConfig({
98
109
  import { DefineGenRouter } from '@aicblock/nserve'
99
110
 
100
111
  export default DefineGenRouter({
101
- servicePath: '/api/user', // 路由前缀
112
+ servicePath: '/user', // 模板在 /api 下挂载路由
102
113
  serviceHandler: 'user', // 处理逻辑目录
103
114
  routers: [
104
115
  {
105
116
  path: '/list', // 路由路径
106
117
  method: 'GET', // HTTP 方法
107
- name: 'list', // 处理函数名
108
- middleware: [] // 路由级中间件
118
+ name: 'list' // 处理函数名
109
119
  },
110
120
  {
111
121
  path: '/create',
112
122
  method: 'POST',
113
- name: 'create',
114
- session: {
115
- /* session 配置 */
116
- }
123
+ name: 'create'
117
124
  }
118
- ],
119
- middleware: ['auth'] // 全局中间件
125
+ ]
120
126
  })
121
127
  ```
122
128
 
@@ -181,7 +187,7 @@ project/
181
187
  │ ├── router/ # 路由配置
182
188
  │ └── model/ # 模型 SQL 文件
183
189
  ├── nserve.config.ts # NServe 配置文件
184
- └── package.json # 项目配置
190
+ ├── package.json # 项目配置
185
191
  └── tsconfig.json # TypeScript 配置文件
186
192
  ```
187
193
 
@@ -191,16 +197,18 @@ project/
191
197
  2. 运行 `nserve gen` 命令
192
198
  3. NServe 会自动生成:
193
199
  - 路由处理器文件 `src/handler/*.handler.ts`
194
- - 业务逻辑模板文件 `src/logic/*/*.logic.ts`
200
+ - 业务逻辑模板文件 `src/logic/<serviceHandler>/*.logic.ts`(已有文件不覆盖)
195
201
  - 路由注册文件 `src/handler/router.ts`
196
202
 
203
+ handler、router、types 等生成文件会在再次执行 `gen` 时重写。
204
+
197
205
  ## 8. 模型生成流程
198
206
 
199
207
  1. 创建 SQL 文件 `nserve-config/model/*.sql`
200
208
  2. 运行 `nserve gen` 命令
201
209
  3. NServe 会自动生成:
202
210
  - 数据模型文件 `src/model/*.ts`
203
- - 模型索引文件 `src/model/index.ts`
211
+ - 模型索引文件 `src/model/index.ts`(默认导出模型数组)
204
212
 
205
213
  ## 9. 环境变量
206
214
 
@@ -210,7 +218,7 @@ NServe 支持 `.env` 文件和环境特定的配置文件(如 `.env.developmen
210
218
 
211
219
  ```
212
220
  # yamlConfig 配置
213
- YAML_CONFIG.APP_CONFIG.PORT=3000
221
+ YAML_CONFIG.RUN_PORT=3000
214
222
  YAML_CONFIG.MYSQL_CONF.host=localhost
215
223
  YAML_CONFIG.MYSQL_CONF.port=3306
216
224
  YAML_CONFIG.MYSQL_CONF.user=root
@@ -223,9 +231,11 @@ AICBLOCK_NSERVE_APP_ENTRY=app.ts
223
231
 
224
232
  ## 10. 中间件配置
225
233
 
226
- 在 `nserve.config.ts` 中配置全局中间件:
234
+ 在 `nserve.config.ts` 中注册中间件:
227
235
 
228
236
  ```typescript
237
+ import { DefineNserveConfig } from '@aicblock/nserve'
238
+
229
239
  export default DefineNserveConfig({
230
240
  generateConfig: {
231
241
  middleware: {
@@ -241,7 +251,11 @@ export default DefineNserveConfig({
241
251
  在路由配置中使用中间件:
242
252
 
243
253
  ```typescript
254
+ import { DefineGenRouter } from '@aicblock/nserve'
255
+
244
256
  export default DefineGenRouter({
257
+ servicePath: '/user',
258
+ serviceHandler: 'user',
245
259
  routers: [
246
260
  {
247
261
  path: '/protected',
@@ -253,6 +267,8 @@ export default DefineGenRouter({
253
267
  })
254
268
  ```
255
269
 
270
+ 需在 `src/middleware/auth.ts` 中导出 `authMiddleware`;路由只能引用已注册的中间件。
271
+
256
272
  ## 11. 高级功能
257
273
 
258
274
  ### 11.1 自定义插件
@@ -274,10 +290,10 @@ export default DefineNserveConfig({
274
290
 
275
291
  ### 11.2 类型定义
276
292
 
277
- NServe 提供了完整的 TypeScript 类型定义,可以在项目中直接使用:
293
+ NServe 的配置函数提供 TypeScript 类型推断,可以直接编写带类型检查的配置:
278
294
 
279
295
  ```typescript
280
- import type { Config, DefineGenRouterConfig } from '@aicblock/nserve'
296
+ import { DefineNserveConfig, DefineGenRouter } from '@aicblock/nserve'
281
297
  ```
282
298
 
283
299
  ## 12. 最佳实践
@@ -303,12 +319,14 @@ import type { Config, DefineGenRouterConfig } from '@aicblock/nserve'
303
319
 
304
320
  ### 13.1 端口被占用
305
321
 
306
- 如果开发服务器端口被占用,可以在 `.env` 文件中修改 PORT 配置:
322
+ 脚手架模板读取 `RUN_PORT`。如果端口被占用,可在 `nserve.config.ts` 的 `yamlConfig.RUN_PORT` 中更改,或在 `.env` 中设置:
307
323
 
308
324
  ```
309
- PORT=3001
325
+ YAML_CONFIG.RUN_PORT=3001
310
326
  ```
311
327
 
328
+ 也可在 `.env` 中设置 `RUN_PORT=3001`,它会优先于 `yamlConfig.RUN_PORT` 生效。
329
+
312
330
  ### 13.2 热重载不生效
313
331
 
314
332
  确保:
@@ -325,6 +343,6 @@ PORT=3001
325
343
  - 依赖是否安装正确
326
344
  - 配置文件是否正确
327
345
 
328
- ## 15. 贡献
346
+ ## 14. 贡献
329
347
 
330
348
  欢迎提交 Issue 和 Pull Request 来改进 NServe。
package/lib/commander.js CHANGED
@@ -1,2 +1,2 @@
1
1
  #!/usr/bin/env node
2
- "use strict";var d=Object.create;var l=Object.defineProperty;var g=Object.getOwnPropertyDescriptor;var m=Object.getOwnPropertyNames;var y=Object.getPrototypeOf,h=Object.prototype.hasOwnProperty;var b=(e,n,t,s)=>{if(n&&typeof n=="object"||typeof n=="function")for(let r of m(n))!h.call(e,r)&&r!==t&&l(e,r,{get:()=>n[r],enumerable:!(s=g(n,r))||s.enumerable});return e};var O=(e,n,t)=>(t=e!=null?d(y(e)):{},b(n||!e||!e.__esModule?l(t,"default",{value:e,enumerable:!0}):t,e));var R=require("esbuild");var x=O(require("js-yaml"));function i(e,n="INFO"){let t=(p,f="green")=>`\x1B[${{green:"32m",red:"31m",blue:"34m",orange:"30m"}[f]}${p}\x1B[0m`,r={INFO:"blue",WARNING:"orange",ERROR:"red",SUCCESS:"green"}[n],u=t(n,r);console.log(`[${u}] - ${e}`)}var a=require("./runtime"),o=require("commander"),c=process.argv;c[2]===void 0&&c.push("serve");o.program.version("1.0.4");o.program.on("command:*",function(){let e=o.program.args[0];if(["serve","build","gen"].includes(e)){(0,a.execRun)(e);return}i("See --help for a list of available commands."),i(`Invalid command: ${e}`,"ERROR"),process.exit(0)});o.program.on("--help",function(){console.log("Commands:"),console.log(" serve Start Run the dev server"),console.log(" build Build the project"),console.log(" gen Generate code based on the configuration file")});o.program.parse(c);
2
+ "use strict";var d=Object.create;var l=Object.defineProperty;var g=Object.getOwnPropertyDescriptor;var m=Object.getOwnPropertyNames;var y=Object.getPrototypeOf,h=Object.prototype.hasOwnProperty;var b=(e,n,t,s)=>{if(n&&typeof n=="object"||typeof n=="function")for(let r of m(n))!h.call(e,r)&&r!==t&&l(e,r,{get:()=>n[r],enumerable:!(s=g(n,r))||s.enumerable});return e};var O=(e,n,t)=>(t=e!=null?d(y(e)):{},b(n||!e||!e.__esModule?l(t,"default",{value:e,enumerable:!0}):t,e));var R=require("esbuild");var x=O(require("js-yaml"));function i(e,n="INFO"){let t=(p,f="green")=>`\x1B[${{green:"32m",red:"31m",blue:"34m",orange:"30m"}[f]}${p}\x1B[0m`,r={INFO:"blue",WARNING:"orange",ERROR:"red",SUCCESS:"green"}[n],u=t(n,r);console.log(`[${u}] - ${e}`)}var a=require("./runtime"),o=require("commander"),c=process.argv;c[2]===void 0&&c.push("serve");o.program.version("1.0.8");o.program.on("command:*",function(){let e=o.program.args[0];if(["serve","build","gen"].includes(e)){(0,a.execRun)(e);return}i("See --help for a list of available commands."),i(`Invalid command: ${e}`,"ERROR"),process.exitCode=1});o.program.on("--help",function(){console.log("Commands:"),console.log(" serve Start Run the dev server"),console.log(" build Build the project"),console.log(" gen Generate code based on the configuration file")});o.program.parse(c);
package/lib/core/run.js CHANGED
@@ -1,3 +1,3 @@
1
- "use strict";var Y=Object.create;var N=Object.defineProperty;var M=Object.getOwnPropertyDescriptor;var q=Object.getOwnPropertyNames;var z=Object.getPrototypeOf,Z=Object.prototype.hasOwnProperty;var H=(e,t)=>()=>(e&&(t=e(e=0)),t);var Q=(e,t)=>{for(var r in t)N(e,r,{get:t[r],enumerable:!0})},F=(e,t,r,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of q(t))!Z.call(e,n)&&n!==r&&N(e,n,{get:()=>t[n],enumerable:!(o=M(t,n))||o.enumerable});return e};var D=(e,t,r)=>(r=e!=null?Y(z(e)):{},F(t||!e||!e.__esModule?N(r,"default",{value:e,enumerable:!0}):r,e)),X=e=>F(N({},"__esModule",{value:!0}),e);var W={};Q(W,{GetVmRunScript:()=>L,Spin:()=>T,camelToPascal:()=>oe,clog:()=>y,getAppEnvList:()=>re,getArgvsParamsValue:()=>K,isInvalid:()=>k,jsonToYamlFile:()=>j,merge:()=>ee,parseEnv:()=>G,pascalToSnake:()=>se,rmDir:()=>$});function y(e,t="INFO"){let r=(s,a="green")=>`\x1B[${{green:"32m",red:"31m",blue:"34m",orange:"30m"}[a]}${s}\x1B[0m`,n={INFO:"blue",WARNING:"orange",ERROR:"red",SUCCESS:"green"}[t],i=r(t,n);console.log(`[${i}] - ${e}`)}function $(e){let t=(r,o)=>{try{let n=(0,p.readdirSync)(r);if(n.length===0){(0,p.rmdirSync)(r),o&&o();return}let i=n.length,s=0,a=m=>{m===i&&((0,p.rmdirSync)(r),o&&o())};n.forEach(m=>{let c=(0,E.join)(r,m);if((0,p.statSync)(c).isDirectory()){t(c,()=>{a(s+=1)});return}(0,p.unlinkSync)(c),a(s+=1)})}catch(n){o&&o(n)}};return new Promise((r,o)=>{if(!e||!(0,p.existsSync)(e)){r();return}if(!(0,p.statSync)(e).isDirectory()){o("The directory path to be deleted is not a directory path");return}t(e,n=>{n?o(n):r()})})}function ee(e,t){let r=(n,i)=>{if(Object.prototype.toString.call(n)!=="[object Object]"||Object.prototype.toString.call(i)!=="[object Object]")return console.warn("[STACK_LOG] AICBLOCK_UTIL: \u53C2\u6570\u9519\u8BEF"),{};let s={},a=Object.keys(n);return Object.keys(i).filter(c=>!a.includes(c)).forEach(c=>Object.assign(s,{[c]:i[c]})),Object.keys(n).forEach(c=>{let l=i[c],f=n[c];if(l!==void 0&&Object.prototype.toString.call(l)==="[object Object]"&&Object.prototype.toString.call(f)==="[object Object]"){Object.assign(s,{[c]:r(f,l)});return}Object.assign(s,{[c]:l!==void 0?l:f})}),s};return(Array.isArray(t)?t:[t]).reduce((n,i)=>r(n,i),e)}function K(e,t){let r=e.findIndex(n=>n===t);if(r<0||e.length-1===r)return;let o=e[r+1];if(o.indexOf("--")!==0)return o}function k(e){return e===void 0||e===""||e===null}function G(e){let t={};return e.split(/(\r\n)|[\r\n]/).filter(o=>!k(o)).forEach(o=>{let n=o.split("="),i=(n[0]||"").trim(),s=(n[1]||"").trim();i.split("")[0]!=="#"&&i!==""&&(t[i]=s)}),t}function te(e){let t=Number(e);if(!isNaN(t)&&e.trim()!=="")return t;let r=e.toLowerCase();if(r==="true")return!0;if(r==="false")return!1;if(r==="null")return null;if(r!=="undefined")return e}function ne(e,t="."){let r=e.trim().split(`
2
- `),o={};return r.filter(n=>n.indexOf("YAML_CONFIG"+t)===0).forEach(n=>{if(!n.trim())return;let[i,s]=n.split("=");if(!i||s===void 0)return;let a=i.trim(),m=s.trim(),c=a.split(t),l=o;for(let f=0;f<c.length;f++){let d=c[f];f===c.length-1?l[d]=te(m):((!l[d]||typeof l[d]!="object")&&(l[d]={}),l=l[d])}}),o}function re(e,t){let r={},o={},n={},i=(0,E.join)(e,".env"),s=process.env.AICBLOCK_NSERVE_RUN_ARGV||"[]",a=K(JSON.parse(s),"--mode"),m=a!==void 0&&a||(t==="build"?"production":"development"),c=(0,E.join)(e,`.env.${m}`),l={},f=[i,c],d=(0,E.join)(e,".env.local");(0,p.existsSync)(d)&&f.push(d);let u=(0,E.join)(e,`.env.${m}.local`);(0,p.existsSync)(u)&&f.push(u);let g=[],R=O=>{if(!(0,p.existsSync)(O))return;let x=(0,p.readFileSync)(O,"utf-8"),S=G(x);g.push(x),Object.assign(l,S)};f.forEach(R);let w=["YAML_CONFIG."];return Object.keys(l).forEach(O=>{if(w.some(C=>O.indexOf(C)===0))return;let x=l[O];if(O.indexOf("AICBLOCK_NSERVE_APP_")===0){r[O]=x;return}let S=t==="serve"?O.replace(/^(APPTEST_)/,""):O;o[S]=x}),g.join("").indexOf("YAML_CONFIG.")>=0&&Object.assign(n,ne(g.join(`
3
- `))),{system:r,app:o,yamlConfig:n}}function L(e,t){try{let r=(0,p.readFileSync)(e,"utf-8"),o=(0,J.transformSync)(r,{format:"cjs",loader:"ts",platform:"node",target:"node18"}),n={module:{paths:[(0,E.join)(t,"node_modules")],exports:{default:void 0}},require,__dirname:t,global,__filename,process},i=new _.default.Script(o.code);return _.default.createContext(n),i.runInContext(n),n.module.exports.default||n.module.exports}catch(r){console.error(r),process.exit(0)}}async function j(e,t,r={}){let{createDir:o=!0,indent:n=2,noRefs:i=!0,lineWidth:s=80,skipInvalid:a=!1,quotingType:m='"',forceQuotes:c=!1,encoding:l="utf8",...f}=r;try{let d;if(typeof e=="string")try{d=JSON.parse(e)}catch(R){throw new Error(`\u65E0\u6548\u7684 JSON \u5B57\u7B26\u4E32: ${R instanceof Error?R.message:String(R)}`)}else if(typeof e=="object"&&e!==null)d=e;else throw new Error("jsonData \u5FC5\u987B\u662F\u6709\u6548\u7684 JSON \u5B57\u7B26\u4E32\u3001\u5BF9\u8C61\u6216\u6570\u7EC4");let u=V.default.dump(d,{indent:n,noRefs:i,skipInvalid:a,lineWidth:s,quotingType:m,forceQuotes:c,...f,styles:{"!!null":"canonical",...f.styles}});if(o){let R=(0,E.dirname)(t);try{(0,p.accessSync)(R)}catch{(0,p.mkdirSync)(R,{recursive:!0}),console.log(`\u5DF2\u521B\u5EFA\u76EE\u5F55: ${R}`)}}(0,p.writeFileSync)(t,u,{encoding:l});let g=Buffer.byteLength(u,l);return console.log(`YAML \u6587\u4EF6\u5DF2\u6210\u529F\u751F\u6210: ${t}`),console.log(`\u6587\u4EF6\u5927\u5C0F: ${g} \u5B57\u8282`),{content:u,filePath:t,fileSize:g}}catch(d){throw console.error("\u8F6C\u6362\u6216\u4FDD\u5B58\u5931\u8D25:",d instanceof Error?d.message:String(d)),d}}function oe(e){return!e||typeof e!="string"?e:e.split(/[\-_]/g).map(r=>r.charAt(0).toUpperCase()+r.slice(1)).join("")}function se(e,t="_"){return!e||typeof e!="string"?e:e.replace(/([A-Z])([A-Z])(?=[a-z])/g,`$1${t}$2`).replace(/([a-z])([A-Z])/g,`$1${t}$2`).toLowerCase()}var J,p,E,_,V,T,A=H(()=>{"use strict";J=require("esbuild"),p=require("fs"),E=require("path"),_=D(require("vm")),V=D(require("js-yaml"));T=class e{constructor(t=""){this.pos=0;this.spinner="|/-";if(!(this instanceof e))return new e(t);this.pos=0,this.placeholder=t||""}start(){return this.loop=setInterval(()=>{var t=`\r${this.spinner[this.pos||0]} ${this.placeholder}`;process.stdout.write(t),this.pos=++this.pos%this.spinner.length},100),this}clearLine(){!process||!process.stdout||typeof process.stdout.clearLine!="function"||process.stdout.clearLine(0)}stop(){return this.clearLine(),process.stdout.write("\r"),this.loop&&clearInterval(this.loop),this}update(t){return this.clearLine(),this.placeholder=t+" ",this}}});var v=require("esbuild");A();var h=require("path");var b=require("fs"),P=require("child_process");function ie(e,t){let r=Date.now(),o=()=>`${Date.now()-r}ms`;try{(0,v.build)(e).then(({errors:n})=>{if(n.length===0){t&&t(),y(`Compile successfully.[${o()}]`,"SUCCESS");return}y(JSON.stringify(n),"ERROR")})}catch(n){y(JSON.stringify(n),"ERROR")}}async function ce(e){return await(0,v.context)(e)}var le=e=>{let t=e.compilerOptions?.paths||{},r=Object.keys(t);return{name:"alias",setup(o){o.onLoad({filter:/\.ts$/},async n=>{let i=await b.promises.readFile(n.path,"utf8"),s="ts";if(r.length===0)return{contents:i,loader:s};let a=i;return r.forEach(c=>{let l=c.replace(/\*$/,""),f=new RegExp(`from[\\s]{1,}[\\'\\"]${l}((?!\\n[\\'\\"]).)*[\\'\\"]`,"g"),d=(t[c]&&t[c][0]).replace(/\*$/,"");a.replace(f,u=>`from '${u.replace("from","").replace(/['"]/g,"")}'`)}),{contents:a,loader:s}})}}};var ae=(e,t,r,o,n,i)=>{let s=null,a=!1,m=!1,c=()=>{let u=process.platform==="win32"?"node.cmd":"node";return s=(0,P.spawn)(u,[e],{stdio:"inherit",cwd:r}),s.on("exit",g=>{g!==0&&!a&&y(`Process exited with code ${g}`,"WARNING")}),s.pid},l=async()=>{if(a){m=!0;return}a=!0,y("Rebuilding...","INFO");try{let u=await o.rebuild();if(u.errors.length===0){if(n&&i){let{jsonToYamlFile:g}=(A(),X(W));await g(n,(0,h.join)(i,"config.yaml"))}y("Rebuild complete","SUCCESS"),s&&(s.kill("SIGTERM"),await new Promise(g=>{s.on("exit",()=>g()),setTimeout(()=>{s.kill("SIGKILL"),g()},3e3)})),c()}else y(`Rebuild failed: ${JSON.stringify(u.errors)}`,"ERROR")}catch(u){y(`Rebuild error: ${u}`,"ERROR")}a=!1,m&&(m=!1,l())},f,d=()=>{f&&clearTimeout(f),f=setTimeout(l,300)};c(),(0,b.watch)(t,{recursive:!0},(u,g)=>{g&&(g.endsWith(".ts")||g.endsWith(".js"))&&d()})},ue=()=>{try{let e=process.env.AICBLOCK_NSERVE_RUN_CWD,t=process.env.AICBLOCK_NSERVE_RUN_CONFIG_PATH,r=process.env.AICBLOCK_NSERVE_RUN_MODE,o=L(t,process.env.AICBLOCK_NSERVE_RUN_CWD),{entry:n,testing:i,outputDir:s,sourceDir:a,plugins:m,external:c,yamlConfig:l}=o;if(!a||!(0,b.existsSync)((0,h.join)(e,a)))throw Error("[ERROR] The compilation directory is not configured or does not exist");let f=(0,h.join)(e,a,n);if((!n||typeof n!="string"||!(0,b.existsSync)(f))&&r==="serve")throw Error(`[ERROR] The run file does not exist. Please check the config:[${f}]`);let d=!i,u=(0,h.join)(e,s||"dist");r==="build"&&(0,b.existsSync)(u)&&$(u);let g=(0,h.join)(e,"tsconfig.json"),R=(0,b.readFileSync)(g,"utf-8"),w=JSON.parse(R),I={entryPoints:[f],minify:d,outdir:u,plugins:[le(w),...m||[]],bundle:!0,platform:"node",format:"cjs",external:c};if(r==="build"){ie(I,()=>{l&&j(l,(0,h.join)(u,"config.yaml"))});return}if(!n)return;let O=Date.now();y("Creating build context...","INFO"),ce(I).then(x=>{x.rebuild().then(S=>{if(S.errors.length===0){l&&j(l,(0,h.join)(u,"config.yaml")),y(`Initial build complete. [${Date.now()-O}ms]`,"SUCCESS");let C=(0,h.basename)(n),U=C.substring(0,C.length-3)+".js",B=(0,h.join)(u,U);ae(B,(0,h.join)(e,a||"src"),u,x,l,u)}else y(`Initial build failed: ${JSON.stringify(S.errors)}`,"ERROR")})})}catch(e){console.error("[ERROR_STACK]",e);let t=e?.message||"[FN::esbuild::exec]";y(t,"ERROR"),process.exit(0)}};ue();
1
+ "use strict";var X=Object.create;var _=Object.defineProperty;var ee=Object.getOwnPropertyDescriptor;var te=Object.getOwnPropertyNames;var ne=Object.getPrototypeOf,re=Object.prototype.hasOwnProperty;var oe=(e,t)=>()=>(e&&(t=e(e=0)),t);var se=(e,t)=>{for(var n in t)_(e,n,{get:t[n],enumerable:!0})},V=(e,t,n,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of te(t))!re.call(e,r)&&r!==n&&_(e,r,{get:()=>t[r],enumerable:!(o=ee(t,r))||o.enumerable});return e};var J=(e,t,n)=>(n=e!=null?X(ne(e)):{},V(t||!e||!e.__esModule?_(n,"default",{value:e,enumerable:!0}):n,e)),ie=e=>V(_({},"__esModule",{value:!0}),e);var M={};se(M,{GetVmRunScript:()=>F,Spin:()=>$,camelToPascal:()=>fe,clog:()=>O,getAppEnvList:()=>ue,getArgvsParamsValue:()=>U,isInvalid:()=>B,jsonToYamlFile:()=>P,merge:()=>ce,parseEnv:()=>Y,pascalToSnake:()=>pe,rmDir:()=>A});function O(e,t="INFO"){let n=(s,a="green")=>`\x1B[${{green:"32m",red:"31m",blue:"34m",orange:"30m"}[a]}${s}\x1B[0m`,r={INFO:"blue",WARNING:"orange",ERROR:"red",SUCCESS:"green"}[t],i=n(t,r);console.log(`[${i}] - ${e}`)}function A(e){let t=(n,o)=>{try{let r=(0,d.readdirSync)(n);if(r.length===0){(0,d.rmdirSync)(n),o&&o();return}let i=r.length,s=0,a=u=>{u===i&&((0,d.rmdirSync)(n),o&&o())};r.forEach(u=>{let c=(0,R.join)(n,u);if((0,d.lstatSync)(c).isDirectory()){t(c,()=>{a(s+=1)});return}(0,d.unlinkSync)(c),a(s+=1)})}catch(r){o&&o(r)}};return new Promise((n,o)=>{if(!e||!(0,d.existsSync)(e)){n();return}if(!(0,d.lstatSync)(e).isDirectory()){o("The directory path to be deleted is not a directory path");return}t(e,r=>{r?o(r):n()})})}function ce(e,t){let n=(r,i)=>{if(Object.prototype.toString.call(r)!=="[object Object]"||Object.prototype.toString.call(i)!=="[object Object]")return console.warn("[STACK_LOG] AICBLOCK_UTIL: \u53C2\u6570\u9519\u8BEF"),{};let s={},a=Object.keys(r);return Object.keys(i).filter(c=>!a.includes(c)).forEach(c=>Object.assign(s,{[c]:i[c]})),Object.keys(r).forEach(c=>{let l=i[c],p=r[c];if(l!==void 0&&Object.prototype.toString.call(l)==="[object Object]"&&Object.prototype.toString.call(p)==="[object Object]"){Object.assign(s,{[c]:n(p,l)});return}Object.assign(s,{[c]:l!==void 0?l:p})}),s};return(Array.isArray(t)?t:[t]).reduce((r,i)=>n(r,i),e)}function U(e,t){let n=e.findIndex(r=>r===t);if(n<0||e.length-1===n)return;let o=e[n+1];if(o.indexOf("--")!==0)return o}function B(e){return e===void 0||e===""||e===null}function Y(e){let t={};return e.split(/(\r\n)|[\r\n]/).filter(o=>!B(o)).forEach(o=>{let r=o.split("="),i=(r[0]||"").trim(),s=(r[1]||"").trim();i.split("")[0]!=="#"&&i!==""&&(t[i]=s)}),t}function le(e){let t=Number(e);if(!isNaN(t)&&e.trim()!=="")return t;let n=e.toLowerCase();if(n==="true")return!0;if(n==="false")return!1;if(n==="null")return null;if(n!=="undefined")return e}function ae(e,t="."){let n=e.trim().split(`
2
+ `),o={};return n.filter(r=>r.indexOf("YAML_CONFIG"+t)===0).forEach(r=>{if(!r.trim())return;let[i,s]=r.split("=");if(!i||s===void 0)return;let a=i.trim(),u=s.trim(),c=a.split(t),l=o;for(let p=0;p<c.length;p++){let g=c[p];p===c.length-1?l[g]=le(u):((!l[g]||typeof l[g]!="object")&&(l[g]={}),l=l[g])}}),o}function ue(e,t){let n={},o={},r={},i=(0,R.join)(e,".env"),s=process.env.AICBLOCK_NSERVE_RUN_ARGV||"[]",a=U(JSON.parse(s),"--mode"),u=a!==void 0&&a||(t==="build"?"production":"development"),c=(0,R.join)(e,`.env.${u}`),l={},p=[i,c],g=(0,R.join)(e,".env.local");(0,d.existsSync)(g)&&p.push(g);let f=(0,R.join)(e,`.env.${u}.local`);(0,d.existsSync)(f)&&p.push(f);let m=[],h=b=>{if(!(0,d.existsSync)(b))return;let E=(0,d.readFileSync)(b,"utf-8"),w=Y(E);m.push(E),Object.assign(l,w)};p.forEach(h);let I=["YAML_CONFIG."];return Object.keys(l).forEach(b=>{if(I.some(N=>b.indexOf(N)===0))return;let E=l[b];if(b.indexOf("AICBLOCK_NSERVE_APP_")===0){n[b]=E;return}let w=t==="serve"?b.replace(/^(APPTEST_)/,""):b;o[w]=E}),m.join("").indexOf("YAML_CONFIG.")>=0&&Object.assign(r,ae(m.join(`
3
+ `))),{system:n,app:o,yamlConfig:r}}function F(e,t){try{let n=(0,R.resolve)(e),o=(0,K.buildSync)({entryPoints:[n],bundle:!0,packages:"external",write:!1,format:"cjs",platform:"node",target:"node18"}),r={module:{exports:{default:void 0}},require:(0,W.createRequire)(n),__dirname:(0,R.dirname)(n),global,__filename:n,process},i=new L.default.Script(o.outputFiles[0].text,{filename:n});return L.default.createContext(r),i.runInContext(r),r.module.exports.default||r.module.exports}catch(n){throw n}}async function P(e,t,n={}){let{createDir:o=!0,indent:r=2,noRefs:i=!0,lineWidth:s=80,skipInvalid:a=!1,quotingType:u='"',forceQuotes:c=!1,encoding:l="utf8",...p}=n;try{let g;if(typeof e=="string")try{g=JSON.parse(e)}catch(h){throw new Error(`\u65E0\u6548\u7684 JSON \u5B57\u7B26\u4E32: ${h instanceof Error?h.message:String(h)}`)}else if(typeof e=="object"&&e!==null)g=e;else throw new Error("jsonData \u5FC5\u987B\u662F\u6709\u6548\u7684 JSON \u5B57\u7B26\u4E32\u3001\u5BF9\u8C61\u6216\u6570\u7EC4");let f=G.default.dump(g,{indent:r,noRefs:i,skipInvalid:a,lineWidth:s,quotingType:u,forceQuotes:c,...p,styles:{"!!null":"canonical",...p.styles}});if(o){let h=(0,R.dirname)(t);try{(0,d.accessSync)(h)}catch{(0,d.mkdirSync)(h,{recursive:!0}),console.log(`\u5DF2\u521B\u5EFA\u76EE\u5F55: ${h}`)}}(0,d.writeFileSync)(t,f,{encoding:l});let m=Buffer.byteLength(f,l);return console.log(`YAML \u6587\u4EF6\u5DF2\u6210\u529F\u751F\u6210: ${t}`),console.log(`\u6587\u4EF6\u5927\u5C0F: ${m} \u5B57\u8282`),{content:f,filePath:t,fileSize:m}}catch(g){throw console.error("\u8F6C\u6362\u6216\u4FDD\u5B58\u5931\u8D25:",g instanceof Error?g.message:String(g)),g}}function fe(e){return!e||typeof e!="string"?e:e.split(/[\-_]/g).map(n=>n.charAt(0).toUpperCase()+n.slice(1)).join("")}function pe(e,t="_"){return!e||typeof e!="string"?e:e.replace(/([A-Z])([A-Z])(?=[a-z])/g,`$1${t}$2`).replace(/([a-z])([A-Z])/g,`$1${t}$2`).toLowerCase()}var K,d,R,W,L,G,$,D=oe(()=>{"use strict";K=require("esbuild"),d=require("fs"),R=require("path"),W=require("module"),L=J(require("vm")),G=J(require("js-yaml"));$=class e{constructor(t=""){this.pos=0;this.spinner="|/-";if(!(this instanceof e))return new e(t);this.pos=0,this.placeholder=t||""}start(){return this.loop=setInterval(()=>{var t=`\r${this.spinner[this.pos||0]} ${this.placeholder}`;process.stdout.write(t),this.pos=++this.pos%this.spinner.length},100),this}clearLine(){!process||!process.stdout||typeof process.stdout.clearLine!="function"||process.stdout.clearLine(0)}stop(){return this.clearLine(),process.stdout.write("\r"),this.loop&&clearInterval(this.loop),this}update(t){return this.clearLine(),this.placeholder=t+" ",this}}});var j=require("esbuild");D();var x=require("path");var S=require("fs"),k=require("child_process");function q(e,t=3e3){return e.exitCode!==null||e.signalCode!==null?Promise.resolve():new Promise(n=>{let o,r=()=>{clearTimeout(o),e.removeListener("exit",r),n()};e.once("exit",r),o=setTimeout(()=>{e.kill("SIGKILL"),r()},t),e.kill("SIGTERM")||r()})}var C=require("fs"),y=require("path");function v(e,t){let n=(0,y.relative)(e,t);return n!==""&&n!==".."&&!n.startsWith(`..${y.sep}`)&&!(0,y.isAbsolute)(n)}function z(e){return(0,C.existsSync)(e)?(0,C.realpathSync)(e):(0,y.join)(z((0,y.dirname)(e)),e.slice((0,y.dirname)(e).length+1))}function Z(e,t,n){let o=(0,C.realpathSync)(e),r=(0,y.resolve)(o,t),i=(0,y.resolve)(o,n),s=z(r),a=[i,(0,y.join)(o,".git"),(0,y.join)(o,"node_modules"),(0,y.join)(o,"nserve-config")];if(!v(o,r)||!v(o,s)||a.some(u=>r===u||v(r,u)||v(u,r)||s===u||v(s,u)||v(u,s))||(0,C.existsSync)(r)&&(0,C.lstatSync)(r).isSymbolicLink())throw new Error(`Unsafe output directory: ${r}`);return r}async function de(e,t){let n=Date.now();await(0,j.build)(e),t&&await t(),O(`Compile successfully.[${Date.now()-n}ms]`,"SUCCESS")}async function ge(e){return await(0,j.context)(e)}var me=e=>{let t=e.compilerOptions?.paths||{},n=Object.keys(t);return{name:"alias",setup(o){o.onLoad({filter:/\.ts$/},async r=>{let i=await S.promises.readFile(r.path,"utf8"),s="ts";if(n.length===0)return{contents:i,loader:s};let a=i;return n.forEach(c=>{let l=c.replace(/\*$/,""),p=new RegExp(`from[\\s]{1,}[\\'\\"]${l}((?!\\n[\\'\\"]).)*[\\'\\"]`,"g"),g=(t[c]&&t[c][0]).replace(/\*$/,"");a.replace(p,f=>`from '${f.replace("from","").replace(/['"]/g,"")}'`)}),{contents:a,loader:s}})}}};var ye=(e,t,n,o,r,i)=>{let s=null,a=!1,u=!1,c=()=>{let f=process.platform==="win32"?"node.cmd":"node";return s=(0,k.spawn)(f,[e],{stdio:"inherit",cwd:n}),s.on("exit",m=>{m!==0&&!a&&O(`Process exited with code ${m}`,"WARNING")}),s.pid},l=async()=>{if(a){u=!0;return}a=!0,O("Rebuilding...","INFO");try{let f=await o.rebuild();if(f.errors.length===0){if(r&&i){let{jsonToYamlFile:m}=(D(),ie(M));await m(r,(0,x.join)(i,"config.yaml"))}O("Rebuild complete","SUCCESS"),s&&await q(s),c()}else O(`Rebuild failed: ${JSON.stringify(f.errors)}`,"ERROR")}catch(f){O(`Rebuild error: ${f}`,"ERROR")}a=!1,u&&(u=!1,l())},p,g=()=>{p&&clearTimeout(p),p=setTimeout(l,300)};c(),(0,S.watch)(t,{recursive:!0},(f,m)=>{m&&(m.endsWith(".ts")||m.endsWith(".js"))&&g()})},he=async()=>{try{let e=process.env.AICBLOCK_NSERVE_RUN_CWD,t=process.env.AICBLOCK_NSERVE_RUN_CONFIG_PATH,n=process.env.AICBLOCK_NSERVE_RUN_MODE,o=F(t,process.env.AICBLOCK_NSERVE_RUN_CWD),{entry:r,testing:i,outputDir:s,sourceDir:a,plugins:u,external:c,yamlConfig:l}=o;if(!a||!(0,S.existsSync)((0,x.join)(e,a)))throw Error("[ERROR] The compilation directory is not configured or does not exist");let p=(0,x.join)(e,a,r);if((!r||typeof r!="string"||!(0,S.existsSync)(p))&&n==="serve")throw Error(`[ERROR] The run file does not exist. Please check the config:[${p}]`);let g=!i,f=Z(e,s||"dist",a);n==="build"&&(0,S.existsSync)(f)&&await A(f);let m=(0,x.join)(e,"tsconfig.json"),h=(0,S.readFileSync)(m,"utf-8"),I=JSON.parse(h),T={entryPoints:[p],minify:g,outdir:f,plugins:[me(I),...u||[]],bundle:!0,platform:"node",format:"cjs",external:c};if(n==="build"){await de(T,async()=>{l&&await P(l,(0,x.join)(f,"config.yaml"))});return}if(!r)return;let b=Date.now();O("Creating build context...","INFO");let E=await ge(T),w=await E.rebuild();if(w.errors.length===0){l&&await P(l,(0,x.join)(f,"config.yaml")),O(`Initial build complete. [${Date.now()-b}ms]`,"SUCCESS");let N=(0,x.basename)(r),H=N.substring(0,N.length-3)+".js",Q=(0,x.join)(f,H);ye(Q,(0,x.join)(e,a||"src"),f,E,l,f)}else throw new Error(`Initial build failed: ${JSON.stringify(w.errors)}`)}catch(e){console.error("[ERROR_STACK]",e);let t=e?.message||"[FN::esbuild::exec]";O(t,"ERROR"),process.exitCode=1}};he();
package/lib/index.d.ts CHANGED
@@ -3,7 +3,7 @@ export declare const nbuild: {
3
3
  transformSync: typeof transformSync;
4
4
  build: typeof build;
5
5
  };
6
- export declare function DefineNserveConfig(options?: Config): Config | undefined;
6
+ export declare function DefineNserveConfig(options?: Config): Config;
7
7
  export declare const DefineGenRouter: (param: DefineGenRouterConfig) => GenRouterConfig;
8
8
  declare const _default: {
9
9
  DefineNserveConfig: typeof DefineNserveConfig;
@@ -161,6 +161,8 @@ interface DataTypeProperty {
161
161
  properties?: Record<string, DataTypeProperty>
162
162
  // 是否必填
163
163
  required?: boolean
164
+ // 数据来源类型 (body/query/params),默认根据路由method判断
165
+ source?: DataSourceType
164
166
  }
165
167
 
166
168
  // 泛型参数定义
@@ -183,8 +185,6 @@ interface DataTypeOption {
183
185
  extends?: string | string[]
184
186
  // 数据类型泛型定义
185
187
  genericity?: string | GenericityParam
186
- // 数据来源类型 (body/query/params)
187
- source?: DataSourceType
188
188
  }
189
189
 
190
190
  // 路由选项定义
package/lib/index.js CHANGED
@@ -1,3 +1,3 @@
1
- "use strict";var T=Object.create;var h=Object.defineProperty;var P=Object.getOwnPropertyDescriptor;var $=Object.getOwnPropertyNames;var w=Object.getPrototypeOf,D=Object.prototype.hasOwnProperty;var G=(e,t)=>{for(var r in t)h(e,r,{get:t[r],enumerable:!0})},E=(e,t,r,s)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of $(t))!D.call(e,n)&&n!==r&&h(e,n,{get:()=>t[n],enumerable:!(s=P(t,n))||s.enumerable});return e};var F=(e,t,r)=>(r=e!=null?T(w(e)):{},E(t||!e||!e.__esModule?h(r,"default",{value:e,enumerable:!0}):r,e)),V=e=>E(h({},"__esModule",{value:!0}),e);var Z={};G(Z,{DefineGenRouter:()=>A,DefineNserveConfig:()=>j,default:()=>q,nbuild:()=>z});module.exports=V(Z);var C=require("esbuild");var B=require("esbuild"),f=require("fs"),m=require("path");var K=F(require("js-yaml"));function S(e,t="INFO"){let r=(c,p="green")=>`\x1B[${{green:"32m",red:"31m",blue:"34m",orange:"30m"}[p]}${c}\x1B[0m`,n={INFO:"blue",WARNING:"orange",ERROR:"red",SUCCESS:"green"}[t],o=r(t,n);console.log(`[${o}] - ${e}`)}function O(e,t){let r=(n,o)=>{if(Object.prototype.toString.call(n)!=="[object Object]"||Object.prototype.toString.call(o)!=="[object Object]")return console.warn("[STACK_LOG] AICBLOCK_UTIL: \u53C2\u6570\u9519\u8BEF"),{};let c={},p=Object.keys(n);return Object.keys(o).filter(l=>!p.includes(l)).forEach(l=>Object.assign(c,{[l]:o[l]})),Object.keys(n).forEach(l=>{let i=o[l],u=n[l];if(i!==void 0&&Object.prototype.toString.call(i)==="[object Object]"&&Object.prototype.toString.call(u)==="[object Object]"){Object.assign(c,{[l]:r(u,i)});return}Object.assign(c,{[l]:i!==void 0?i:u})}),c};return(Array.isArray(t)?t:[t]).reduce((n,o)=>r(n,o),e)}function Y(e,t){let r=e.findIndex(n=>n===t);if(r<0||e.length-1===r)return;let s=e[r+1];if(s.indexOf("--")!==0)return s}function k(e){return e===void 0||e===""||e===null}function J(e){let t={};return e.split(/(\r\n)|[\r\n]/).filter(s=>!k(s)).forEach(s=>{let n=s.split("="),o=(n[0]||"").trim(),c=(n[1]||"").trim();o.split("")[0]!=="#"&&o!==""&&(t[o]=c)}),t}function M(e){let t=Number(e);if(!isNaN(t)&&e.trim()!=="")return t;let r=e.toLowerCase();if(r==="true")return!0;if(r==="false")return!1;if(r==="null")return null;if(r!=="undefined")return e}function U(e,t="."){let r=e.trim().split(`
2
- `),s={};return r.filter(n=>n.indexOf("YAML_CONFIG"+t)===0).forEach(n=>{if(!n.trim())return;let[o,c]=n.split("=");if(!o||c===void 0)return;let p=o.trim(),a=c.trim(),l=p.split(t),i=s;for(let u=0;u<l.length;u++){let d=l[u];u===l.length-1?i[d]=M(a):((!i[d]||typeof i[d]!="object")&&(i[d]={}),i=i[d])}}),s}function v(e,t){let r={},s={},n={},o=(0,m.join)(e,".env"),c=process.env.AICBLOCK_NSERVE_RUN_ARGV||"[]",p=Y(JSON.parse(c),"--mode"),a=p!==void 0&&p||(t==="build"?"production":"development"),l=(0,m.join)(e,`.env.${a}`),i={},u=[o,l],d=(0,m.join)(e,".env.local");(0,f.existsSync)(d)&&u.push(d);let b=(0,m.join)(e,`.env.${a}.local`);(0,f.existsSync)(b)&&u.push(b);let R=[],L=g=>{if(!(0,f.existsSync)(g))return;let y=(0,f.readFileSync)(g,"utf-8"),x=J(y);R.push(y),Object.assign(i,x)};u.forEach(L);let _=["YAML_CONFIG."];return Object.keys(i).forEach(g=>{if(_.some(I=>g.indexOf(I)===0))return;let y=i[g];if(g.indexOf("AICBLOCK_NSERVE_APP_")===0){r[g]=y;return}let x=t==="serve"?g.replace(/^(APPTEST_)/,""):g;s[x]=y}),R.join("").indexOf("YAML_CONFIG.")>=0&&Object.assign(n,U(R.join(`
3
- `))),{system:r,app:s,yamlConfig:n}}var W=e=>{let{servicePath:t,serviceHandler:r,routers:s,middleware:n}=e,o=s.map(c=>{let{name:p}=c;return Object.assign(c,{handler:p})});return{prefix:t,service:o,handler:r,middleware:n}},N=W;var z={transformSync:C.transformSync,build:C.build};function j(e){try{let t=process.env.AICBLOCK_NSERVE_RUN_CWD,r=process.env.AICBLOCK_NSERVE_RUN_MODE,s={},n=v(t,r),{app:o,system:c}=n;n.system.AICBLOCK_NSERVE_APP_ENTRY&&Object.assign(s,{entry:n.system.AICBLOCK_NSERVE_APP_ENTRY}),Object.keys(n.yamlConfig||{}).length>0&&Object.assign(s,{yamlConfig:n.yamlConfig.YAML_CONFIG});let p=l=>{let i=o&&o[l];i&&(process.env[l]=i)};Object.keys(o||{}).forEach(p);let a=O({outputDir:"dist",entry:"app.ts",sourceDir:"src"},{...e,envs:{system:c}});return Object.keys(n.yamlConfig||{}).length>0&&(a=O(a||{},{yamlConfig:n.yamlConfig.YAML_CONFIG})),a.lifecycleBefore&&typeof a.lifecycleBefore=="function"&&(a=O(a||{},a.lifecycleBefore(a)||{})),a}catch(t){S("defineNserveConfig fial::","ERROR"),console.error(t)}}var A=N,q={DefineNserveConfig:j,DefineGenRouter:A};0&&(module.exports={DefineGenRouter,DefineNserveConfig,nbuild});
1
+ "use strict";var P=Object.create;var h=Object.defineProperty;var T=Object.getOwnPropertyDescriptor;var w=Object.getOwnPropertyNames;var $=Object.getPrototypeOf,D=Object.prototype.hasOwnProperty;var F=(e,t)=>{for(var r in t)h(e,r,{get:t[r],enumerable:!0})},E=(e,t,r,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of w(t))!D.call(e,n)&&n!==r&&h(e,n,{get:()=>t[n],enumerable:!(o=T(t,n))||o.enumerable});return e};var G=(e,t,r)=>(r=e!=null?P($(e)):{},E(t||!e||!e.__esModule?h(r,"default",{value:e,enumerable:!0}):r,e)),V=e=>E(h({},"__esModule",{value:!0}),e);var Z={};F(Z,{DefineGenRouter:()=>A,DefineNserveConfig:()=>N,default:()=>z,nbuild:()=>q});module.exports=V(Z);var b=require("esbuild");var B=require("esbuild"),f=require("fs"),m=require("path");var K=G(require("js-yaml"));function v(e,t="INFO"){let r=(c,u="green")=>`\x1B[${{green:"32m",red:"31m",blue:"34m",orange:"30m"}[u]}${c}\x1B[0m`,n={INFO:"blue",WARNING:"orange",ERROR:"red",SUCCESS:"green"}[t],s=r(t,n);console.log(`[${s}] - ${e}`)}function O(e,t){let r=(n,s)=>{if(Object.prototype.toString.call(n)!=="[object Object]"||Object.prototype.toString.call(s)!=="[object Object]")return console.warn("[STACK_LOG] AICBLOCK_UTIL: \u53C2\u6570\u9519\u8BEF"),{};let c={},u=Object.keys(n);return Object.keys(s).filter(l=>!u.includes(l)).forEach(l=>Object.assign(c,{[l]:s[l]})),Object.keys(n).forEach(l=>{let i=s[l],p=n[l];if(i!==void 0&&Object.prototype.toString.call(i)==="[object Object]"&&Object.prototype.toString.call(p)==="[object Object]"){Object.assign(c,{[l]:r(p,i)});return}Object.assign(c,{[l]:i!==void 0?i:p})}),c};return(Array.isArray(t)?t:[t]).reduce((n,s)=>r(n,s),e)}function Y(e,t){let r=e.findIndex(n=>n===t);if(r<0||e.length-1===r)return;let o=e[r+1];if(o.indexOf("--")!==0)return o}function k(e){return e===void 0||e===""||e===null}function J(e){let t={};return e.split(/(\r\n)|[\r\n]/).filter(o=>!k(o)).forEach(o=>{let n=o.split("="),s=(n[0]||"").trim(),c=(n[1]||"").trim();s.split("")[0]!=="#"&&s!==""&&(t[s]=c)}),t}function M(e){let t=Number(e);if(!isNaN(t)&&e.trim()!=="")return t;let r=e.toLowerCase();if(r==="true")return!0;if(r==="false")return!1;if(r==="null")return null;if(r!=="undefined")return e}function U(e,t="."){let r=e.trim().split(`
2
+ `),o={};return r.filter(n=>n.indexOf("YAML_CONFIG"+t)===0).forEach(n=>{if(!n.trim())return;let[s,c]=n.split("=");if(!s||c===void 0)return;let u=s.trim(),a=c.trim(),l=u.split(t),i=o;for(let p=0;p<l.length;p++){let d=l[p];p===l.length-1?i[d]=M(a):((!i[d]||typeof i[d]!="object")&&(i[d]={}),i=i[d])}}),o}function S(e,t){let r={},o={},n={},s=(0,m.join)(e,".env"),c=process.env.AICBLOCK_NSERVE_RUN_ARGV||"[]",u=Y(JSON.parse(c),"--mode"),a=u!==void 0&&u||(t==="build"?"production":"development"),l=(0,m.join)(e,`.env.${a}`),i={},p=[s,l],d=(0,m.join)(e,".env.local");(0,f.existsSync)(d)&&p.push(d);let R=(0,m.join)(e,`.env.${a}.local`);(0,f.existsSync)(R)&&p.push(R);let C=[],L=g=>{if(!(0,f.existsSync)(g))return;let y=(0,f.readFileSync)(g,"utf-8"),x=J(y);C.push(y),Object.assign(i,x)};p.forEach(L);let j=["YAML_CONFIG."];return Object.keys(i).forEach(g=>{if(j.some(I=>g.indexOf(I)===0))return;let y=i[g];if(g.indexOf("AICBLOCK_NSERVE_APP_")===0){r[g]=y;return}let x=t==="serve"?g.replace(/^(APPTEST_)/,""):g;o[x]=y}),C.join("").indexOf("YAML_CONFIG.")>=0&&Object.assign(n,U(C.join(`
3
+ `))),{system:r,app:o,yamlConfig:n}}var W=e=>{let{servicePath:t,serviceHandler:r,routers:o,middleware:n}=e,s=o.map(c=>{let{name:u}=c;return Object.assign(c,{handler:u})});return{prefix:t,service:s,handler:r,middleware:n}},_=W;var q={transformSync:b.transformSync,build:b.build};function N(e){try{let t=process.env.AICBLOCK_NSERVE_RUN_CWD,r=process.env.AICBLOCK_NSERVE_RUN_MODE,o=S(t,r),{app:n,system:s}=o,c=s.AICBLOCK_NSERVE_APP_ENTRY?{entry:s.AICBLOCK_NSERVE_APP_ENTRY}:{},u=l=>{let i=n&&n[l];i&&(process.env[l]=i)};Object.keys(n||{}).forEach(u);let a=O({outputDir:"dist",entry:"app.ts",sourceDir:"src"},{...e,...c,envs:{system:s}});return Object.keys(o.yamlConfig||{}).length>0&&(a=O(a||{},{yamlConfig:o.yamlConfig.YAML_CONFIG})),a.lifecycleBefore&&typeof a.lifecycleBefore=="function"&&(a=O(a||{},a.lifecycleBefore(a)||{})),a}catch(t){throw v("defineNserveConfig fial::","ERROR"),t}}var A=_,z={DefineNserveConfig:N,DefineGenRouter:A};0&&(module.exports={DefineGenRouter,DefineNserveConfig,nbuild});
package/lib/runtime.js CHANGED
@@ -1,21 +1,21 @@
1
- "use strict";var Se=Object.create;var W=Object.defineProperty;var Ce=Object.getOwnPropertyDescriptor;var Ae=Object.getOwnPropertyNames;var Le=Object.getPrototypeOf,je=Object.prototype.hasOwnProperty;var we=(t,r)=>{for(var o in r)W(t,o,{get:r[o],enumerable:!0})},pe=(t,r,o,c)=>{if(r&&typeof r=="object"||typeof r=="function")for(let i of Ae(r))!je.call(t,i)&&i!==o&&W(t,i,{get:()=>r[i],enumerable:!(c=Ce(r,i))||c.enumerable});return t};var fe=(t,r,o)=>(o=t!=null?Se(Le(t)):{},pe(r||!t||!t.__esModule?W(o,"default",{value:t,enumerable:!0}):o,t)),De=t=>pe(W({},"__esModule",{value:!0}),t);var Je={};we(Je,{default:()=>We,execRun:()=>_e});module.exports=De(Je);var V=require("path");var de=require("esbuild"),S=require("fs"),te=require("path"),ee=fe(require("vm")),Ue=fe(require("js-yaml"));function C(t,r="INFO"){let o=(l,p="green")=>`\x1B[${{green:"32m",red:"31m",blue:"34m",orange:"30m"}[p]}${l}\x1B[0m`,i={INFO:"blue",WARNING:"orange",ERROR:"red",SUCCESS:"green"}[r],m=o(r,i);console.log(`[${m}] - ${t}`)}function ne(t,r){let o=t.findIndex(i=>i===r);if(o<0||t.length-1===o)return;let c=t[o+1];if(c.indexOf("--")!==0)return c}function J(t,r){try{let o=(0,S.readFileSync)(t,"utf-8"),c=(0,de.transformSync)(o,{format:"cjs",loader:"ts",platform:"node",target:"node18"}),i={module:{paths:[(0,te.join)(r,"node_modules")],exports:{default:void 0}},require,__dirname:r,global,__filename,process},m=new ee.default.Script(c.code);return ee.default.createContext(i),m.runInContext(i),i.module.exports.default||i.module.exports}catch(o){console.error(o),process.exit(0)}}function U(t){return!t||typeof t!="string"?t:t.split(/[\-_]/g).map(o=>o.charAt(0).toUpperCase()+o.slice(1)).join("")}function me(t,r="_"){return!t||typeof t!="string"?t:t.replace(/([A-Z])([A-Z])(?=[a-z])/g,`$1${r}$2`).replace(/([a-z])([A-Z])/g,`$1${r}$2`).toLowerCase()}var oe=require("fs"),Re=require("child_process");var h=require("fs"),O=require("path");var Me=t=>{let r=[],o=new Map,c=new Map;function i(n){if(!c.has(n))return c.set(n,1),n;let e=c.get(n)+1;return c.set(n,e),`${n}${e}`}function m(n,e,u){let s=[];if(e.type==="array"){if(e.properties&&Object.keys(e.properties).length>0){let y=`${u||"Anonymous"}_${n}_Item`,f=e.name,a=f||y;if(f&&o.has(f)){let I=o.get(f),w=l(f,e.properties,e.description);if(I!==w)a=i(f);else return{type:`${f}[]`,generatedInterfaces:s}}let E=l(a,e.properties,e.description);return E&&(o.set(a,E),s.push(a)),{type:`${a}[]`,generatedInterfaces:s}}return{type:"any[]",generatedInterfaces:s}}if(e.type==="object"&&e.properties){let y=`${u||"Anonymous"}_${n}`,f=e.name,a=f||y;if(f&&o.has(f)){let I=o.get(f),w=l(f,e.properties,e.description);if(I!==w)a=i(f);else return{type:f,generatedInterfaces:s}}let E=l(a,e.properties,e.description);return E&&(o.set(a,E),s.push(a)),{type:a,generatedInterfaces:s}}return typeof e.type=="object"&&e.type.type==="enum"?{type:e.type.values.map(a=>typeof a=="string"?`'${a}'`:a).join(" | "),generatedInterfaces:s}:typeof e.type=="object"?{type:e.type.name,generatedInterfaces:s}:{type:e.type||"string",generatedInterfaces:s}}function l(n,e,u){let s=[];return u&&s.push(`// ${u}`),Object.entries(e).forEach(([y,f])=>{let a=m(y,f,n),E=f.description?` // ${f.description}`:"",I=` ${y}${f.required===!1?"?":""}: ${a.type};`;s.push(E?`${E}
2
- ${I}`:I)}),s.length===0?`interface ${n} {}`:`interface ${n} {
1
+ "use strict";var Ae=Object.create;var W=Object.defineProperty;var we=Object.getOwnPropertyDescriptor;var Ce=Object.getOwnPropertyNames;var Le=Object.getPrototypeOf,je=Object.prototype.hasOwnProperty;var De=(t,r)=>{for(var n in r)W(t,n,{get:r[n],enumerable:!0})},pe=(t,r,n,c)=>{if(r&&typeof r=="object"||typeof r=="function")for(let i of Ce(r))!je.call(t,i)&&i!==n&&W(t,i,{get:()=>r[i],enumerable:!(c=we(r,i))||c.enumerable});return t};var te=(t,r,n)=>(n=t!=null?Ae(Le(t)):{},pe(r||!t||!t.__esModule?W(n,"default",{value:t,enumerable:!0}):n,t)),Ue=t=>pe(W({},"__esModule",{value:!0}),t);var Qe={};De(Qe,{default:()=>We,execRun:()=>Re});module.exports=Ue(Qe);var F=require("path");var fe=require("esbuild");var Y=require("path"),de=require("module"),ne=te(require("vm")),Me=te(require("js-yaml"));function S(t,r="INFO"){let n=(f,u="green")=>`\x1B[${{green:"32m",red:"31m",blue:"34m",orange:"30m"}[u]}${f}\x1B[0m`,i={INFO:"blue",WARNING:"orange",ERROR:"red",SUCCESS:"green"}[r],g=n(r,i);console.log(`[${g}] - ${t}`)}function re(t,r){let n=t.findIndex(i=>i===r);if(n<0||t.length-1===n)return;let c=t[n+1];if(c.indexOf("--")!==0)return c}function Q(t,r){try{let n=(0,Y.resolve)(t),c=(0,fe.buildSync)({entryPoints:[n],bundle:!0,packages:"external",write:!1,format:"cjs",platform:"node",target:"node18"}),i={module:{exports:{default:void 0}},require:(0,de.createRequire)(n),__dirname:(0,Y.dirname)(n),global,__filename:n,process},g=new ne.default.Script(c.outputFiles[0].text,{filename:n});return ne.default.createContext(i),g.runInContext(i),i.module.exports.default||i.module.exports}catch(n){throw n}}function U(t){return!t||typeof t!="string"?t:t.split(/[\-_]/g).map(n=>n.charAt(0).toUpperCase()+n.slice(1)).join("")}function me(t,r="_"){return!t||typeof t!="string"?t:t.replace(/([A-Z])([A-Z])(?=[a-z])/g,`$1${r}$2`).replace(/([a-z])([A-Z])/g,`$1${r}$2`).toLowerCase()}var se=require("fs"),Oe=require("child_process");var h=require("fs"),R=require("path");var ve=t=>{let r=[],n=new Map,c=new Map;function i(e){if(!c.has(e))return c.set(e,1),e;let o=c.get(e)+1;return c.set(e,o),`${e}${o}`}function g(e,o,T){let s=[];if(o.type==="array"){if(o.properties&&Object.keys(o.properties).length>0){let y=`${T||"Anonymous"}_${e}_Item`,p=o.name,a=p||y;if(p&&n.has(p)){let I=n.get(p),j=f(p,o.properties,o.description);if(I!==j)a=i(p);else return{type:`${p}[]`,generatedInterfaces:s}}let E=f(a,o.properties,o.description);return E&&(n.set(a,E),s.push(a)),{type:`${a}[]`,generatedInterfaces:s}}return{type:"any[]",generatedInterfaces:s}}if(o.type==="object"&&o.properties){let y=`${T||"Anonymous"}_${e}`,p=o.name,a=p||y;if(p&&n.has(p)){let I=n.get(p),j=f(p,o.properties,o.description);if(I!==j)a=i(p);else return{type:p,generatedInterfaces:s}}let E=f(a,o.properties,o.description);return E&&(n.set(a,E),s.push(a)),{type:a,generatedInterfaces:s}}return typeof o.type=="object"&&o.type.type==="enum"?{type:o.type.values.map(a=>typeof a=="string"?`'${a}'`:a).join(" | "),generatedInterfaces:s}:typeof o.type=="object"?{type:o.type.name,generatedInterfaces:s}:{type:o.type||"string",generatedInterfaces:s}}function f(e,o,T){let s=[];return T&&s.push(`// ${T}`),Object.entries(o).forEach(([y,p])=>{let a=g(y,p,e),E=p.description?` // ${p.description}`:"",I=` ${y}${p.required===!1?"?":""}: ${a.type};`;s.push(E?`${E}
2
+ ${I}`:I)}),s.length===0?`interface ${e} {}`:`interface ${e} {
3
3
  ${s.join(`
4
4
  `)}
5
- }`}function p(n){if(n.type!==void 0){let s=[];return n.description&&s.push(`// ${n.description}`),s.push(`type ${n.name} = ${n.type};`),s.join(`
6
- `)}Object.entries(n.properties||{}).forEach(([s,y])=>{m(s,y,n.name)});let e="";if(n.genericity)if(typeof n.genericity=="string"){let s=g(n);s?e=` extends ${n.genericity}<${s}>`:e=` extends ${n.genericity}`}else{let{name:s,typeParams:y}=n.genericity;e=` extends ${s}<${y.join(", ")}>`}else n.extends&&(Array.isArray(n.extends)?e=` extends ${n.extends.join(", ")}`:e=` extends ${n.extends}`);if(n.genericity)return`interface ${n.name}${e} {}`;let u=[];return Object.entries(n.properties||{}).forEach(([s,y])=>{let f=m(s,y,n.name),a=y.description?` // ${y.description}`:"",E=` ${s}${y.required===!1?"?":""}: ${f.type};`;u.push(a?`${a}
7
- ${E}`:E)}),`interface ${n.name}${e} {
8
- ${u.join(`
5
+ }`}function u(e){if(e.type!==void 0){let s=[];return e.description&&s.push(`// ${e.description}`),s.push(`type ${e.name} = ${e.type};`),s.join(`
6
+ `)}Object.entries(e.properties||{}).forEach(([s,y])=>{g(s,y,e.name)});let o="";if(e.genericity)if(typeof e.genericity=="string"){let s=l(e);s?o=` extends ${e.genericity}<${s}>`:o=` extends ${e.genericity}`}else{let{name:s,typeParams:y}=e.genericity;o=` extends ${s}<${y.join(", ")}>`}else e.extends&&(Array.isArray(e.extends)?o=` extends ${e.extends.join(", ")}`:o=` extends ${e.extends}`);if(e.genericity)return`interface ${e.name}${o} {}`;let T=[];return Object.entries(e.properties||{}).forEach(([s,y])=>{let p=g(s,y,e.name),a=y.description?` // ${y.description}`:"",E=` ${s}${y.required===!1?"?":""}: ${p.type};`;T.push(a?`${a}
7
+ ${E}`:E)}),`interface ${e.name}${o} {
8
+ ${T.join(`
9
9
  `)}
10
- }`}function g(n){let e=n.properties?.list;if(e&&e.type==="array"&&e.name)return e.name;for(let[u,s]of Object.entries(n.properties||{}))if(s.type==="array"&&s.name)return s.name;return null}let R=p(t);return o.forEach(n=>{r.push(n)}),r.push(R),r.join(`
10
+ }`}function l(e){let o=e.properties?.list;if(o&&o.type==="array"&&o.name)return o.name;for(let[T,s]of Object.entries(e.properties||{}))if(s.type==="array"&&s.name)return s.name;return null}let d=u(t);return n.forEach(e=>{r.push(e)}),r.push(d),r.join(`
11
11
 
12
- `)},re=Me;var ve=(t,r,o,c="@")=>{let i=(0,O.join)(r,o,"handler"),m=(0,O.join)(r,o,"logic"),l=(0,O.join)(r,o,"types");!(0,h.existsSync)(i)&&(0,h.mkdirSync)(i,{recursive:!0}),!(0,h.existsSync)(m)&&(0,h.mkdirSync)(m,{recursive:!0}),!(0,h.existsSync)(l)&&(0,h.mkdirSync)(l,{recursive:!0});let g=Object.assign({},{genDir:"nserve-config",routerDir:"router",modelDir:"model"},t),{genDir:R,routerDir:n,middleware:e}=g,u=(0,O.join)(r,R),s=(0,O.join)(u,n||"");if(!(0,h.existsSync)(s)){console.log("[ERROR] API\u63CF\u8FF0\u6587\u4EF6\u4E0D\u5B58\u5728::",s);return}if(!(0,h.statSync)(s).isDirectory()){console.log("[ERROR] API\u63CF\u8FF0\u6587\u4EF6\u4E0D\u662F\u76EE\u5F55");return}let f=(0,h.readdirSync)(s).filter(L=>L.endsWith(".ts")||L.endsWith(".js"));if(f.length===0){console.log("[ERROR] API\u63CF\u8FF0\u6587\u4EF6\u76EE\u5F55\u4E0B\u6CA1\u6709\u63CF\u8FF0\u751F\u6210\u6587\u4EF6");return}let a=[],E=[];f.forEach(L=>{let F=J((0,O.join)(s,L),__dirname);if(!F)return;let $=F,v=L.replace(".ts",".handler"),se=U(L.replace(".ts",""))+"Server",Oe=(0,O.join)(i,[v,".ts"].join("")),Ie=[c,"handler",v].join("/");a.push(`import ${se} from '${Ie}'`),E.push(se);let Q=[],ie=[],z=(0,O.join)(m,$.handler),H=(0,O.join)(l,$.handler);!(0,h.existsSync)(z)&&(0,h.mkdirSync)(z,{recursive:!0}),!(0,h.existsSync)(H)&&(0,h.mkdirSync)(H,{recursive:!0});let Y={},P={};e&&Object.keys(e).forEach(d=>{let{libName:_,funcName:N}=e[d],j=N?`{${N} as ${d}}`:d;Y[d]=`import ${j} from '${_}'`}),$.service?.forEach(d=>{let _=["import type { Request, Response } from 'express'"],N=["ErrorResponse","SuccessResponse"],j=me(d.handler,"-"),G=[];if(d.responseDataType&&G.push(re(d.responseDataType)),d.requestDataType&&G.push(re(d.requestDataType)),G.length>0){let A=(0,O.join)(H,`${j}.types.d.ts`);(0,h.writeFileSync)(A,G.join(`
13
- `),"utf-8")}let k=d.method?.toLowerCase()||"get",K=U(d.handler),D=[];if(d.middleware&&g.middleware){let A=Array.isArray(d.middleware)?d.middleware:[d.middleware];if(!A.every(T=>{let x=typeof T=="string"?T:T.name;return!!Y[x]}))throw new Error(`[ERROR] \u8DEF\u7531\u914D\u7F6E\u4E2D\u4F7F\u7528\u4E86\u4E0D\u5B58\u5728\u7684\u4E2D\u95F4\u4EF6::${A}`);let B=[];A.forEach(T=>{let x=typeof T=="string"?T:T.name;P[x]=Y[x];let ue=(typeof T=="string"?void 0:Array.isArray(T.value)?T.value:[T.value])?.map(Z=>typeof Z=="string"?`'${Z}'`:Z),xe=ue?`${x}(${ue.join(",")})`:x;B.push(xe)}),D.push(...B)}let be=[c,"logic",$.handler,j].join("/");Q.push(`import ${K} from '${be}.logic'`),ie.push(`Router.${k}('${d.path}',${D.join(",")}${D.length>0?",":""}${K})`),d.docRemark&&_.concat(`// ${d.docRemark}`);let ce=[];if(d.requestDataType&&d.requestDataType.properties){let A=d.requestDataType,q=A.properties,B=Object.keys(q).filter(T=>q[T].required!==!1).reduce((T,x)=>{let le=typeof q[x].type=="string"?q[x].type:"object";return T[x]={required:!0,type:le},T},{});if(Object.keys(B).length>0){let T=A.source||(d.method==="GET"?"query":"body");ce.push(`const data = req.${T} as ${A.name}`,`CheckFieldRequired(data, ${JSON.stringify(B)})`),N.push("CheckFieldRequired")}}_.push(`import { ${N.join(",")} } from '@aicblock/nserve/lib/tools'`);let Ne=_.concat(`
14
- ${d.docRemark?`// ${d.docRemark}`:""}
12
+ `)},oe=ve;var Pe=(t,r,n,c="@")=>{let i=(0,R.join)(r,n,"handler"),g=(0,R.join)(r,n,"logic"),f=(0,R.join)(r,n,"types");!(0,h.existsSync)(i)&&(0,h.mkdirSync)(i,{recursive:!0}),!(0,h.existsSync)(g)&&(0,h.mkdirSync)(g,{recursive:!0}),!(0,h.existsSync)(f)&&(0,h.mkdirSync)(f,{recursive:!0});let l=Object.assign({},{genDir:"nserve-config",routerDir:"router",modelDir:"model"},t),{genDir:d,routerDir:e,middleware:o}=l,T=(0,R.join)(r,d),s=(0,R.join)(T,e||"");if(!(0,h.existsSync)(s)){console.log("[ERROR] API\u63CF\u8FF0\u6587\u4EF6\u4E0D\u5B58\u5728::",s);return}if(!(0,h.statSync)(s).isDirectory()){console.log("[ERROR] API\u63CF\u8FF0\u6587\u4EF6\u4E0D\u662F\u76EE\u5F55");return}let p=(0,h.readdirSync)(s).filter(A=>A.endsWith(".ts")||A.endsWith(".js"));if(p.length===0){console.log("[ERROR] API\u63CF\u8FF0\u6587\u4EF6\u76EE\u5F55\u4E0B\u6CA1\u6709\u63CF\u8FF0\u751F\u6210\u6587\u4EF6");return}let a=[],E=[];p.forEach(A=>{let B=Q((0,R.join)(s,A),__dirname);if(!B)return;let b=B,P=A.replace(".ts",".handler"),ie=U(A.replace(".ts",""))+"Server",Ie=(0,R.join)(i,[P,".ts"].join("")),be=[c,"handler",P].join("/");a.push(`import ${ie} from '${be}'`),E.push(ie);let X=[],ce=[],z=(0,R.join)(g,b.handler),H=(0,R.join)(f,b.handler);!(0,h.existsSync)(z)&&(0,h.mkdirSync)(z,{recursive:!0}),!(0,h.existsSync)(H)&&(0,h.mkdirSync)(H,{recursive:!0});let k={},V={};o&&Object.keys(o).forEach(m=>{let{libName:O,funcName:N}=o[m],w=N?`{${N} as ${m}}`:m;k[m]=`import ${w} from '${O}'`}),b.service?.forEach(m=>{let O=["import type { Request, Response } from 'express'"],N=["ErrorResponse","SuccessResponse"],w=me(m.handler,"-"),q=[];if(m.responseDataType&&q.push(oe(m.responseDataType)),m.requestDataType&&q.push(oe(m.requestDataType)),q.length>0){let C=(0,R.join)(H,`${w}.types.d.ts`);(0,h.writeFileSync)(C,q.join(`
13
+ `),"utf-8")}let K=m.method?.toLowerCase()||"get",J=U(m.handler),D=[];if(m.middleware&&l.middleware){let C=Array.isArray(m.middleware)?m.middleware:[m.middleware];if(!C.every(_=>{let $=typeof _=="string"?_:_.name;return!!k[$]}))throw new Error(`[ERROR] \u8DEF\u7531\u914D\u7F6E\u4E2D\u4F7F\u7528\u4E86\u4E0D\u5B58\u5728\u7684\u4E2D\u95F4\u4EF6::${C}`);let G=[];C.forEach(_=>{let $=typeof _=="string"?_:_.name;V[$]=k[$];let ue=(typeof _=="string"?void 0:Array.isArray(_.value)?_.value:[_.value])?.map(ee=>typeof ee=="string"?`'${ee}'`:ee),Se=ue?`${$}(${ue.join(",")})`:$;G.push(Se)}),D.push(...G)}let xe=[c,"logic",b.handler,w].join("/");X.push(`import ${J} from '${xe}.logic'`),ce.push(`Router.${K}('${m.path}',${D.join(",")}${D.length>0?",":""}${J})`),m.docRemark&&O.concat(`// ${m.docRemark}`);let ae=[];if(m.requestDataType&&m.requestDataType.properties){let C=m.requestDataType,M=C.properties,G=Object.keys(M).filter(_=>M[_].required!==!1).reduce((_,$)=>{let L=typeof M[$].type=="string"?M[$].type:"object";return _[$]={required:!0,type:L},_},{});if(Object.keys(G).length>0){let _=Object.values(M).filter(L=>L.source).map(L=>L.source),$=_.length>0&&_.every(L=>L===_[0])?_[0]:m.method==="GET"?"query":"body";ae.push(`const data = req.${$} as ${C.name}`,`CheckFieldRequired(data, ${JSON.stringify(G)})`),N.push("CheckFieldRequired")}}O.push(`import { ${N.join(",")} } from '@aicblock/nserve/lib/tools'`);let Ne=O.concat(`
14
+ ${m.docRemark?`// ${m.docRemark}`:""}
15
15
  export async function ServiceLogic(req: Request, res: Response) {
16
16
  try {
17
17
  // todo: \u63A5\u53E3\u670D\u52A1\u903B\u8F91\u5B9E\u73B0
18
- ${ce.join(`
18
+ ${ae.join(`
19
19
  `)}
20
20
  SuccessResponse(res, true)
21
21
  } catch (error) {
@@ -23,9 +23,9 @@ ${u.join(`
23
23
  }
24
24
  }
25
25
  export default ServiceLogic
26
- `),ae=(0,O.join)(z,`${j}.logic.ts`);!(0,h.existsSync)(ae)&&(0,h.writeFileSync)(ae,Ne.join(`
27
- `),"utf-8")});let X=[];$.middleware&&(Array.isArray($.middleware)?$.middleware:[$.middleware]).forEach(_=>{let N=typeof _=="string"?_:_.name,j=Y[N];if(!j||P[N])return;P[N]=j;let k=(typeof _=="string"?void 0:Array.isArray(_.value)?_.value:[_.value])?.map(D=>typeof D=="string"?`'${D}'`:D),K=k?`${N}(${k.join(",")})`:N;X.push(K)}),Object.keys(P).forEach(d=>{Q.push(P[d])});let $e=["// Code generated by plugin. Templates Edited by aicblock cli. DO NOT EDIT.","import express from 'express'",...Q,"const app = express()","const Router = express.Router()",X.length>0?`Router.use(${X.join(",")})`:"",`app.use('${$.prefix}', Router)`,...ie,"export default app"];(0,h.writeFileSync)(Oe,$e.join(`
28
- `))});let I=(0,O.join)(i,"router.ts"),w=["// Code generated by plugin. Templates Edited by aicblock cli. DO NOT EDIT.",...a,"export default [",E.join(","),"]"];(0,h.writeFileSync)(I,w.join(`
29
- `)),console.log("[INFO] gen router file ",I)},ge=ve;var b=require("fs"),M=require("path"),Pe=new Set(["INT","BIGINT","BIT","DECIMAL","DOUBLE","FLOAT","INTEGER","MEDIUMINT","NUMERIC","REAL","SMALLINT","TINYINT"]);function Ge(t){let c=t.replace(/\/\*[\s\S]*?\*\//g,"").trim().replace(/--.*$/gm,"").replace(/\s+/g," "),i=c.match(/CREATE TABLE [`"]?([\w_]+)[`"]?\s*\(/i);if(!i)throw new Error("\u65E0\u6CD5\u89E3\u6790\u8868\u540D");let l={tableName:i[1],columns:[]},p=c.indexOf("("),g=c.lastIndexOf(")");if(p===-1||g===-1||g<=p)throw new Error("\u65E0\u6CD5\u627E\u5230\u5217\u5B9A\u4E49\u90E8\u5206");let R=c.substring(p+1,g);if(!R.trim())return l;let n=qe(R),e=new Set,u=new Set;return n.forEach(s=>{let y=s.trim();if(y.toUpperCase().startsWith("PRIMARY KEY")){let a=y.match(/PRIMARY KEY\s*\([`"]?([\w_]+)[`"]?\)/i);a&&e.add(a[1]);return}if(y.toUpperCase().startsWith("UNIQUE")){let a=y.match(/\([`"]?([\w_]+)[`"]?(?:\s+ASC|DESC)?\)/i);a&&u.add(a[1]);return}let f=Be(y);f&&l.columns.push(f)}),l.columns.forEach(s=>{e.has(s.name)&&(s.primaryKey=!0),u.has(s.name)&&(s.unique=!0)}),l}function qe(t){let r=[],o="",c=!1,i=!1,m=0;for(let l=0;l<t.length;l++){let p=t[l],g=l+1<t.length?t[l+1]:"";p==="'"&&!i&&(c=!c),p==="-"&&g==="-"&&!c&&(i=!0),i&&(p===","||p===")")&&(i=!1),p==="("&&!c&&!i&&m++,p===")"&&!c&&!i&&m--,p===","&&!c&&!i&&m===0?(o.trim()&&r.push(o.trim()),o=""):o+=p}return o.trim()&&r.push(o.trim()),r}function Be(t){if(t.toUpperCase().startsWith("PRIMARY KEY")||t.toUpperCase().startsWith("UNIQUE")||t.toUpperCase().startsWith("KEY"))return null;let r=/^[`"]?([\w_]+)[`"]?\s+([a-zA-Z]+)(?:\s*\(\s*(\d+)\s*\))?(?:\s+(?:CHARACTER\s+SET|CHARSET)\s+\w+)?(?:\s+COLLATE\s+\w+)?(?:\s+(NOT\s+NULL|NULL))?(?:\s+UNIQUE)?(?:\s+AUTO_INCREMENT)?(?:\s+DEFAULT\s+([\w'"-]+))?(?:\s+COMMENT\s+'([^']*)')?/i,o=t.match(r);if(!o)return null;let[,c,i,m,l,p,g]=o,R=i.toUpperCase(),n={name:c,dataType:R};if(m&&(n.length=parseInt(m,10)),l&&l.toUpperCase()==="NOT NULL"&&(n.notNull=!0),t.toUpperCase().includes("UNIQUE")&&(n.unique=!0),t.toUpperCase().includes("AUTO_INCREMENT")&&(n.autoIncrement=!0),p!==void 0&&p!==""&&p!=="NULL"){let e=p.trim();if((e.startsWith("'")&&e.endsWith("'")&&e.length>1||e.startsWith('"')&&e.endsWith('"')&&e.length>1)&&(e=e.substring(1,e.length-1)),Pe.has(R)){let u=Number(e);!isNaN(u)&&e!==""?n.defaultValue=u:e!==""&&(n.defaultValue=e)}else e!==""&&(n.defaultValue=e)}return g&&(n.comments=g),n}var Ve=(t,r,o)=>{let c={genDir:"nserve-config",modelDir:"model"},{genDir:i,modelDir:m}=Object.assign({},c,t),l=(0,M.join)(r,i,m);if(!(0,b.existsSync)(l))return;let p=(0,b.readdirSync)(l).filter(s=>s.endsWith(".sql"));if(p.length===0)throw new Error(`The SQL model directory does not contain any SQL files::${l}`);let g=(0,M.join)(r,o,m);(0,b.existsSync)(g)||(0,b.mkdirSync)(g);let R=[],n=[];p.forEach(s=>{let y=(0,M.join)(l,s),f=(0,b.readFileSync)(y,"utf-8");try{let a=Ge(f),E=a.tableName,I=(0,M.join)(g,`${E}.ts`),w=a.columns.map(v=>`${U(v.name)} = '${v.name}'`),L=[a.tableName,"_Field"].join(""),F=["import { DefineTable } from '@aicblock/esql'",`const table = DefineTable(${JSON.stringify(a,null,2)})`,`export enum ${U(L)} { ${w.join(", ")}}`,"export default table"];(0,b.writeFileSync)(I,F.join(`
30
- `),"utf-8");let $=U(E);n.push($),R.push(`import ${$} from './${E}'`),C(`The model file ${E} has been generated::${I}`)}catch{throw new Error(`The SQL file ${s} is not a valid CREATE TABLE statement::${y}`)}});let e=(0,M.join)(g,"index.ts"),u=[...R,`export default [${n.join(", ")}]`];(0,b.writeFileSync)(e,u.join(`
31
- `),"utf-8"),C(`The model index file has been generated::${e}`)},ye=Ve;var he=require("child_process"),Ee=require("path"),Fe=(t,r,o)=>{try{let c=r||process.cwd();ge(t||{},c,o||"src"),ye(t||{},c,o||"src");let i={semi:!1,singleQuote:!0,trailingComma:"none"},{semi:m,singleQuote:l,trailingComma:p}=Object.assign({},i,t?.codePrettier||{}),g=["npx prettier"];m===!1&&g.push("--no-semi"),l===!0&&g.push("--single-quote"),p&&g.push(`--trailing-comma ${p}`);let R=["'logic/**/*.ts'","'handler/**/*.ts'","'model/**/*.ts'","'types/**/*.d.ts'"];g.push("--write",...R);let n=g.join(" "),e=(0,Ee.join)(c,o||"src");console.log("[INFO] execRunGen::",e),console.log("[INFO] cmd::",n),(0,he.spawnSync)(n,{cwd:e,stdio:"inherit",shell:!0}),C("[INFO] execRunGen","SUCCESS")}catch(c){C("execRunGen fial::","ERROR"),console.error(c)}},Te=Fe;function Ye(t,r){C(`${r?`The [${r}] app has been `:""}Build DONE. [Build time:${Date.now()-t} ms]`,"SUCCESS")}function ke(t){C(t==="build"?"Build Fail.":"Serve process has exited.","ERROR")}function Ke(){let t=process.cwd(),r=ne(process.argv,"--config"),o=(0,V.join)(t,"nserve.config.ts"),c=(0,V.join)(t,"nserve.config.js"),i=r?(0,V.join)(t,r):(0,oe.existsSync)(o)?o:c;if(!(0,oe.existsSync)(i))throw Error(`The configuration file does not exist. [${i}]`);return i}function _e(t){try{let o=Ke(),c=process.cwd(),i=t,m=ne(process.argv,"--mode"),l=JSON.stringify(process.argv),p={AICBLOCK_NSERVE_RUN_CWD:c,AICBLOCK_NSERVE_RUN_CONFIG_PATH:o,AICBLOCK_NSERVE_RUN_MODE:i,AICBLOCK_NSERVE_ENV_MODE:m,AICBLOCK_NSERVE_RUN_ARGV:l};if(Object.keys(p).forEach(u=>{let s=p[u];s!==void 0&&(process.env[u]=s)}),t==="gen"){let{generateConfig:u,sourceDir:s}=J(o,process.cwd());Te(u||{},c,s||"src");return}let g=Date.now();var r=void 0;let R=process.platform==="win32"?"node.cmd":"node",e=(0,Re.spawn)(R,["./lib/core/run.js","--cmd"],{cwd:(0,V.join)(__dirname,"../"),stdio:t==="build"?"inherit":"pipe",env:Object.assign({},process.env,p)});e.stdout?.on("data",u=>{r&&r.stop(),console.log(u.toString("utf-8"))}),e.stdout?.on("error",u=>{r&&r.stop(),console.log(u.toString())}),e.stderr?.on("data",u=>{r&&r.stop(),console.log(u.toString("utf-8"))}),e.on("exit",u=>{r&&r.stop(),u===0&&t==="build"&&Ye(g,m),u!==0&&ke(t)})}catch(o){C("execRun fial::","ERROR"),console.error(o)}}var We=_e;0&&(module.exports={execRun});
26
+ `),le=(0,R.join)(z,`${w}.logic.ts`);!(0,h.existsSync)(le)&&(0,h.writeFileSync)(le,Ne.join(`
27
+ `),"utf-8")});let Z=[];b.middleware&&(Array.isArray(b.middleware)?b.middleware:[b.middleware]).forEach(O=>{let N=typeof O=="string"?O:O.name,w=k[N];if(!w)throw new Error(`[ERROR] \u8DEF\u7531\u914D\u7F6E\u4E2D\u4F7F\u7528\u4E86\u4E0D\u5B58\u5728\u7684\u4E2D\u95F4\u4EF6::${N}`);V[N]=w;let K=(typeof O=="string"?void 0:Array.isArray(O.value)?O.value:[O.value])?.map(D=>typeof D=="string"?`'${D}'`:D),J=K?`${N}(${K.join(",")})`:N;Z.push(J)}),Object.keys(V).forEach(m=>{X.push(V[m])});let $e=["// Code generated by plugin. Templates Edited by aicblock cli. DO NOT EDIT.","import express from 'express'",...X,"const app = express()","const Router = express.Router()",Z.length>0?`Router.use(${Z.join(",")})`:"",`app.use('${b.prefix}', Router)`,...ce,"export default app"];(0,h.writeFileSync)(Ie,$e.join(`
28
+ `))});let I=(0,R.join)(i,"router.ts"),j=["// Code generated by plugin. Templates Edited by aicblock cli. DO NOT EDIT.",...a,"export default [",E.join(","),"]"];(0,h.writeFileSync)(I,j.join(`
29
+ `)),console.log("[INFO] gen router file ",I)},ge=Pe;var x=require("fs"),v=require("path"),qe=new Set(["INT","BIGINT","BIT","DECIMAL","DOUBLE","FLOAT","INTEGER","MEDIUMINT","NUMERIC","REAL","SMALLINT","TINYINT"]);function Ge(t){let c=t.replace(/\/\*[\s\S]*?\*\//g,"").trim().replace(/--.*$/gm,"").replace(/\s+/g," "),i=c.match(/CREATE TABLE [`"]?([\w_]+)[`"]?\s*\(/i);if(!i)throw new Error("\u65E0\u6CD5\u89E3\u6790\u8868\u540D");let f={tableName:i[1],columns:[]},u=c.indexOf("("),l=c.lastIndexOf(")");if(u===-1||l===-1||l<=u)throw new Error("\u65E0\u6CD5\u627E\u5230\u5217\u5B9A\u4E49\u90E8\u5206");let d=c.substring(u+1,l);if(!d.trim())return f;let e=Ye(d),o=new Set,T=new Set,s=[];return e.forEach(y=>{let p=y.trim();if(p.toUpperCase().startsWith("PRIMARY KEY")){let a=ye(p,/^PRIMARY KEY\s*\(/i);if(!a)throw new Error(`Unsupported primary key: ${p}`);o.add(a[0]);return}if(p.toUpperCase().startsWith("UNIQUE")){let a=ye(p,/^UNIQUE(?:\s+(?:KEY|INDEX))?(?:\s+[`"]?[\w_]+[`"]?)?\s*\(/i);if(!a)throw new Error(`Unsupported unique index: ${p}`);if(a.length===1)T.add(a[0]);else{let E=p.match(/^UNIQUE(?:\s+(?:KEY|INDEX))?\s+[`"]?([\w_]+)[`"]?\s*\(/i);s.push({name:E?E[1]:`uk_${a.join("_")}`,columns:a})}return}/^(?:KEY|INDEX|FULLTEXT|SPATIAL)\b/i.test(p)||f.columns.push(Fe(p))}),f.columns.forEach(y=>{o.has(y.name)&&(y.primaryKey=!0),T.has(y.name)&&(y.unique=!0)}),s.length>0&&(f.uniqueIndex=s),f}function ye(t,r){if(!r.test(t))return null;let n=t.match(/\(\s*((?:[^()]|\(\s*\d+\s*\))*)\s*\)\s*(?:USING\s+\w+)?$/i);return n?n[1].split(",").map(c=>c.trim().replace(/\s*\(\s*\d+\s*\)/,"").replace(/\s+(?:ASC|DESC)$/i,"").replace(/^[`"]+|[`"]+$/g,"")):null}function Ye(t){let r=[],n="",c=!1,i=!1,g=0;for(let f=0;f<t.length;f++){let u=t[f],l=f+1<t.length?t[f+1]:"";u==="'"&&!i&&(c=!c),u==="-"&&l==="-"&&!c&&(i=!0),i&&(u===","||u===")")&&(i=!1),u==="("&&!c&&!i&&g++,u===")"&&!c&&!i&&g--,u===","&&!c&&!i&&g===0?(n.trim()&&r.push(n.trim()),n=""):n+=u}return n.trim()&&r.push(n.trim()),r}function Fe(t){let r=t.match(/^[`"]?([\w_]+)[`"]?\s+([a-zA-Z]+)(?:\s*\(\s*(\d+)\s*(?:,\s*(\d+)\s*)?\))?/);if(!r)throw new Error(`Unsupported SQL column definition: ${t}`);let[,n,c,i,g]=r,f=c.toUpperCase(),u={name:n,dataType:f};i&&(u.length=Number(i)),g&&(u.point=Number(g));let l=t.slice(r[0].length).trim();for(;l;){let d=null;if(!(d=l.match(/^(?:CHARACTER\s+SET|CHARSET|COLLATE)\s+\w+/i))){if(d=l.match(/^NOT\s+NULL\b/i))u.notNull=!0;else if(!(d=l.match(/^NULL\b/i))){if(d=l.match(/^PRIMARY\s+KEY\b/i))u.primaryKey=!0;else if(d=l.match(/^UNIQUE(?:\s+KEY)?\b/i))u.unique=!0;else if(d=l.match(/^AUTO_INCREMENT\b/i))u.autoIncrement=!0;else if(d=l.match(/^UNSIGNED\b/i))u.unsigned=!0;else if(d=l.match(/^ZEROFILL\b/i))u.zeroFill=!0;else if(d=l.match(/^DEFAULT\s+('(?:''|\\'|[^'])*'|"(?:\\"|[^"])*"|\S+)/i)){let e=d[1];if((e.startsWith("'")||e.startsWith('"'))&&(e=e.slice(1,-1).replace(/''/g,"'")),e.toUpperCase()!=="NULL"){let o=Number(e);u.defaultValue=qe.has(f)&&!isNaN(o)?o:e}}else if(d=l.match(/^COMMENT\s+'((?:''|\\'|[^'])*)'/i))u.comments=d[1].replace(/''/g,"'");else if(!(d=l.match(/^ON\s+UPDATE\s+\w+(?:\(\d*\))?/i)))throw new Error(`Unsupported SQL column option: ${l} in ${t}`)}}l=l.slice(d[0].length).trim()}return u}var Be=(t,r,n)=>{let c={genDir:"nserve-config",modelDir:"model"},{genDir:i,modelDir:g}=Object.assign({},c,t),f=(0,v.join)(r,i,g);if(!(0,x.existsSync)(f))return;let u=(0,x.readdirSync)(f).filter(s=>s.endsWith(".sql"));if(u.length===0)throw new Error(`The SQL model directory does not contain any SQL files::${f}`);let l=(0,v.join)(r,n,g);(0,x.existsSync)(l)||(0,x.mkdirSync)(l);let d=[],e=[];u.forEach(s=>{let y=(0,v.join)(f,s),p=(0,x.readFileSync)(y,"utf-8");try{let a=Ge(p),E=a.tableName,I=(0,v.join)(l,`${E}.ts`),j=a.columns.map(P=>`${U(P.name)} = '${P.name}'`),A=[a.tableName,"_Field"].join(""),B=["import { DefineTable } from '@aicblock/esql'",`const table = DefineTable(${JSON.stringify(a,null,2)})`,`export enum ${U(A)} { ${j.join(", ")}}`,"export default table"];(0,x.writeFileSync)(I,B.join(`
30
+ `),"utf-8");let b=U(E);e.push(b),d.push(`import ${b} from './${E}'`),S(`The model file ${E} has been generated::${I}`)}catch(a){throw new Error(`Invalid CREATE TABLE in ${y}: ${a instanceof Error?a.message:String(a)}`)}});let o=(0,v.join)(l,"index.ts"),T=[...d,`export default [${e.join(", ")}]`];(0,x.writeFileSync)(o,T.join(`
31
+ `),"utf-8"),S(`The model index file has been generated::${o}`)},he=Be;var Ee=require("child_process"),_e=require("path"),ke=(t,r,n)=>{let c=r||process.cwd();ge(t||{},c,n||"src"),he(t||{},c,n||"src");let i={semi:!1,singleQuote:!0,trailingComma:"none"},{semi:g,singleQuote:f,trailingComma:u}=Object.assign({},i,t?.codePrettier||{}),l=[];g===!1&&l.push("--no-semi"),f===!0&&l.push("--single-quote"),u&&l.push("--trailing-comma",u);let d=["logic/**/*.ts","handler/**/*.ts","model/**/*.ts","types/**/*.d.ts"];l.push("--no-error-on-unmatched-pattern","--write",...d);let e=(0,_e.join)(c,n||"src");console.log("[INFO] execRunGen::",e);let o=(0,Ee.spawnSync)(process.execPath,[require.resolve("prettier/bin/prettier.cjs"),...l],{cwd:e,stdio:"inherit"});if(o.error)throw o.error;if(o.status!==0)throw new Error(`Prettier failed with status ${o.status??o.signal}`);S("[INFO] execRunGen","SUCCESS")},Te=ke;function Ve(t,r){S(`${r?`The [${r}] app has been `:""}Build DONE. [Build time:${Date.now()-t} ms]`,"SUCCESS")}function Ke(t){S(t==="build"?"Build Fail.":"Serve process has exited.","ERROR")}function Je(){let t=process.cwd(),r=re(process.argv,"--config"),n=(0,F.join)(t,"nserve.config.ts"),c=(0,F.join)(t,"nserve.config.js"),i=r?(0,F.join)(t,r):(0,se.existsSync)(n)?n:c;if(!(0,se.existsSync)(i))throw Error(`The configuration file does not exist. [${i}]`);return i}function Re(t){try{let n=Je(),c=process.cwd(),i=t,g=re(process.argv,"--mode"),f=JSON.stringify(process.argv),u={AICBLOCK_NSERVE_RUN_CWD:c,AICBLOCK_NSERVE_RUN_CONFIG_PATH:n,AICBLOCK_NSERVE_RUN_MODE:i,AICBLOCK_NSERVE_ENV_MODE:g,AICBLOCK_NSERVE_RUN_ARGV:f};if(Object.keys(u).forEach(e=>{let o=u[e];o!==void 0&&(process.env[e]=o)}),t==="gen"){let{generateConfig:e,sourceDir:o}=Q(n,process.cwd());Te(e||{},c,o||"src");return}let l=Date.now();var r=void 0;let d=(0,Oe.spawn)(process.execPath,[(0,F.join)(__dirname,"core/run.js")],{cwd:c,stdio:t==="build"?"inherit":"pipe",env:Object.assign({},process.env,u)});d.stdout?.on("data",e=>{r&&r.stop(),console.log(e.toString("utf-8"))}),d.stdout?.on("error",e=>{r&&r.stop(),console.log(e.toString())}),d.stderr?.on("data",e=>{r&&r.stop(),console.log(e.toString("utf-8"))}),d.on("error",e=>{r&&r.stop(),console.error(e),process.exitCode=1}),d.on("exit",e=>{r&&r.stop(),e===0&&t==="build"&&Ve(l,g),e!==0&&Ke(t),e!==0&&(process.exitCode=e||1)})}catch(n){S("execRun fial::","ERROR"),console.error(n),process.exitCode=1}}var We=Re;0&&(module.exports={execRun});
@@ -1 +1 @@
1
- "use strict";var R=Object.create;var d=Object.defineProperty;var E=Object.getOwnPropertyDescriptor;var T=Object.getOwnPropertyNames;var j=Object.getPrototypeOf,w=Object.prototype.hasOwnProperty;var O=(e,r)=>{for(var t in r)d(e,t,{get:r[t],enumerable:!0})},m=(e,r,t,n)=>{if(r&&typeof r=="object"||typeof r=="function")for(let o of T(r))!w.call(e,o)&&o!==t&&d(e,o,{get:()=>r[o],enumerable:!(n=E(r,o))||n.enumerable});return e};var q=(e,r,t)=>(t=e!=null?R(j(e)):{},m(r||!e||!e.__esModule?d(t,"default",{value:e,enumerable:!0}):t,e)),x=e=>m(d({},"__esModule",{value:!0}),e);var S={};O(S,{CheckFieldRequired:()=>b,ErrorResponse:()=>h,LoadConfig:()=>$,SuccessResponse:()=>p,default:()=>_});module.exports=x(S);var f=require("fs"),g=q(require("yaml"));function y(e,r,t=200,n){let c=Object.assign({code:t,data:r,msg:n||"\u6210\u529F"});e.send(c)}function h(e,r,t=500){console.error("[ERROR] STACK_INFO",r);let n=r?.message||"\u670D\u52A1\u5F02\u5E38",o=/^(\[[\d]*\])/,u=n&&n.match(o)&&n.replace(/^(\[[\d]*\]\-)/,"")||n;y(e,null,t,u)}function p(e,r,t){y(e,r,200,t)}var A=e=>{try{if(!(0,f.existsSync)(e))throw Error(`The configuration file does not exist. [${e}]`);let r=(0,f.readFileSync)(e,"utf8");return g.default.parse(r)}catch(r){throw console.error(r),Error()}},$=e=>{try{if(console.info("[INFO] config path::",e),!(0,f.existsSync)(e))throw Error(`The configuration file does not exist. [${e}]`);let r=A(e);if(!r)return;let t=Array.isArray(r),n=o=>{Object.keys(o)?.forEach(u=>{let s=o[u];global[u]=Array.isArray(s)?s.reduce((a,l)=>Object.assign(a,l),{}):s})};t?r.forEach(n):n(r)}catch(r){throw console.error(r),Error("LOAD_CONFIG_PARAM_ERROR")}},b=(e,r,t)=>{if(e==null)throw Error("The data is required.");if(r==null)throw Error("The config is required.");let o={...{required:"The field [${key}] is required.",array:"The field [${key}] must be an array with at least one element.",object:"The field [${key}] must be an object."},...t},c=(s,a)=>s.replace(/\$\{key\}/g,a);Object.keys(r).forEach(s=>{let a=r[s].required;if(!a)return;let l=r[s].type,i=e[s];if(i==null)throw Error(c(o.required,s));if(l==="array"&&(!Array.isArray(i)||i.length===0))throw Error(c(o.array,s));if(l==="object"&&(Object.prototype.toString.call(i)!=="[object Object]"||Object.keys(i).length===0))throw Error(c(o.object,s));if(l==="string"){if(typeof i!="string")throw Error(`The field [${s}] must be a string.`);if(a&&i.trim()==="")throw Error(c(o.required,s))}if(l==="number"&&typeof i!="number")throw Error(`The field [${s}] must be a number.`)})},_={ErrorResponse:h,SuccessResponse:p,CheckFieldRequired:b};0&&(module.exports={CheckFieldRequired,ErrorResponse,LoadConfig,SuccessResponse});
1
+ "use strict";var R=Object.create;var y=Object.defineProperty;var T=Object.getOwnPropertyDescriptor;var j=Object.getOwnPropertyNames;var O=Object.getPrototypeOf,x=Object.prototype.hasOwnProperty;var E=(r,e)=>{for(var t in e)y(r,t,{get:e[t],enumerable:!0})},g=(r,e,t,o)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of j(e))!x.call(r,s)&&s!==t&&y(r,s,{get:()=>e[s],enumerable:!(o=T(e,s))||o.enumerable});return r};var q=(r,e,t)=>(t=r!=null?R(O(r)):{},g(e||!r||!r.__esModule?y(t,"default",{value:r,enumerable:!0}):t,r)),A=r=>g(y({},"__esModule",{value:!0}),r);var F={};E(F,{CheckFieldRequired:()=>w,ErrorResponse:()=>h,LoadConfig:()=>_,SuccessResponse:()=>b,default:()=>S});module.exports=A(F);var d=require("fs"),m=q(require("yaml"));function p(r,e,t=200,o){let i=Object.assign({code:t,data:e,msg:o||"\u6210\u529F"});r.status(t).send(i)}var c=class extends Error{};function h(r,e,t=500){console.error("[ERROR] STACK_INFO",e);let o=typeof e?.message=="string"?e.message:"",s=o.match(/^\[(4\d\d)\]-/),i=t===500&&e instanceof c?400:t===500&&s?Number(s[1]):t,f=i<500?o.replace(/^\[4\d\d\]-/,"")||"\u8BF7\u6C42\u5931\u8D25":"\u670D\u52A1\u5F02\u5E38";p(r,null,i,f)}function b(r,e,t){p(r,e,200,t)}var $=r=>{try{if(!(0,d.existsSync)(r))throw Error(`The configuration file does not exist. [${r}]`);let e=(0,d.readFileSync)(r,"utf8");return m.default.parse(e)}catch(e){throw console.error(e),Error()}},_=r=>{try{if(console.info("[INFO] config path::",r),!(0,d.existsSync)(r))throw Error(`The configuration file does not exist. [${r}]`);let e=$(r);if(!e)return;let t=Array.isArray(e),o=s=>{Object.keys(s)?.forEach(f=>{let n=s[f];global[f]=Array.isArray(n)?n.reduce((l,u)=>Object.assign(l,u),{}):n})};t?e.forEach(o):o(e)}catch(e){throw console.error(e),Error("LOAD_CONFIG_PARAM_ERROR")}},w=(r,e,t)=>{if(r==null)throw new c("The data is required.");if(e==null)throw Error("The config is required.");let s={...{required:"The field [${key}] is required.",array:"The field [${key}] must be an array with at least one element.",object:"The field [${key}] must be an object."},...t},i=(n,l)=>n.replace(/\$\{key\}/g,l);Object.keys(e).forEach(n=>{let l=e[n].required;if(!l)return;let u=e[n].type,a=r[n];if(a==null)throw new c(i(s.required,n));if(u==="array"&&(!Array.isArray(a)||a.length===0))throw new c(i(s.array,n));if(u==="object"&&(Object.prototype.toString.call(a)!=="[object Object]"||Object.keys(a).length===0))throw new c(i(s.object,n));if(u==="string"){if(typeof a!="string")throw new c(`The field [${n}] must be a string.`);if(l&&a.trim()==="")throw new c(i(s.required,n))}if(u==="number"&&typeof a!="number")throw new c(`The field [${n}] must be a number.`)})},S={ErrorResponse:h,SuccessResponse:b,CheckFieldRequired:w};0&&(module.exports={CheckFieldRequired,ErrorResponse,LoadConfig,SuccessResponse});
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aicblock/nserve",
3
- "version": "1.0.4",
3
+ "version": "1.0.8",
4
4
  "description": "🛠️ Description NodeJS Server-side development CLI",
5
5
  "main": "lib/index.js",
6
6
  "scripts": {
@@ -34,8 +34,10 @@
34
34
  "@types/jest": "^29.5.12",
35
35
  "@types/js-yaml": "^4.0.9",
36
36
  "@types/node": "^16.4.10",
37
+ "fs-extra": "^11.3.3",
37
38
  "husky": "9.0.11",
38
39
  "jest": "29.7.0",
40
+ "prompts": "^2.4.2",
39
41
  "ts-jest": "29.1.5",
40
42
  "ts-node": "^10.9.2",
41
43
  "typescript": "5.5.3"
@@ -46,7 +48,7 @@
46
48
  }
47
49
  },
48
50
  "dependencies": {
49
- "@aicblock/esql": "^2.0.0",
51
+ "@aicblock/esql": "2.0.2",
50
52
  "commander": "14.0.2",
51
53
  "esbuild": "0.27.2",
52
54
  "express": "5.2.1",