@aicblock/nserve 1.0.0 → 1.0.1

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,11 +4,15 @@
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
- #### Description
7
+ # NServe 用户使用文档
8
8
 
9
- 🛠️ Description NodeJS Server-side development CLI
9
+ ## 1. 项目简介
10
10
 
11
- #### 快速搭建第一个 Nserve 项目
11
+ NServe 是一个 Node.js 服务器端开发 CLI 工具,旨在简化 Node.js 服务器应用的开发、构建和部署流程。它提供了代码生成、热重载开发服务器和项目构建等功能,帮助开发者快速搭建和维护 Node.js 服务器应用。
12
+
13
+ ## 2. 快速开始
14
+
15
+ 您可以使用以下命令创建一个新的 NServe 项目:
12
16
 
13
17
  #### 使用 NPM:
14
18
 
@@ -25,5 +29,302 @@ $ yarn create nserve@latest
25
29
  #### 使用 PNPM:
26
30
 
27
31
  ```sh
28
- $ pnpm create nserve@latest
32
+ $ pnpm create nserve@latest
33
+ ```
34
+
35
+ ## 3. 核心功能
36
+
37
+ ### 3.1 命令行接口
38
+
39
+ NServe 提供了三个主要命令:
40
+
41
+ - `nserve serve` - 启动开发服务器
42
+ - `nserve build` - 构建项目
43
+ - `nserve gen` - 根据配置文件生成代码
44
+
45
+ ### 3.2 代码生成
46
+
47
+ - **路由生成**:根据配置文件自动生成 Express 路由
48
+ - **模型生成**:从 SQL CREATE TABLE 语句生成数据模型
49
+
50
+ ### 3.3 开发服务器
51
+
52
+ - 支持 TypeScript 实时编译
53
+ - 热重载功能
54
+ - 支持环境变量配置
55
+
56
+ ### 3.4 项目构建
57
+
58
+ - 使用 esbuild 进行快速构建
59
+ - 支持生产环境优化
60
+ - 生成可执行的 JavaScript 代码
61
+
62
+ ## 4. 配置文件
63
+
64
+ ### 4.1 基本配置
65
+
66
+ 在项目根目录创建 `nserve.config.ts` 文件:
67
+
68
+ ```typescript
69
+ import { DefineNserveConfig } from '@aicblock/nserve'
70
+
71
+ export default DefineNserveConfig({
72
+ entry: 'app.ts', // 应用入口文件
73
+ outputDir: 'dist', // 构建输出目录
74
+ sourceDir: 'src', // 源代码目录
75
+ testing: false, // 是否为测试模式
76
+ yamlConfig: {}, // YAML 配置文件内容
77
+ plugins: [], // 自定义插件
78
+ external: [], // 外部依赖
79
+ generateConfig: {
80
+ genDir: 'nserve-config', // 生成配置目录
81
+ routerDir: 'router', // 路由配置目录
82
+ modelDir: 'model', // 模型配置目录
83
+ codePrettier: {
84
+ semi: false, // 是否使用分号
85
+ singleQuote: true, // 是否使用单引号
86
+ trailingComma: 'none' // 尾随逗号配置
87
+ },
88
+ middleware: {} // 中间件配置
89
+ }
90
+ })
91
+ ```
92
+
93
+ ### 4.2 路由配置
94
+
95
+ 在 `nserve-config/router` 目录下创建路由配置文件,例如 `user.ts`:
96
+
97
+ ```typescript
98
+ import { DefineGenRouter } from '@aicblock/nserve'
99
+
100
+ export default DefineGenRouter({
101
+ servicePath: '/api/user', // 路由前缀
102
+ serviceHandler: 'user', // 处理逻辑目录
103
+ routers: [
104
+ {
105
+ path: '/list', // 路由路径
106
+ method: 'GET', // HTTP 方法
107
+ name: 'list', // 处理函数名
108
+ middleware: [] // 路由级中间件
109
+ },
110
+ {
111
+ path: '/create',
112
+ method: 'POST',
113
+ name: 'create',
114
+ session: {
115
+ /* session 配置 */
116
+ }
117
+ }
118
+ ],
119
+ middleware: ['auth'] // 全局中间件
120
+ })
121
+ ```
122
+
123
+ ### 4.3 模型配置
124
+
125
+ 在 `nserve-config/model` 目录下创建 SQL 文件,例如 `user.sql`:
126
+
127
+ ```sql
128
+ CREATE TABLE `user` (
129
+ `id` INT PRIMARY KEY AUTO_INCREMENT COMMENT '用户ID',
130
+ `username` VARCHAR(50) NOT NULL UNIQUE COMMENT '用户名',
131
+ `password` VARCHAR(255) NOT NULL COMMENT '密码',
132
+ `email` VARCHAR(100) NOT NULL UNIQUE COMMENT '邮箱',
133
+ `created_at` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间'
134
+ ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
135
+ ```
136
+
137
+ ## 5. 命令使用
138
+
139
+ ### 5.1 启动开发服务器
140
+
141
+ ```bash
142
+ nserve serve
143
+ ```
144
+
145
+ 选项:
146
+
147
+ - `--mode <mode>` - 指定运行模式(development/production)
148
+ - `--config <path>` - 指定配置文件路径
149
+
150
+ ### 5.2 构建项目
151
+
152
+ ```bash
153
+ nserve build
154
+ ```
155
+
156
+ 选项:
157
+
158
+ - `--mode <mode>` - 指定构建模式(development/production)
159
+ - `--config <path>` - 指定配置文件路径
160
+
161
+ ### 5.3 生成代码
162
+
163
+ ```bash
164
+ nserve gen
165
+ ```
166
+
167
+ 选项:
168
+
169
+ - `--config <path>` - 指定配置文件路径
170
+
171
+ ## 6. 项目结构
172
+
173
+ ```
174
+ project/
175
+ ├── src/ # 源代码目录
176
+ │ ├── handler/ # 路由处理器
177
+ │ ├── logic/ # 业务逻辑
178
+ │ ├── model/ # 数据模型
179
+ │ └── app.ts # 应用入口
180
+ ├── nserve-config/ # 生成配置目录
181
+ │ ├── router/ # 路由配置
182
+ │ └── model/ # 模型 SQL 文件
183
+ ├── nserve.config.ts # NServe 配置文件
184
+ └── package.json # 项目配置
185
+ └── tsconfig.json # TypeScript 配置文件
29
186
  ```
187
+
188
+ ## 7. 路由生成流程
189
+
190
+ 1. 创建路由配置文件 `nserve-config/router/*.ts`
191
+ 2. 运行 `nserve gen` 命令
192
+ 3. NServe 会自动生成:
193
+ - 路由处理器文件 `src/handler/*.handler.ts`
194
+ - 业务逻辑模板文件 `src/logic/*/*.logic.ts`
195
+ - 路由注册文件 `src/handler/router.ts`
196
+
197
+ ## 8. 模型生成流程
198
+
199
+ 1. 创建 SQL 文件 `nserve-config/model/*.sql`
200
+ 2. 运行 `nserve gen` 命令
201
+ 3. NServe 会自动生成:
202
+ - 数据模型文件 `src/model/*.ts`
203
+ - 模型索引文件 `src/model/index.ts`
204
+
205
+ ## 9. 环境变量
206
+
207
+ NServe 支持 `.env` 文件和环境特定的配置文件(如 `.env.development`、`.env.production`)。
208
+
209
+ 示例 `.env` 文件:
210
+
211
+ ```
212
+ # yamlConfig 配置
213
+ YAML_CONFIG.APP_CONFIG.PORT=3000
214
+ YAML_CONFIG.MYSQL_CONF.host=localhost
215
+ YAML_CONFIG.MYSQL_CONF.port=3306
216
+ YAML_CONFIG.MYSQL_CONF.user=root
217
+ YAML_CONFIG.MYSQL_CONF.password=password
218
+ YAML_CONFIG.MYSQL_CONF.database=test
219
+
220
+ # NServe 配置
221
+ AICBLOCK_NSERVE_APP_ENTRY=app.ts
222
+ ```
223
+
224
+ ## 10. 中间件配置
225
+
226
+ 在 `nserve.config.ts` 中配置全局中间件:
227
+
228
+ ```typescript
229
+ export default DefineNserveConfig({
230
+ generateConfig: {
231
+ middleware: {
232
+ auth: {
233
+ libName: '@/middleware/auth',
234
+ funcName: 'authMiddleware'
235
+ }
236
+ }
237
+ }
238
+ })
239
+ ```
240
+
241
+ 在路由配置中使用中间件:
242
+
243
+ ```typescript
244
+ export default DefineGenRouter({
245
+ routers: [
246
+ {
247
+ path: '/protected',
248
+ method: 'GET',
249
+ name: 'protected',
250
+ middleware: ['auth']
251
+ }
252
+ ]
253
+ })
254
+ ```
255
+
256
+ ## 11. 高级功能
257
+
258
+ ### 11.1 自定义插件
259
+
260
+ NServe 支持自定义 esbuild 插件:
261
+
262
+ ```typescript
263
+ export default DefineNserveConfig({
264
+ plugins: [
265
+ {
266
+ name: 'custom-plugin',
267
+ setup(build) {
268
+ // 插件逻辑
269
+ }
270
+ }
271
+ ]
272
+ })
273
+ ```
274
+
275
+ ### 11.2 类型定义
276
+
277
+ NServe 提供了完整的 TypeScript 类型定义,可以在项目中直接使用:
278
+
279
+ ```typescript
280
+ import type { Config, DefineGenRouterConfig } from '@aicblock/nserve'
281
+ ```
282
+
283
+ ## 12. 最佳实践
284
+
285
+ ### 12.1 项目组织
286
+
287
+ - 将路由和业务逻辑分离
288
+ - 使用模型层抽象数据库操作
289
+ - 为不同功能模块创建独立的路由配置文件
290
+
291
+ ### 12.2 开发流程
292
+
293
+ 1. 创建项目结构
294
+ 2. 配置 `nserve.config.ts`
295
+ 3. 编写路由配置文件
296
+ 4. 编写 SQL 模型文件
297
+ 5. 运行 `nserve gen` 生成代码框架
298
+ 6. 实现业务逻辑
299
+ 7. 使用 `nserve serve` 启动开发服务器进行测试
300
+ 8. 使用 `nserve build` 构建生产版本
301
+
302
+ ## 13. 常见问题
303
+
304
+ ### 13.1 端口被占用
305
+
306
+ 如果开发服务器端口被占用,可以在 `.env` 文件中修改 PORT 配置:
307
+
308
+ ```
309
+ PORT=3001
310
+ ```
311
+
312
+ ### 13.2 热重载不生效
313
+
314
+ 确保:
315
+
316
+ - 源代码目录配置正确
317
+ - 入口文件存在且配置正确
318
+ - 没有语法错误
319
+
320
+ ### 13.3 构建失败
321
+
322
+ 检查:
323
+
324
+ - TypeScript 语法错误
325
+ - 依赖是否安装正确
326
+ - 配置文件是否正确
327
+
328
+ ## 15. 贡献
329
+
330
+ 欢迎提交 Issue 和 Pull Request 来改进 NServe。
package/lib/commander.js CHANGED
@@ -1,2 +1,2 @@
1
1
  #!/usr/bin/env node
