@aicblock/nserve 1.0.3 → 1.0.4
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/lib/commander.js +1 -1
- package/lib/core/run.js +3 -1
- package/lib/index.d.ts +6 -1
- package/lib/runtime.js +16 -16
- package/lib/tools/index.js +1 -1
- package/package.json +2 -2
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.
|
|
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);
|
package/lib/core/run.js
CHANGED
|
@@ -1 +1,3 @@
|
|
|
1
|
-
"use strict";var
|
|
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();
|
package/lib/index.d.ts
CHANGED
|
@@ -147,9 +147,12 @@ type RouterMethod =
|
|
|
147
147
|
// 数据类型属性定义
|
|
148
148
|
type PropertyType = 'string' | 'number' | 'boolean' | 'object' | 'array'
|
|
149
149
|
|
|
150
|
+
// 数据来源类型
|
|
151
|
+
type DataSourceType = 'body' | 'query' | 'params'
|
|
152
|
+
|
|
150
153
|
interface DataTypeProperty {
|
|
151
154
|
// 数据类型
|
|
152
|
-
type?: PropertyType | { type: 'custom'; name: string }
|
|
155
|
+
type?: PropertyType | { type: 'custom'; name: string } | { type: 'enum'; values: readonly (string | number)[] }
|
|
153
156
|
// 数据类型名称
|
|
154
157
|
name?: string
|
|
155
158
|
// 数据类型描述
|
|
@@ -180,6 +183,8 @@ interface DataTypeOption {
|
|
|
180
183
|
extends?: string | string[]
|
|
181
184
|
// 数据类型泛型定义
|
|
182
185
|
genericity?: string | GenericityParam
|
|
186
|
+
// 数据来源类型 (body/query/params)
|
|
187
|
+
source?: DataSourceType
|
|
183
188
|
}
|
|
184
189
|
|
|
185
190
|
// 路由选项定义
|
package/lib/runtime.js
CHANGED
|
@@ -1,17 +1,17 @@
|
|
|
1
|
-
"use strict";var
|
|
2
|
-
${
|
|
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} {
|
|
3
3
|
${s.join(`
|
|
4
4
|
`)}
|
|
5
|
-
}`}function
|
|
6
|
-
`)}Object.entries(n.properties||{}).forEach(([s,
|
|
7
|
-
${
|
|
8
|
-
${
|
|
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(`
|
|
9
9
|
`)}
|
|
10
|
-
}`}function
|
|
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(`
|
|
11
11
|
|
|
12
|
-
`)},re=Me;var ve=(
|
|
13
|
-
`),"utf-8")}let
|
|
14
|
-
${
|
|
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}`:""}
|
|
15
15
|
export async function ServiceLogic(req: Request, res: Response) {
|
|
16
16
|
try {
|
|
17
17
|
// todo: \u63A5\u53E3\u670D\u52A1\u903B\u8F91\u5B9E\u73B0
|
|
@@ -23,9 +23,9 @@ ${a.join(`
|
|
|
23
23
|
}
|
|
24
24
|
}
|
|
25
25
|
export default ServiceLogic
|
|
26
|
-
`),ae=(0,O.join)(z,`${
|
|
27
|
-
`),"utf-8")});let X=[]
|
|
28
|
-
`))});let
|
|
29
|
-
`)),console.log("[INFO] gen router file ",
|
|
30
|
-
`),"utf-8");let
|
|
31
|
-
`),"utf-8"),
|
|
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});
|
package/lib/tools/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";var R=Object.create;var
|
|
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});
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@aicblock/nserve",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.4",
|
|
4
4
|
"description": "🛠️ Description NodeJS Server-side development CLI",
|
|
5
5
|
"main": "lib/index.js",
|
|
6
6
|
"scripts": {
|
|
@@ -46,7 +46,7 @@
|
|
|
46
46
|
}
|
|
47
47
|
},
|
|
48
48
|
"dependencies": {
|
|
49
|
-
"@aicblock/
|
|
49
|
+
"@aicblock/esql": "^2.0.0",
|
|
50
50
|
"commander": "14.0.2",
|
|
51
51
|
"esbuild": "0.27.2",
|
|
52
52
|
"express": "5.2.1",
|