2
- "use strict";var f=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?f(y(e)):{},b(n||!e||!e.__esModule?l(t,"default",{value:e,enumerable:!0}):t,e));var S=require("esbuild");var R=O(require("js-yaml"));function i(e,n="INFO"){let t=(d,u="green")=>`\x1B[${{green:"32m",red:"31m",blue:"34m",orange:"30m"}[u]}${d}\x1B[0m`,r={INFO:"blue",WARNING:"orange",ERROR:"red",SUCCESS:"green"}[n],p=t(n,r);console.log(`[${p}] - ${e}`)}var a=require("./runtime"),o=require("commander"),c=process.argv;c[2]===void 0&&c.push("serve");o.program.version("1.0.0");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 S=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.1");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);
package/lib/core/run.js CHANGED
@@ -1 +1 @@
1
- "use strict";var K=Object.create;var O=Object.defineProperty;var V=Object.getOwnPropertyDescriptor;var k=Object.getOwnPropertyNames;var W=Object.getPrototypeOf,B=Object.prototype.hasOwnProperty;var U=(e,t)=>{for(var r in t)O(e,r,{get:t[r],enumerable:!0})},I=(e,t,r,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of k(t))!B.call(e,n)&&n!==r&&O(e,n,{get:()=>t[n],enumerable:!(o=V(t,n))||o.enumerable});return e};var v=(e,t,r)=>(r=e!=null?K(W(e)):{},I(t||!e||!e.__esModule?O(r,"default",{value:e,enumerable:!0}):r,e)),G=e=>I(O({},"__esModule",{value:!0}),e);var Q={};U(Q,{getRunVMData:()=>L});module.exports=G(Q);var S=require("esbuild");var q=require("esbuild"),i=require("fs"),E=require("path");var P=v(require("js-yaml"));function R(e,t="INFO"){let r=(c,s="green")=>`\x1B[${{green:"32m",red:"31m",blue:"34m",orange:"30m"}[s]}${c}\x1B[0m`,n={INFO:"blue",WARNING:"orange",ERROR:"red",SUCCESS:"green"}[t],l=r(t,n);console.log(`[${l}] - ${e}`)}function T(e){let t=(r,o)=>{try{let n=(0,i.readdirSync)(r);if(n.length===0){(0,i.rmdirSync)(r),o&&o();return}let l=n.length,c=0,s=f=>{f===l&&((0,i.rmdirSync)(r),o&&o())};n.forEach(f=>{let a=(0,E.join)(r,f);if((0,i.statSync)(a).isDirectory()){t(a,()=>{s(c+=1)});return}(0,i.unlinkSync)(a),s(c+=1)})}catch(n){o&&o(n)}};return new Promise((r,o)=>{if(!e||!(0,i.existsSync)(e)){r();return}if(!(0,i.statSync)(e).isDirectory()){o("The directory path to be deleted is not a directory path");return}t(e,n=>{n?o(n):r()})})}async function N(e,t,r={}){let{createDir:o=!0,indent:n=2,noRefs:l=!0,lineWidth:c=80,skipInvalid:s=!1,quotingType:f='"',forceQuotes:a=!1,encoding:g="utf8",...h}=r;try{let d;if(typeof e=="string")try{d=JSON.parse(e)}catch(y){throw new Error(`\u65E0\u6548\u7684 JSON \u5B57\u7B26\u4E32: ${y instanceof Error?y.message:String(y)}`)}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=P.default.dump(d,{indent:n,noRefs:l,skipInvalid:s,lineWidth:c,quotingType:f,forceQuotes:a,...h,styles:{"!!null":"canonical",...h.styles}});if(o){let y=(0,E.dirname)(t);try{(0,i.accessSync)(y)}catch{(0,i.mkdirSync)(y,{recursive:!0}),console.log(`\u5DF2\u521B\u5EFA\u76EE\u5F55: ${y}`)}}(0,i.writeFileSync)(t,u,{encoding:g});let b=Buffer.byteLength(u,g);return console.log(`YAML \u6587\u4EF6\u5DF2\u6210\u529F\u751F\u6210: ${t}`),console.log(`\u6587\u4EF6\u5927\u5C0F: ${b} \u5B57\u8282`),{content:u,filePath:t,fileSize:b}}catch(d){throw console.error("\u8F6C\u6362\u6216\u4FDD\u5B58\u5931\u8D25:",d instanceof Error?d.message:String(d)),d}}var p=require("path"),j=v(require("os")),m=require("fs"),C=require("child_process"),w=v(require("vm"));function L(e){try{let t=process.env.AICBLOCK_NSERVE_RUN_CWD,r=(0,m.readFileSync)(e,"utf-8"),o=(0,S.transformSync)(r,{format:"cjs",loader:"ts"}),n={module:{paths:[(0,p.join)(t,"node_modules")],exports:{default:void 0}},require,__dirname:t,global,__filename:e,process},l=new w.default.Script(o.code);return w.default.createContext(n),l.runInContext(n),n.module.exports.default||n.module.exports}catch(t){console.error(t),process.exit(0)}}function A(e,t){let r=Date.now(),o=()=>`${Date.now()-r}ms`;try{(0,S.build)(e).then(({errors:n})=>{if(n.length===0){t&&t(),R(`Compile successfully.[${o()}]`,"SUCCESS");return}R(JSON.stringify(n),"ERROR")})}catch(n){R(JSON.stringify(n),"ERROR")}}var M=e=>{let t=e.compilerOptions?.paths||{},r=Object.keys(t);return{name:"alias",setup(o){o.onLoad({filter:/\.ts$/},async n=>{let l=await m.promises.readFile(n.path,"utf8"),c="ts";if(r.length===0)return{contents:l,loader:c};let s=l;return r.forEach(a=>{let g=a.replace(/\*$/,""),h=new RegExp(`from[\\s]{1,}[\\'\\"]${g}((?!\\n[\\'\\"]).)*[\\'\\"]`,"g"),d=(t[a]&&t[a][0]).replace(/\*$/,"");s.replace(h,u=>`from '${u.replace("from","").replace(/['"]/g,"")}'`)}),{contents:s,loader:c}})}}};function Y(e){return new Promise(t=>{let r;j.default.type().startsWith("Windows")?r=`tasklist /FI "PID eq ${e}" /NH`:r=`kill -0 ${e} 2>/dev/null`,(0,C.exec)(r,(o,n,l)=>{o?t(!1):j.default.type().startsWith("Windows")?t(n.includes(e.toString())):t(l==="")})})}var z=(e,t,r,o)=>{let n=()=>{let c=process.platform==="win32"?"node.cmd":"node";return(0,C.spawnSync)(c,[e],{stdio:"inherit",cwd:r}).pid};(0,m.watch)(t,{recursive:!0},(()=>{let c,s=n();return()=>{c&&clearTimeout(c),c=setTimeout(()=>{Y(s).then(f=>{try{f&&process.kill(s),o&&o().then(()=>s=n())}catch(a){R("Fial","ERROR"),console.log(a)}})},500)}})())},H=()=>{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),{entry:n,testing:l,outputDir:c,sourceDir:s,plugins:f,external:a,yamlConfig:g}=o;if(!s||!(0,m.existsSync)((0,p.join)(e,s)))throw Error("[ERROR] The compilation directory is not configured or does not exist");let h=(0,p.join)(e,s,n);if((!n||typeof n!="string"||!(0,m.existsSync)(h))&&r==="serve")throw Error(`[ERROR] The run file does not exist. Please check the config:[${h}]`);let d=!l,u=(0,p.join)(e,c||"dist");r==="build"&&(0,m.existsSync)(u)&&T(u);let b=(0,p.join)(e,"tsconfig.json"),y=(0,m.readFileSync)(b,"utf-8"),$=JSON.parse(y),_={entryPoints:[h],minify:d,outdir:u,plugins:[M($),...f||[]],bundle:!0,platform:"node",format:"cjs",external:a},F=()=>new Promise(x=>{A(_,()=>{g&&N(g,(0,p.join)(u,"config.yaml")),x(void 0)})});A(_,()=>{if(r==="build"||!n)return;g&&N(g,(0,p.join)(u,"config.yaml"));let x=(0,p.basename)(n),D=x.substring(0,x.length-3)+".js",J=(0,p.join)(u,D);z(J,(0,p.join)(e,s||"src"),u,F)})}catch(e){console.error("[ERROR_STACK]",e);let t=e?.message||"[FN::esbuild::exec]";R(t,"ERROR"),process.exit(0)}};H();0&&(module.exports={getRunVMData});
1
+ "use strict";var J=Object.create;var _=Object.defineProperty;var K=Object.getOwnPropertyDescriptor;var k=Object.getOwnPropertyNames;var G=Object.getPrototypeOf,W=Object.prototype.hasOwnProperty;var B=(t,n,r,o)=>{if(n&&typeof n=="object"||typeof n=="function")for(let e of k(n))!W.call(t,e)&&e!==r&&_(t,e,{get:()=>n[e],enumerable:!(o=K(n,e))||o.enumerable});return t};var S=(t,n,r)=>(r=t!=null?J(G(t)):{},B(n||!t||!t.__esModule?_(r,"default",{value:t,enumerable:!0}):r,t));var T=require("esbuild");var I=require("esbuild"),s=require("fs"),b=require("path"),C=S(require("vm")),L=S(require("js-yaml"));function R(t,n="INFO"){let r=(c,i="green")=>`\x1B[${{green:"32m",red:"31m",blue:"34m",orange:"30m"}[i]}${c}\x1B[0m`,e={INFO:"blue",WARNING:"orange",ERROR:"red",SUCCESS:"green"}[n],l=r(n,e);console.log(`[${l}] - ${t}`)}function P(t){let n=(r,o)=>{try{let e=(0,s.readdirSync)(r);if(e.length===0){(0,s.rmdirSync)(r),o&&o();return}let l=e.length,c=0,i=f=>{f===l&&((0,s.rmdirSync)(r),o&&o())};e.forEach(f=>{let a=(0,b.join)(r,f);if((0,s.statSync)(a).isDirectory()){n(a,()=>{i(c+=1)});return}(0,s.unlinkSync)(a),i(c+=1)})}catch(e){o&&o(e)}};return new Promise((r,o)=>{if(!t||!(0,s.existsSync)(t)){r();return}if(!(0,s.statSync)(t).isDirectory()){o("The directory path to be deleted is not a directory path");return}n(t,e=>{e?o(e):r()})})}function w(t,n){try{let r=(0,s.readFileSync)(t,"utf-8"),o=(0,I.transformSync)(r,{format:"cjs",loader:"ts",platform:"node",target:"node18"}),e={module:{paths:[(0,b.join)(n,"node_modules")],exports:{default:void 0}},require,__dirname:n,global,__filename,process},l=new C.default.Script(o.code);return C.default.createContext(e),l.runInContext(e),e.module.exports.default||e.module.exports}catch(r){console.error(r),process.exit(0)}}async function v(t,n,r={}){let{createDir:o=!0,indent:e=2,noRefs:l=!0,lineWidth:c=80,skipInvalid:i=!1,quotingType:f='"',forceQuotes:a=!1,encoding:g="utf8",...h}=r;try{let p;if(typeof t=="string")try{p=JSON.parse(t)}catch(y){throw new Error(`\u65E0\u6548\u7684 JSON \u5B57\u7B26\u4E32: ${y instanceof Error?y.message:String(y)}`)}else if(typeof t=="object"&&t!==null)p=t;else throw new Error("jsonData \u5FC5\u987B\u662F\u6709\u6548\u7684 JSON \u5B57\u7B26\u4E32\u3001\u5BF9\u8C61\u6216\u6570\u7EC4");let u=L.default.dump(p,{indent:e,noRefs:l,skipInvalid:i,lineWidth:c,quotingType:f,forceQuotes:a,...h,styles:{"!!null":"canonical",...h.styles}});if(o){let y=(0,b.dirname)(n);try{(0,s.accessSync)(y)}catch{(0,s.mkdirSync)(y,{recursive:!0}),console.log(`\u5DF2\u521B\u5EFA\u76EE\u5F55: ${y}`)}}(0,s.writeFileSync)(n,u,{encoding:g});let O=Buffer.byteLength(u,g);return console.log(`YAML \u6587\u4EF6\u5DF2\u6210\u529F\u751F\u6210: ${n}`),console.log(`\u6587\u4EF6\u5927\u5C0F: ${O} \u5B57\u8282`),{content:u,filePath:n,fileSize:O}}catch(p){throw console.error("\u8F6C\u6362\u6216\u4FDD\u5B58\u5931\u8D25:",p instanceof Error?p.message:String(p)),p}}var d=require("path"),N=S(require("os")),m=require("fs"),x=require("child_process");function A(t,n){let r=Date.now(),o=()=>`${Date.now()-r}ms`;try{(0,T.build)(t).then(({errors:e})=>{if(e.length===0){n&&n(),R(`Compile successfully.[${o()}]`,"SUCCESS");return}R(JSON.stringify(e),"ERROR")})}catch(e){R(JSON.stringify(e),"ERROR")}}var U=t=>{let n=t.compilerOptions?.paths||{},r=Object.keys(n);return{name:"alias",setup(o){o.onLoad({filter:/\.ts$/},async e=>{let l=await m.promises.readFile(e.path,"utf8"),c="ts";if(r.length===0)return{contents:l,loader:c};let i=l;return r.forEach(a=>{let g=a.replace(/\*$/,""),h=new RegExp(`from[\\s]{1,}[\\'\\"]${g}((?!\\n[\\'\\"]).)*[\\'\\"]`,"g"),p=(n[a]&&n[a][0]).replace(/\*$/,"");i.replace(h,u=>`from '${u.replace("from","").replace(/['"]/g,"")}'`)}),{contents:i,loader:c}})}}};function Y(t){return new Promise(n=>{let r;N.default.type().startsWith("Windows")?r=`tasklist /FI "PID eq ${t}" /NH`:r=`kill -0 ${t} 2>/dev/null`,(0,x.exec)(r,(o,e,l)=>{o?n(!1):N.default.type().startsWith("Windows")?n(e.includes(t.toString())):n(l==="")})})}var M=(t,n,r,o)=>{let e=()=>{let c=process.platform==="win32"?"node.cmd":"node";return(0,x.spawnSync)(c,[t],{stdio:"inherit",cwd:r}).pid};(0,m.watch)(n,{recursive:!0},(()=>{let c,i=e();return()=>{c&&clearTimeout(c),c=setTimeout(()=>{Y(i).then(f=>{try{f&&process.kill(i),o&&o().then(()=>i=e())}catch(a){R("Fial","ERROR"),console.log(a)}})},500)}})())},q=()=>{try{let t=process.env.AICBLOCK_NSERVE_RUN_CWD,n=process.env.AICBLOCK_NSERVE_RUN_CONFIG_PATH,r=process.env.AICBLOCK_NSERVE_RUN_MODE,o=w(n,process.env.AICBLOCK_NSERVE_RUN_CWD),{entry:e,testing:l,outputDir:c,sourceDir:i,plugins:f,external:a,yamlConfig:g}=o;if(!i||!(0,m.existsSync)((0,d.join)(t,i)))throw Error("[ERROR] The compilation directory is not configured or does not exist");let h=(0,d.join)(t,i,e);if((!e||typeof e!="string"||!(0,m.existsSync)(h))&&r==="serve")throw Error(`[ERROR] The run file does not exist. Please check the config:[${h}]`);let p=!l,u=(0,d.join)(t,c||"dist");r==="build"&&(0,m.existsSync)(u)&&P(u);let O=(0,d.join)(t,"tsconfig.json"),y=(0,m.readFileSync)(O,"utf-8"),F=JSON.parse(y),j={entryPoints:[h],minify:p,outdir:u,plugins:[U(F),...f||[]],bundle:!0,platform:"node",format:"cjs",external:a},$=()=>new Promise(E=>{A(j,()=>{g&&v(g,(0,d.join)(u,"config.yaml")),E(void 0)})});A(j,()=>{if(g&&v(g,(0,d.join)(u,"config.yaml")),r==="build"||!e)return;let E=(0,d.basename)(e),D=E.substring(0,E.length-3)+".js",V=(0,d.join)(u,D);M(V,(0,d.join)(t,i||"src"),u,$)})}catch(t){console.error("[ERROR_STACK]",t);let n=t?.message||"[FN::esbuild::exec]";R(n,"ERROR"),process.exit(0)}};q();
package/lib/index.d.ts CHANGED
@@ -10,6 +10,7 @@ export declare const DefineGenRouter: (param: DefineGenRouterConfig) => {
10
10
  handler: string;
11
11
  })[];
12
12
  handler: string;
13
+ middleware: string | string[] | undefined;
13
14
  };
14
15
  declare const _default: {
15
16
  DefineNserveConfig: typeof DefineNserveConfig;
@@ -19,10 +20,28 @@ declare const _default: {
19
20
  handler: string;
20
21
  })[];
21
22
  handler: string;
23
+ middleware: string | string[] | undefined;
22
24
  };
23
25
  };
24
26
  export default _default;
25
27
 
28
+ interface CodePrettierConfigOption {
29
+ /**
30
+ * 是否添加分号
31
+ * Whether to add semicolons
32
+ */
33
+ semi?: boolean
34
+ /**
35
+ * 是否使用单引号
36
+ * Whether to use single quotes
37
+ */
38
+ singleQuote?: boolean
39
+ /**
40
+ * 是否使用尾逗号
41
+ * Whether to use trailing commas
42
+ */
43
+ trailingComma?: 'none' | 'es5' | 'all'
44
+ }
26
45
  interface MiddlewareConfigOption {
27
46
  /**
28
47
  * 中间件库名
@@ -33,7 +52,7 @@ interface MiddlewareConfigOption {
33
52
  * 中间件函数名
34
53
  * Middleware function name
35
54
  */
36
- funcName: string
55
+ funcName?: string
37
56
  /**
38
57
  * 是否为 AMD 模块
39
58
  * Whether it is an AMD module
@@ -66,7 +85,12 @@ interface GenerateConfigOption {
66
85
  * 中间件配置
67
86
  * Middleware configuration
68
87
  */
69
- middleware?: MiddlewareConfigOption[]
88
+ middleware?: Record<string, MiddlewareConfigOption>
89
+ /**
90
+ * 代码格式化配置
91
+ * Code prettier configuration
92
+ */
93
+ codePrettier?: CodePrettierConfigOption
70
94
  }
71
95
  interface Config {
72
96
  /**
@@ -134,22 +158,40 @@ type RouterMethod =
134
158
  | 'CONNECT'
135
159
  | 'TRACE'
136
160
 
161
+ // 数据类型属性定义
162
+ type PropertyType = 'string' | 'number' | 'boolean' | 'object' | 'array'
163
+
137
164
  interface DataTypeProperty {
138
165
  // 数据类型
139
- type: 'string' | 'number' | 'boolean' | 'object' | 'array'
166
+ type?: PropertyType | { type: 'custom'; name: string }
140
167
  // 数据类型名称
141
- name: string
168
+ name?: string
142
169
  // 数据类型描述
143
170
  description?: string
144
171
  // 对象属性定义
145
- properties?: DataTypeProperty[]
146
- // 数组项类型定义
147
- item?: DataTypeProperty[]
172
+ properties?: Record<string, DataTypeProperty>
148
173
  }
149
- // 数据类型定义
150
- interface DataType {
174
+
175
+ // 泛型参数定义
176
+ interface GenericityParam {
177
+ name: string
178
+ typeParams: string[]
179
+ }
180
+
181
+ // 数据类型选项定义
182
+ interface DataTypeOption {
183
+ // 数据类型名称
151
184
  name: string
152
- properties: DataTypeProperty[]
185
+ // 数据类型
186
+ type?: PropertyType | string
187
+ // 数据类型描述
188
+ description?: string
189
+ // 数据类型属性定义
190
+ properties?: Record<string, DataTypeProperty>
191
+ // 数据类型继承
192
+ extends?: string | string[]
193
+ // 数据类型泛型定义
194
+ genericity?: string | GenericityParam
153
195
  }
154
196
 
155
197
  // 路由选项定义
@@ -163,9 +205,11 @@ interface RouterOption {
163
205
  // 路由文档备注
164
206
  docRemark?: string
165
207
  // 路由请求数据类型定义
166
- requestDataType?: IAnyObject
208
+ requestDataType?: DataTypeOption
167
209
  // 路由响应数据类型定义
168
- responseDataType?: IAnyObject
210
+ responseDataType?: DataTypeOption
211
+ // 路由中间件
212
+ middleware?: string | string[]
169
213
  }
170
214
 
171
215
  // 路由配置定义
@@ -173,6 +217,15 @@ interface DefineGenRouterConfig {
173
217
  servicePath: string
174
218
  serviceHandler: string
175
219
  routers: RouterOption[]
220
+ middleware?: string | string[]
221
+ }
222
+ type GenRouterConfigService = RouterOption & {
223
+ handler: string
224
+ }
225
+ interface GenRouterConfig {
226
+ prefix: string
227
+ handler: string
228
+ service: GenRouterConfigService[]
176
229
  }
177
230
 
178
231
  type EXEC_COMMAND = 'serve' | 'build' | 'gen'
package/lib/index.js CHANGED
@@ -1 +1,3 @@
1
- "use strict";var N=Object.create;var m=Object.defineProperty;var j=Object.getOwnPropertyDescriptor;var A=Object.getOwnPropertyNames;var L=Object.getPrototypeOf,I=Object.prototype.hasOwnProperty;var _=(e,t)=>{for(var r in t)m(e,r,{get:t[r],enumerable:!0})},b=(e,t,r,s)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of A(t))!I.call(e,n)&&n!==r&&m(e,n,{get:()=>t[n],enumerable:!(s=j(t,n))||s.enumerable});return e};var T=(e,t,r)=>(r=e!=null?N(L(e)):{},b(t||!e||!e.__esModule?m(r,"default",{value:e,enumerable:!0}):r,e)),D=e=>b(m({},"__esModule",{value:!0}),e);var J={};_(J,{DefineGenRouter:()=>C,DefineNserveConfig:()=>v,default:()=>G,nbuild:()=>F});module.exports=D(J);var h=require("esbuild");var w=require("esbuild"),l=require("fs"),y=require("path");var P=T(require("js-yaml"));function E(e,t="INFO"){let r=(o,p="green")=>`\x1B[${{green:"32m",red:"31m",blue:"34m",orange:"30m"}[p]}${o}\x1B[0m`,n={INFO:"blue",WARNING:"orange",ERROR:"red",SUCCESS:"green"}[t],i=r(t,n);console.log(`[${i}] - ${e}`)}function R(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 o={},p=Object.keys(n);return Object.keys(i).filter(c=>!p.includes(c)).forEach(c=>Object.assign(o,{[c]:i[c]})),Object.keys(n).forEach(c=>{let f=i[c],d=n[c];if(f!==void 0&&Object.prototype.toString.call(f)==="[object Object]"&&Object.prototype.toString.call(d)==="[object Object]"){Object.assign(o,{[c]:r(d,f)});return}Object.assign(o,{[c]:f!==void 0?f:d})}),o};return(Array.isArray(t)?t:[t]).reduce((n,i)=>r(n,i),e)}function B(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 V(e){let t={};return e.split(/(\r\n)|[\r\n]/).filter(s=>!K(s)).forEach(s=>{let n=s.split("="),i=(n[0]||"").trim(),o=(n[1]||"").trim();i.split("")[0]!=="#"&&i!==""&&(t[i]=o)}),t}function S(e,t){let r={},s={},n=(0,y.join)(e,".env"),i=process.env.AICBLOCK_NSERVE_RUN_ARGV||"[]",o=B(JSON.parse(i),"--mode"),u=(0,y.join)(e,`.env.${o!==void 0&&o||(t==="build"?"production":"development")}`),c={},f=[n,u],d=a=>{if(!(0,l.existsSync)(a))return;let g=(0,l.readFileSync)(a,"utf-8"),O=V(g);Object.assign(c,O)};return f.forEach(d),Object.keys(c).forEach(a=>{let g=c[a];if(a.indexOf("AICBLOCK_NSERVE_APP_")===0){r[a]=g;return}let O=t==="serve"?a.replace(/^(APPTEST_)/,""):a;s[O]=g}),{system:r,app:s}}var $=e=>{let{servicePath:t,serviceHandler:r,routers:s}=e,n=s.map(i=>{let{name:o}=i;return Object.assign(i,{handler:o})});return{prefix:t,service:n,handler:r}},x=$;var F={transformSync:h.transformSync,build:h.build};function v(e){try{let t=process.env.AICBLOCK_NSERVE_RUN_CWD,r=process.env.AICBLOCK_NSERVE_RUN_MODE,s={},n=S(t,r);n.system.AICBLOCK_NSERVE_APP_ENTRY&&Object.assign(s,{entry:n.system.AICBLOCK_NSERVE_APP_ENTRY});let i=p=>{let u=n.app&&n.app[p];process.env[p]=u};Object.keys(n.app||{}).forEach(i);let o=R({outputDir:"dist",entry:"app.ts",sourceDir:"src"},{...e,envs:n,...s});return o.lifecycleBefore&&typeof o.lifecycleBefore=="function"&&(o=R(o||{},o.lifecycleBefore(o)||{})),o}catch(t){E("defineNserveConfig fial::","ERROR"),console.error(t)}}var C=x,G={DefineNserveConfig:v,DefineGenRouter:C};0&&(module.exports={DefineGenRouter,DefineNserveConfig,nbuild});
1
+ "use strict";var T=Object.create;var h=Object.defineProperty;var P=Object.getOwnPropertyDescriptor;var w=Object.getOwnPropertyNames;var D=Object.getPrototypeOf,F=Object.prototype.hasOwnProperty;var G=(e,t)=>{for(var r in t)h(e,r,{get:t[r],enumerable:!0})},x=(e,t,r,s)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of w(t))!F.call(e,n)&&n!==r&&h(e,n,{get:()=>t[n],enumerable:!(s=P(t,n))||s.enumerable});return e};var V=(e,t,r)=>(r=e!=null?T(D(e)):{},x(t||!e||!e.__esModule?h(r,"default",{value:e,enumerable:!0}):r,e)),B=e=>x(h({},"__esModule",{value:!0}),e);var Q={};G(Q,{DefineGenRouter:()=>L,DefineNserveConfig:()=>j,default:()=>z,nbuild:()=>q});module.exports=B(Q);var b=require("esbuild");var K=require("esbuild"),f=require("fs"),m=require("path");var $=V(require("js-yaml"));function v(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 J(e){return e===void 0||e===""||e===null}function M(e){let t={};return e.split(/(\r\n)|[\r\n]/).filter(s=>!J(s)).forEach(s=>{let n=s.split("="),o=(n[0]||"").trim(),c=(n[1]||"").trim();o.split("")[0]!=="#"&&o!==""&&(t[o]=c)}),t}function k(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]=k(a):((!i[d]||typeof i[d]!="object")&&(i[d]={}),i=i[d])}}),s}function S(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 C=(0,m.join)(e,`.env.${a}.local`);(0,f.existsSync)(C)&&u.push(C);let R=[],_=g=>{if(!(0,f.existsSync)(g))return;let y=(0,f.readFileSync)(g,"utf-8"),E=M(y);R.push(y),Object.assign(i,E)};u.forEach(_);let A=["YAML_CONFIG."];return Object.keys(i).forEach(g=>{if(A.some(I=>g.indexOf(I)===0))return;let y=i[g];if(g.indexOf("AICBLOCK_NSERVE_APP_")===0){r[g]=y;return}let E=t==="serve"?g.replace(/^(APPTEST_)/,""):g;s[E]=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 q={transformSync:b.transformSync,build:b.build};function j(e){try{let t=process.env.AICBLOCK_NSERVE_RUN_CWD,r=process.env.AICBLOCK_NSERVE_RUN_MODE,s={},n=S(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){v("defineNserveConfig fial::","ERROR"),console.error(t)}}var L=N,z={DefineNserveConfig:j,DefineGenRouter:L};0&&(module.exports={DefineGenRouter,DefineNserveConfig,nbuild});
package/lib/runtime.js CHANGED
@@ -1,4 +1,16 @@
1
- "use strict";var ae=Object.create;var _=Object.defineProperty;var le=Object.getOwnPropertyDescriptor;var ue=Object.getOwnPropertyNames;var pe=Object.getPrototypeOf,fe=Object.prototype.hasOwnProperty;var me=(e,t)=>{for(var n in t)_(e,n,{get:t[n],enumerable:!0})},K=(e,t,n,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of ue(t))!fe.call(e,o)&&o!==n&&_(e,o,{get:()=>t[o],enumerable:!(r=le(t,o))||r.enumerable});return e};var q=(e,t,n)=>(n=e!=null?ae(pe(e)):{},K(t||!e||!e.__esModule?_(n,"default",{value:e,enumerable:!0}):n,e)),de=e=>K(_({},"__esModule",{value:!0}),e);var _e={};me(_e,{default:()=>Ie,execRun:()=>te});module.exports=de(_e);var I=require("path");var W=require("esbuild"),R=require("fs"),U=require("path"),D=q(require("vm")),ge=q(require("js-yaml"));function O(e,t="INFO"){let n=(i,s="green")=>`\x1B[${{green:"32m",red:"31m",blue:"34m",orange:"30m"}[s]}${i}\x1B[0m`,o={INFO:"blue",WARNING:"orange",ERROR:"red",SUCCESS:"green"}[t],a=n(t,o);console.log(`[${a}] - ${e}`)}function v(e,t){let n=e.findIndex(o=>o===t);if(n<0||e.length-1===n)return;let r=e[n+1];if(r.indexOf("--")!==0)return r}function L(e,t){try{let n=(0,R.readFileSync)(e,"utf-8"),r=(0,W.transformSync)(n,{format:"cjs",loader:"ts",platform:"node",target:"node18"}),o={module:{paths:[(0,U.join)(t,"node_modules")],exports:{default:void 0}},require,__dirname:t,global,__filename,process},a=new D.default.Script(r.code);return D.default.createContext(o),a.runInContext(o),o.module.exports.default||o.module.exports}catch(n){console.error(n),process.exit(0)}}var j=require("fs"),ee=require("child_process");var f=require("fs"),T=require("path");function k(e){return!e||typeof e!="string"?e:e.replace(/([A-Z])/g," $1").trim().split(/\s+/).join("-").toLowerCase()}function M(e){return!e||typeof e!="string"?e:e.charAt(0).toUpperCase()+e.slice(1)}var J=require("console"),he=(e,t,n,r="@")=>{let o=(0,T.join)(t,n,"handler"),a=(0,T.join)(t,n,"logic");!(0,f.existsSync)(o)&&(0,f.mkdirSync)(o,{recursive:!0}),!(0,f.existsSync)(a)&&(0,f.mkdirSync)(a,{recursive:!0});let i={genDir:"nserve-config",routerDir:"router",modelDir:"model"},{genDir:s,routerDir:p}=Object.assign({},i,e),g=(0,T.join)(t,s),u=(0,T.join)(g,p||"");if(!(0,f.existsSync)(u)){console.log("[ERROR] API\u63CF\u8FF0\u6587\u4EF6\u4E0D\u5B58\u5728::",u);return}if(!(0,f.statSync)(u).isDirectory()){console.log("[ERROR] API\u63CF\u8FF0\u6587\u4EF6\u4E0D\u662F\u76EE\u5F55");return}let m=(0,f.readdirSync)(u).filter(N=>N.endsWith(".ts")||N.endsWith(".js"));if(m.length===0){console.log("[ERROR] API\u63CF\u8FF0\u6587\u4EF6\u76EE\u5F55\u4E0B\u6CA1\u6709\u63CF\u8FF0\u751F\u6210\u6587\u4EF6");return}let c=[],d=[];m.forEach(N=>{let S=L((0,T.join)(u,N),__dirname);if(!S)return;let $=N.replace(".ts",".handler"),B=M(N.replace(".ts","Server")),ne=(0,T.join)(o,[$,".ts"].join("")),oe=[r,"handler",$].join("/");c.push(`import ${B} from '${oe}'`),d.push(B);let x=[],G=[],A=(0,T.join)(a,S.handler);!(0,f.existsSync)(A)&&(0,f.mkdirSync)(A,{recursive:!0});let P=["import { Request, Response } from 'express'","import { ErrorResponse, SuccessResponse } from '@aicblock/nserve/lib/tools'"];S.service?.forEach(E=>{let se=E.method?.toLowerCase()||"get",Y=k(E.handler),V=M(E.handler),w=[];E.session&&(x.push("import session from 'express-session'"),w.push(`session(${JSON.stringify(E.session)})`));let ie=[r,"logic",S.handler,Y].join("/");x.push(`import ${V} from '${ie}.logic'`),G.push(`Router.${se}('${E.path}',${w.join(",")}${w.length>0?",":""}${V})`),(0,J.log)("[INFO] gen router::",E,!!E.docRemark),E.docRemark&&P.concat(`// ${E.docRemark}`);let ce=P.concat(`
1
+ "use strict";var Ee=Object.create;var U=Object.defineProperty;var Oe=Object.getOwnPropertyDescriptor;var Re=Object.getOwnPropertyNames;var Te=Object.getPrototypeOf,_e=Object.prototype.hasOwnProperty;var be=(e,r)=>{for(var o in r)U(e,o,{get:r[o],enumerable:!0})},ne=(e,r,o,c)=>{if(r&&typeof r=="object"||typeof r=="function")for(let i of Re(r))!_e.call(e,i)&&i!==o&&U(e,i,{get:()=>r[i],enumerable:!(c=Oe(r,i))||c.enumerable});return e};var re=(e,r,o)=>(o=e!=null?Ee(Te(e)):{},ne(r||!e||!e.__esModule?U(o,"default",{value:e,enumerable:!0}):o,e)),Ie=e=>ne(U({},"__esModule",{value:!0}),e);var Pe={};be(Pe,{default:()=>Me,execRun:()=>fe});module.exports=Ie(Pe);var w=require("path");var oe=require("esbuild"),_=require("fs"),k=require("path"),K=re(require("vm")),Ce=re(require("js-yaml"));function b(e,r="INFO"){let o=(l,u="green")=>`\x1B[${{green:"32m",red:"31m",blue:"34m",orange:"30m"}[u]}${l}\x1B[0m`,i={INFO:"blue",WARNING:"orange",ERROR:"red",SUCCESS:"green"}[r],f=o(r,i);console.log(`[${f}] - ${e}`)}function W(e,r){let o=e.findIndex(i=>i===r);if(o<0||e.length-1===o)return;let c=e[o+1];if(c.indexOf("--")!==0)return c}function M(e,r){try{let o=(0,_.readFileSync)(e,"utf-8"),c=(0,oe.transformSync)(o,{format:"cjs",loader:"ts",platform:"node",target:"node18"}),i={module:{paths:[(0,k.join)(r,"node_modules")],exports:{default:void 0}},require,__dirname:r,global,__filename,process},f=new K.default.Script(c.code);return K.default.createContext(i),f.runInContext(i),i.module.exports.default||i.module.exports}catch(o){console.error(o),process.exit(0)}}var Q=require("fs"),pe=require("child_process");var g=require("fs"),R=require("path");function se(e){return!e||typeof e!="string"?e:e.replace(/([A-Z])/g," $1").trim().split(/\s+/).join("-").toLowerCase()}function j(e){return!e||typeof e!="string"?e:e.split(/[\-\_]/g).map(o=>o.charAt(0).toUpperCase()+o.slice(1)).join("")}var Se=e=>{let r=[],o=new Map,c=new Map;function i(n){if(!c.has(n))return c.set(n,1),n;let t=c.get(n)+1;return c.set(n,t),`${n}${t}`}function f(n,t,a){let s=[];if(t.type==="array"){if(t.properties&&Object.keys(t.properties).length>0){let p=t.name||i(`${a||"Anonymous"}_${n}_Item`),y=l(p,t.properties,t.description);return y&&(o.set(p,y),s.push(p)),{type:`${p}[]`,generatedInterfaces:s}}return{type:"any[]",generatedInterfaces:s}}if(t.type==="object"&&t.properties){let p=t.name||i(`${a||"Anonymous"}_${n}`),y=l(p,t.properties,t.description);return y&&(o.set(p,y),s.push(p)),{type:p,generatedInterfaces:s}}return typeof t.type=="object"?{type:t.type.name,generatedInterfaces:s}:{type:t.type||"string",generatedInterfaces:s}}function l(n,t,a){let s=[];return a&&s.push(`// ${a}`),Object.entries(t).forEach(([p,y])=>{let h=f(p,y,n),O=y.description?` // ${y.description}`:"",C=` ${p}: ${h.type};`;s.push(O?`${O}
2
+ ${C}`:C)}),s.length===0?`interface ${n} {}`:`interface ${n} {
3
+ ${s.join(`
4
+ `)}
5
+ }`}function u(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,p])=>{f(s,p,n.name)});let t="";if(n.genericity)if(typeof n.genericity=="string"){let s=d(n);s?t=` extends ${n.genericity}<${s}>`:t=` extends ${n.genericity}`}else{let{name:s,typeParams:p}=n.genericity;t=` extends ${s}<${p.join(", ")}>`}else n.extends&&(Array.isArray(n.extends)?t=` extends ${n.extends.join(", ")}`:t=` extends ${n.extends}`);if(n.genericity)return`interface ${n.name}${t} {}`;let a=[];return Object.entries(n.properties||{}).forEach(([s,p])=>{let y=f(s,p,n.name),h=p.description?` // ${p.description}`:"",O=` ${s}: ${y.type};`;a.push(h?`${h}
7
+ ${O}`:O)}),`interface ${n.name}${t} {
8
+ ${a.join(`
9
+ `)}
10
+ }`}function d(n){let t=n.properties?.list;if(t&&t.type==="array"&&t.name)return t.name;for(let[a,s]of Object.entries(n.properties||{}))if(s.type==="array"&&s.name)return s.name;return null}let E=u(e);return o.forEach(n=>{r.push(n)}),r.push(E),r.join(`
11
+
12
+ `)},J=Se;var Ne=(e,r,o,c="@")=>{let i=(0,R.join)(r,o,"handler"),f=(0,R.join)(r,o,"logic"),l=(0,R.join)(r,o,"types");!(0,g.existsSync)(i)&&(0,g.mkdirSync)(i,{recursive:!0}),!(0,g.existsSync)(f)&&(0,g.mkdirSync)(f,{recursive:!0}),!(0,g.existsSync)(l)&&(0,g.mkdirSync)(l,{recursive:!0});let d=Object.assign({},{genDir:"nserve-config",routerDir:"router",modelDir:"model"},e),{genDir:E,routerDir:n,middleware:t}=d,a=(0,R.join)(r,E),s=(0,R.join)(a,n||"");if(!(0,g.existsSync)(s)){console.log("[ERROR] API\u63CF\u8FF0\u6587\u4EF6\u4E0D\u5B58\u5728::",s);return}if(!(0,g.statSync)(s).isDirectory()){console.log("[ERROR] API\u63CF\u8FF0\u6587\u4EF6\u4E0D\u662F\u76EE\u5F55");return}let y=(0,g.readdirSync)(s).filter(I=>I.endsWith(".ts")||I.endsWith(".js"));if(y.length===0){console.log("[ERROR] API\u63CF\u8FF0\u6587\u4EF6\u76EE\u5F55\u4E0B\u6CA1\u6709\u63CF\u8FF0\u751F\u6210\u6587\u4EF6");return}let h=[],O=[];y.forEach(I=>{let N=M((0,R.join)(s,I),__dirname);if(!N)return;let H=I.replace(".ts",".handler"),X=j(I.replace(".ts",""))+"Server",de=(0,R.join)(i,[H,".ts"].join("")),me=[c,"handler",H].join("/");h.push(`import ${X} from '${me}'`),O.push(X);let G=[],z=[],B=(0,R.join)(f,N.handler),Y=(0,R.join)(l,N.handler);!(0,g.existsSync)(B)&&(0,g.mkdirSync)(B,{recursive:!0}),!(0,g.existsSync)(Y)&&(0,g.mkdirSync)(Y,{recursive:!0});let Z=["import { Request, Response } from 'express'","import { ErrorResponse, SuccessResponse } from '@aicblock/nserve/lib/tools'"],D={},A={};t&&Object.keys(t).forEach(m=>{let{libName:S,funcName:x}=t[m],F=x?`{${x} as ${m}}`:m;D[m]=`import ${F} from '${S}'`}),N.service?.forEach(m=>{let S=se(m.handler),x=[];if(m.responseDataType&&x.push(J(m.responseDataType)),m.requestDataType&&x.push(J(m.requestDataType)),x.length>0){let $=(0,R.join)(Y,`${S}.types.d.ts`);(0,g.writeFileSync)($,x.join(`
13
+ `),"utf-8")}let F=m.method?.toLowerCase()||"get",ee=j(m.handler),q=[];if(m.middleware&&d.middleware){let $=Array.isArray(m.middleware)?m.middleware:[m.middleware];if(!$.every(v=>!!D[v]))throw new Error(`[ERROR] \u8DEF\u7531\u914D\u7F6E\u4E2D\u4F7F\u7528\u4E86\u4E0D\u5B58\u5728\u7684\u4E2D\u95F4\u4EF6::${$}`);$.forEach(v=>{A[v]=D[v]}),q.push(...$)}let ye=[c,"logic",N.handler,S].join("/");G.push(`import ${ee} from '${ye}.logic'`),z.push(`Router.${F}('${m.path}',${q.join(",")}${q.length>0?",":""}${ee})`),m.docRemark&&Z.concat(`// ${m.docRemark}`);let he=Z.concat(`
2
14
  export async function ServiceLogic(req: Request, res: Response) {
3
15
  try {
4
16
  SuccessResponse(res)
@@ -7,8 +19,9 @@
7
19
  }
8
20
  }
9
21
  export default ServiceLogic
10
- `),F=(0,T.join)(A,`${Y}.logic.ts`);!(0,f.existsSync)(F)&&(0,f.writeFileSync)(F,ce.join(`
11
- `))});let re=["// Code generated by plugin. Templates Edited by aicblock cli. DO NOT EDIT.","import express from 'express'",...x,"const app = express()","const Router = express.Router()",`app.use('${S.prefix}', Router)`,...G,"export default app"];(0,f.writeFileSync)(ne,re.join(`
12
- `))});let y=(0,T.join)(o,"router.ts"),C=["// Code generated by plugin. Templates Edited by aicblock cli. DO NOT EDIT.",...c,"export default [",d.join(","),"]"];(0,f.writeFileSync)(y,C.join(`
13
- `)),console.log("[INFO] gen router file ",y)},Q=he;var h=require("fs"),b=require("path"),Ee=new Set(["INT","BIGINT","BIT","DECIMAL","DOUBLE","FLOAT","INTEGER","MEDIUMINT","NUMERIC","REAL","SMALLINT","TINYINT"]);function Re(e){let r=e.replace(/\/\*[\s\S]*?\*\//g,"").trim().replace(/--.*$/gm,"").replace(/\s+/g," "),o=r.match(/CREATE TABLE [`"]?([\w_]+)[`"]?\s*\(/i);if(!o)throw new Error("\u65E0\u6CD5\u89E3\u6790\u8868\u540D");let i={tableName:o[1],columns:[]},s=r.indexOf("("),p=r.lastIndexOf(")");if(s===-1||p===-1||p<=s)throw new Error("\u65E0\u6CD5\u627E\u5230\u5217\u5B9A\u4E49\u90E8\u5206");let g=r.substring(s+1,p);if(!g.trim())return i;let u=Te(g),l=new Set,m=new Set;return u.forEach(c=>{let d=c.trim();if(d.toUpperCase().startsWith("PRIMARY KEY")){let C=d.match(/PRIMARY KEY\s*\([`"]?([\w_]+)[`"]?\)/i);C&&l.add(C[1]);return}if(d.toUpperCase().startsWith("UNIQUE")){let C=d.match(/\([`"]?([\w_]+)[`"]?(?:\s+ASC|DESC)?\)/i);C&&m.add(C[1]);return}let y=Oe(d);y&&i.columns.push(y)}),i.columns.forEach(c=>{l.has(c.name)&&(c.primaryKey=!0),m.has(c.name)&&(c.unique=!0)}),i}function Te(e){let t=[],n="",r=!1,o=!1,a=0;for(let i=0;i<e.length;i++){let s=e[i],p=i+1<e.length?e[i+1]:"";s==="'"&&!o&&(r=!r),s==="-"&&p==="-"&&!r&&(o=!0),o&&(s===","||s===")")&&(o=!1),s==="("&&!r&&!o&&a++,s===")"&&!r&&!o&&a--,s===","&&!r&&!o&&a===0?(n.trim()&&t.push(n.trim()),n=""):n+=s}return n.trim()&&t.push(n.trim()),t}function Oe(e){if(e.toUpperCase().startsWith("PRIMARY KEY")||e.toUpperCase().startsWith("UNIQUE")||e.toUpperCase().startsWith("KEY"))return null;let t=/^[`"]?([\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,n=e.match(t);if(!n)return null;let[,r,o,a,i,s,p]=n,g=o.toUpperCase(),u={name:r,dataType:g};if(a&&(u.length=parseInt(a,10)),i&&i.toUpperCase()==="NOT NULL"&&(u.notNull=!0),e.toUpperCase().includes("UNIQUE")&&(u.unique=!0),e.toUpperCase().includes("AUTO_INCREMENT")&&(u.autoIncrement=!0),s!==void 0&&s!==""&&s!=="NULL"){let l=s.trim();if((l.startsWith("'")&&l.endsWith("'")&&l.length>1||l.startsWith('"')&&l.endsWith('"')&&l.length>1)&&(l=l.substring(1,l.length-1)),Ee.has(g)){let m=Number(l);!isNaN(m)&&l!==""?u.defaultValue=m:l!==""&&(u.defaultValue=l)}else l!==""&&(u.defaultValue=l)}return p&&(u.comments=p),u}var ye=(e,t,n)=>{let r={genDir:"nserve-config",modelDir:"model"},{genDir:o,modelDir:a}=Object.assign({},r,e),i=(0,b.join)(t,o,a);if(!(0,h.existsSync)(i))throw new Error(`The SQL model directory does not exist::${i}`);let s=(0,h.readdirSync)(i).filter(p=>p.endsWith(".sql"));if(s.length===0)throw new Error(`The SQL model directory does not contain any SQL files::${i}`);s.forEach(p=>{let g=(0,b.join)(i,p),u=(0,h.readFileSync)(g,"utf-8");try{let l=Re(u),m=l.tableName,c=(0,b.join)(t,n,a);(0,h.existsSync)(c)||(0,h.mkdirSync)(c);let d=(0,b.join)(c,`${m}.ts`),y=["import { TableOption } from '@dpapejs/emysql'",`export default ${JSON.stringify(l,null,2)} as TableOption`];(0,h.writeFileSync)(d,y.join(`
14
- `),"utf-8"),O(`The model file ${m} has been generated::${d}`)}catch{throw new Error(`The SQL file ${p} is not a valid CREATE TABLE statement::${g}`)}})},H=ye;var X=require("child_process"),z=require("path"),Ce=(e,t,n)=>{try{let r=t||process.cwd();Q(e||{},r,n||"src"),H(e||{},r,n||"src");let o="npx prettier --no-semi --single-quote --write 'logic/**/*.ts' 'handler/**/*.ts' 'model/**/*.ts'",a=(0,z.join)(r,n||"src");console.log("[INFO] execRunGen::",a),(0,X.spawnSync)(o,{cwd:a,stdio:"inherit",shell:!0}),O("[INFO] execRunGen","SUCCESS")}catch(r){O("execRunGen fial::","ERROR"),console.error(r)}},Z=Ce;function Ne(e,t){O(`${t?`The [${t}] app has been `:""}Build DONE. [Build time:${Date.now()-e} ms]`,"SUCCESS")}function Se(e){O(e==="build"?"Build Fail.":"Serve process has exited.","ERROR")}function be(){let e=process.cwd(),t=v(process.argv,"--config"),n=(0,I.join)(e,"nserve.config.ts"),r=(0,I.join)(e,"nserve.config.js"),o=t?(0,I.join)(e,t):(0,j.existsSync)(n)?n:r;if(!(0,j.existsSync)(o))throw Error(`The configuration file does not exist. [${o}]`);return o}function te(e){try{let n=be(),r=process.cwd(),o=e,a=v(process.argv,"--mode"),i=JSON.stringify(process.argv),s={AICBLOCK_NSERVE_RUN_CWD:r,AICBLOCK_NSERVE_RUN_CONFIG_PATH:n,AICBLOCK_NSERVE_RUN_MODE:o,AICBLOCK_NSERVE_ENV_MODE:a,AICBLOCK_NSERVE_RUN_ARGV:i};Object.keys(s).forEach(c=>{let d=s[c];d!==void 0&&(process.env[c]=d)});let p=L(n,process.cwd());if(e==="gen"){Z(p.generateConfig||{},r,p.sourceDir||"src");return}let g=Date.now();var t=void 0;let u=process.platform==="win32"?"node.cmd":"node",m=(0,ee.spawn)(u,["./lib/core/run.js","--cmd"],{cwd:(0,I.join)(__dirname,"../"),stdio:e==="build"?"inherit":"pipe",env:Object.assign({},process.env,s)});m.stdout?.on("data",c=>{t&&t.stop(),console.log(c.toString("utf-8"))}),m.stdout?.on("error",c=>{t&&t.stop(),console.log(c.toString())}),m.stderr?.on("data",c=>{t&&t.stop(),console.log(c.toString("utf-8"))}),m.on("exit",c=>{t&&t.stop(),c===0&&e==="build"&&Ne(g,a),c!==0&&Se(e)})}catch(n){O("execRun fial::","ERROR"),console.error(n)}}var Ie=te;0&&(module.exports={execRun});
22
+ `),te=(0,R.join)(B,`${S}.logic.ts`);!(0,g.existsSync)(te)&&(0,g.writeFileSync)(te,he.join(`
23
+ `),"utf-8")});let V=[];N.middleware?.forEach(m=>{let S=D[m];!S||A[m]||(A[m]=S,V.push(m))}),Object.keys(A).forEach(m=>{G.push(A[m])});let ge=["// Code generated by plugin. Templates Edited by aicblock cli. DO NOT EDIT.","import express from 'express'",...G,"const app = express()","const Router = express.Router()",V.length>0?`Router.use(${V.join(",")})`:"",`app.use('${N.prefix}', Router)`,...z,"export default app"];(0,g.writeFileSync)(de,ge.join(`
24
+ `))});let C=(0,R.join)(i,"router.ts"),P=["// Code generated by plugin. Templates Edited by aicblock cli. DO NOT EDIT.",...h,"export default [",O.join(","),"]"];(0,g.writeFileSync)(C,P.join(`
25
+ `)),console.log("[INFO] gen router file ",C)},ie=Ne;var T=require("fs"),L=require("path");var xe=new Set(["INT","BIGINT","BIT","DECIMAL","DOUBLE","FLOAT","INTEGER","MEDIUMINT","NUMERIC","REAL","SMALLINT","TINYINT"]);function $e(e){let c=e.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:[]},u=c.indexOf("("),d=c.lastIndexOf(")");if(u===-1||d===-1||d<=u)throw new Error("\u65E0\u6CD5\u627E\u5230\u5217\u5B9A\u4E49\u90E8\u5206");let E=c.substring(u+1,d);if(!E.trim())return l;let n=Le(E),t=new Set,a=new Set;return n.forEach(s=>{let p=s.trim();if(p.toUpperCase().startsWith("PRIMARY KEY")){let h=p.match(/PRIMARY KEY\s*\([`"]?([\w_]+)[`"]?\)/i);h&&t.add(h[1]);return}if(p.toUpperCase().startsWith("UNIQUE")){let h=p.match(/\([`"]?([\w_]+)[`"]?(?:\s+ASC|DESC)?\)/i);h&&a.add(h[1]);return}let y=Ae(p);y&&l.columns.push(y)}),l.columns.forEach(s=>{t.has(s.name)&&(s.primaryKey=!0),a.has(s.name)&&(s.unique=!0)}),l}function Le(e){let r=[],o="",c=!1,i=!1,f=0;for(let l=0;l<e.length;l++){let u=e[l],d=l+1<e.length?e[l+1]:"";u==="'"&&!i&&(c=!c),u==="-"&&d==="-"&&!c&&(i=!0),i&&(u===","||u===")")&&(i=!1),u==="("&&!c&&!i&&f++,u===")"&&!c&&!i&&f--,u===","&&!c&&!i&&f===0?(o.trim()&&r.push(o.trim()),o=""):o+=u}return o.trim()&&r.push(o.trim()),r}function Ae(e){if(e.toUpperCase().startsWith("PRIMARY KEY")||e.toUpperCase().startsWith("UNIQUE")||e.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=e.match(r);if(!o)return null;let[,c,i,f,l,u,d]=o,E=i.toUpperCase(),n={name:c,dataType:E};if(f&&(n.length=parseInt(f,10)),l&&l.toUpperCase()==="NOT NULL"&&(n.notNull=!0),e.toUpperCase().includes("UNIQUE")&&(n.unique=!0),e.toUpperCase().includes("AUTO_INCREMENT")&&(n.autoIncrement=!0),u!==void 0&&u!==""&&u!=="NULL"){let t=u.trim();if((t.startsWith("'")&&t.endsWith("'")&&t.length>1||t.startsWith('"')&&t.endsWith('"')&&t.length>1)&&(t=t.substring(1,t.length-1)),xe.has(E)){let a=Number(t);!isNaN(a)&&t!==""?n.defaultValue=a:t!==""&&(n.defaultValue=t)}else t!==""&&(n.defaultValue=t)}return d&&(n.comments=d),n}var je=(e,r,o)=>{let c={genDir:"nserve-config",modelDir:"model"},{genDir:i,modelDir:f}=Object.assign({},c,e),l=(0,L.join)(r,i,f);if(!(0,T.existsSync)(l))return;let u=(0,T.readdirSync)(l).filter(s=>s.endsWith(".sql"));if(u.length===0)throw new Error(`The SQL model directory does not contain any SQL files::${l}`);let d=(0,L.join)(r,o,f);(0,T.existsSync)(d)||(0,T.mkdirSync)(d);let E=[],n=[];u.forEach(s=>{let p=(0,L.join)(l,s),y=(0,T.readFileSync)(p,"utf-8");try{let h=$e(y),O=h.tableName,C=(0,L.join)(d,`${O}.ts`),P=["import type { TableOption } from '@dpapejs/emysql'",`const table:TableOption = ${JSON.stringify(h,null,2)}`,"export default table"];(0,T.writeFileSync)(C,P.join(`
26
+ `),"utf-8");let I=j(O);n.push(I),E.push(`import ${I} from './${O}'`),b(`The model file ${O} has been generated::${C}`)}catch{throw new Error(`The SQL file ${s} is not a valid CREATE TABLE statement::${p}`)}});let t=(0,L.join)(d,"index.ts"),a=[...E,`export default [${n.join(", ")}]`];(0,T.writeFileSync)(t,a.join(`
27
+ `),"utf-8"),b(`The model index file has been generated::${t}`)},ce=je;var ae=require("child_process"),le=require("path"),we=(e,r,o)=>{try{let c=r||process.cwd();ie(e||{},c,o||"src"),ce(e||{},c,o||"src");let i={semi:!1,singleQuote:!0,trailingComma:"none"},{semi:f,singleQuote:l,trailingComma:u}=Object.assign({},i,e?.codePrettier||{}),d=["npx prettier"];f===!1&&d.push("--no-semi"),l===!0&&d.push("--single-quote"),u&&d.push(`--trailing-comma ${u}`);let E=["'logic/**/*.ts'","'handler/**/*.ts'","'model/**/*.ts'","'types/**/*.d.ts'"];d.push("--write",...E);let n=d.join(" "),t=(0,le.join)(c,o||"src");console.log("[INFO] execRunGen::",t),console.log("[INFO] cmd::",n),(0,ae.spawnSync)(n,{cwd:t,stdio:"inherit",shell:!0}),b("[INFO] execRunGen","SUCCESS")}catch(c){b("execRunGen fial::","ERROR"),console.error(c)}},ue=we;function De(e,r){b(`${r?`The [${r}] app has been `:""}Build DONE. [Build time:${Date.now()-e} ms]`,"SUCCESS")}function ve(e){b(e==="build"?"Build Fail.":"Serve process has exited.","ERROR")}function Ue(){let e=process.cwd(),r=W(process.argv,"--config"),o=(0,w.join)(e,"nserve.config.ts"),c=(0,w.join)(e,"nserve.config.js"),i=r?(0,w.join)(e,r):(0,Q.existsSync)(o)?o:c;if(!(0,Q.existsSync)(i))throw Error(`The configuration file does not exist. [${i}]`);return i}function fe(e){try{let o=Ue(),c=process.cwd(),i=e,f=W(process.argv,"--mode"),l=JSON.stringify(process.argv),u={AICBLOCK_NSERVE_RUN_CWD:c,AICBLOCK_NSERVE_RUN_CONFIG_PATH:o,AICBLOCK_NSERVE_RUN_MODE:i,AICBLOCK_NSERVE_ENV_MODE:f,AICBLOCK_NSERVE_RUN_ARGV:l};if(Object.keys(u).forEach(a=>{let s=u[a];s!==void 0&&(process.env[a]=s)}),e==="gen"){let{generateConfig:a,sourceDir:s}=M(o,process.cwd());ue(a||{},c,s||"src");return}let d=Date.now();var r=void 0;let E=process.platform==="win32"?"node.cmd":"node",t=(0,pe.spawn)(E,["./lib/core/run.js","--cmd"],{cwd:(0,w.join)(__dirname,"../"),stdio:e==="build"?"inherit":"pipe",env:Object.assign({},process.env,u)});t.stdout?.on("data",a=>{r&&r.stop(),console.log(a.toString("utf-8"))}),t.stdout?.on("error",a=>{r&&r.stop(),console.log(a.toString())}),t.stderr?.on("data",a=>{r&&r.stop(),console.log(a.toString("utf-8"))}),t.on("exit",a=>{r&&r.stop(),a===0&&e==="build"&&De(d,f),a!==0&&ve(e)})}catch(o){b("execRun fial::","ERROR"),console.error(o)}}var Me=fe;0&&(module.exports={execRun});
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aicblock/nserve",
3
- "version": "1.0.0",
3
+ "version": "1.0.1",
4
4
  "description": "🛠️ Description NodeJS Server-side development CLI",
5
5
  "main": "lib/index.js",
6
6
  "scripts": {
@@ -13,6 +13,7 @@
13
13
  "serve-cli",
14
14
  "node-server"
15
15
  ],
16
+ "homepage": "http://nserve.aicblock.cn/",
16
17
  "bin": {
17
18
  "nserve": "lib/commander.js"
18
19
  },
@@ -50,6 +51,7 @@
50
51
  "esbuild": "0.27.2",
51
52
  "express": "5.2.1",
52
53
  "js-yaml": "4.1.1",
54
+ "prettier": "3.7.4",
53
55
  "yaml": "2.8.2"
54
56
  }
55
- }
57
+ }