anl 26.331.0 → 26.509.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/config.d.ts CHANGED
@@ -24,6 +24,9 @@ export interface IIncludeInterface {
24
24
  }
25
25
 
26
26
  export interface IConfigSwaggerServer {
27
+ /** 服务名称,作为 `anl type --service <name>` 的匹配标识,建议在多服务场景下显式指定。
28
+ * 未指定时,会回退到 apiListFileName 去扩展名后的值作为标识。 */
29
+ name?: string;
27
30
  /** swagger json 的 url */
28
31
  url: string;
29
32
  /** 公共前缀 */
@@ -50,6 +53,11 @@ export interface IConfigSwaggerServer {
50
53
  responseModelTransform?: IResponseModelTransform;
51
54
  /** 请求超时时间(毫秒),默认 60000 */
52
55
  timeout?: number;
56
+ /** 命名空间隔离策略(服务级配置):
57
+ * - 'segment'(默认):以服务 segment 派生 PascalCase 前缀(如 op → `Op_`),避免多服务同 path 的全局 namespace 合并污染。
58
+ * - 'none':不加前缀(仅推荐单服务项目使用)。
59
+ */
60
+ namespaceIsolation?: 'segment' | 'none';
53
61
  }
54
62
 
55
63
  export interface ConfigType {
@@ -87,6 +95,8 @@ export interface ConfigType {
87
95
  responseModelTransform?: IResponseModelTransform;
88
96
  /** 请求超时时间(毫秒),默认 60000 */
89
97
  timeout?: number;
98
+ /** 命名空间隔离策略(服务级配置注入),默认 'segment' */
99
+ namespaceIsolation?: 'segment' | 'none';
90
100
  /** 格式化配置 */
91
101
  formatting?: {
92
102
  /** 缩进字符 */
package/lib/index.cjs CHANGED
@@ -1 +1 @@
1
- const e=require(`./_virtual/rolldown_runtime.cjs`),t=require(`./package.cjs`),n=require(`./git-local-config/index.cjs`),r=require(`./skill-init/index.cjs`),i=require(`./standard/lint-init.cjs`),a=require(`./swagger-codegen/index.cjs`);let o=require(`commander`),s=require(`inquirer`);s=e.__toESM(s),o.program.version(`${t.version}`,`-v --version`).usage(`<command> [options]`),o.program.command(`type`).description(`auto interface`).option(`-s, --show <what>`,`show interface list after generation: miss | gen`).option(`-f, --format [config]`,`enable prettier formatting after generation; optionally specify a prettier config file path (e.g. --format .prettierrc.mjs)`).option(`-l, --log-level <level>`,`set log output level: silent | error | warn | info | verbose`).action(e=>{let t=(e.show??``).toLowerCase().trim(),n=t===`miss`||t===`missing`||t===`m`||t===`exclude`||t===`x`?`miss`:t===`gen`||t===`generated`||t===`g`||t===`include`||t===`i`?`gen`:void 0;new a.Main().initialize(n,e.format,e.logLevel).catch(e=>{console.error(e)})}),o.program.command(`lint`).description(`install linting tools (eslint, stylelint, prettier, commitlint, vscode)`).action(()=>i.lintHandle()),o.program.command(`git`).description(`config git Local custom command`).action(async()=>{let{features:e}=await s.default.prompt([{type:`checkbox`,name:`features`,message:`Select the required Git features (multi-select):`,choices:[{name:`gitflow standard branch creation`,value:`gitflow`},{name:`automatically set commit subject`,value:`commitSubject`},{name:`custom git command`,value:`customGitCommand`}],pageSize:10}]);n.gitHandle(e).catch(e=>{console.error(e)})}),o.program.command(`skill`).description(`initialize an agent skill into the current project`).action(()=>{r.skillHandle().catch(e=>{console.error(e)})}),o.program.parse(process.argv);
1
+ const e=require(`./_virtual/rolldown_runtime.cjs`),t=require(`./package.cjs`),n=require(`./git-local-config/index.cjs`),r=require(`./skill-init/index.cjs`),i=require(`./standard/lint-init.cjs`),a=require(`./swagger-codegen/index.cjs`);let o=require(`commander`),s=require(`inquirer`);s=e.__toESM(s),o.program.version(`${t.version}`,`-v --version`).usage(`<command> [options]`),o.program.command(`type`).description(`auto interface`).option(`-s, --show <what>`,`show interface list after generation: miss | gen`).option(`-f, --format [config]`,`enable prettier formatting after generation; optionally specify a prettier config file path (e.g. --format .prettierrc.mjs)`).option(`-l, --log-level <level>`,`set log output level: silent | error | warn | info | verbose`).option(`-S, --service <names>`,"only regenerate the specified swagger service(s); comma-separated. Match by `name` (preferred) or `apiListFileName` without extension. Other services are kept untouched.").action(e=>{let t=(e.show??``).toLowerCase().trim(),n=t===`miss`||t===`missing`||t===`m`||t===`exclude`||t===`x`?`miss`:t===`gen`||t===`generated`||t===`g`||t===`include`||t===`i`?`gen`:void 0,r=e.service?e.service.split(`,`).map(e=>e.trim()).filter(Boolean):void 0;new a.Main().initialize(n,e.format,e.logLevel,r).catch(e=>{console.error(e)})}),o.program.command(`lint`).description(`install linting tools (eslint, stylelint, prettier, commitlint, vscode)`).action(()=>i.lintHandle()),o.program.command(`git`).description(`config git Local custom command`).action(async()=>{let{features:e}=await s.default.prompt([{type:`checkbox`,name:`features`,message:`Select the required Git features (multi-select):`,choices:[{name:`gitflow standard branch creation`,value:`gitflow`},{name:`automatically set commit subject`,value:`commitSubject`},{name:`custom git command`,value:`customGitCommand`}],pageSize:10}]);n.gitHandle(e).catch(e=>{console.error(e)})}),o.program.command(`skill`).description(`initialize an agent skill into the current project`).action(()=>{r.skillHandle().catch(e=>{console.error(e)})}),o.program.parse(process.argv);
package/lib/package.cjs CHANGED
@@ -1 +1 @@
1
- var e=`26.331.0`;Object.defineProperty(exports,`version`,{enumerable:!0,get:function(){return e}});
1
+ var e=`26.509.1`;Object.defineProperty(exports,`version`,{enumerable:!0,get:function(){return e}});
@@ -3,4 +3,4 @@ const e=require(`../../utils/logger.cjs`),t=require(`../../utils/index.cjs`),n=r
3
3
  `)}\n}`}catch(t){return e.log.error(`JSON 解析失败: ${t instanceof Error?t.message:String(t)}`),``}}normalizeEnumValues(e){return e.map((e,t)=>{if(typeof e==`string`||typeof e==`number`)return e;if(e&&typeof e==`object`){let n=e;if(n.value!==void 0&&(typeof n.value==`string`||typeof n.value==`number`))return n.value;if(n.key!==void 0&&(typeof n.key==`string`||typeof n.key==`number`))return n.key;if(n.id!==void 0&&(typeof n.id==`string`||typeof n.id==`number`))return n.id;try{return JSON.stringify(n)}catch{return`ENUM_${t}`}}return`ENUM_${t}`})}parseEnum(e,t){if(!Array.isArray(e.enum))return null;let i=[`integer`,`number`],a=this.normalizeEnumValues(e.enum),o=!!(e.type&&i.includes(e.type)),s=e.type===`string`&&a.every(e=>typeof e==`string`&&!isNaN(Number(e))),{customNames:c,descriptionMap:l,rawEnumJson:u}=this.extractEnumMetadata(e),d=this.config.enmuConfig.erasableSyntaxOnly;if(u){let e=this.convertJsonToEnumString(u,t);if(e)return{headerRef:``,renderStr:e}}let f=a.map((e,t)=>{let r=this.resolveEnumMemberName(e,t,{customNames:c,isNumericEnum:o,treatStringAsNumeric:s}),i=o?`${e}`:`'${String(e)}'`,a=d?`${r}: ${i},`:`${r} = ${i},`,u=l?.[String(e)];return u?[`${n.getIndentation(this.config)}/** ${u} */`,`${n.getIndentation(this.config)}${a}`].join(`
4
4
  `):`${n.getIndentation(this.config)}${a}`});return f.length?d?{headerRef:``,renderStr:[`export const ${t} = {`,...f,`} as const;`,``,`export type ${r.getEnumTypeName(this.config,t)} = typeof ${t}[keyof typeof ${t}];`].join(`
5
5
  `)}:{headerRef:``,renderStr:[`export enum ${t} {`,...f,`}`].join(`
6
- `)}:null}handleEnum(e,i,a=!1){let o=r.wordsToPascalCase(r.resolveSchemaName(i)),s=r.getEnumTypeName(this.config,o),c=r.typeNameToFileName(o);if(t.isValidJSON(e.example)){let t=this.convertJsonToEnumString(e.example,o);return this.enumsMap.has(c)||this.enumsMap.set(c,{fileName:c,content:t}),{headerRef:`import type { ${s} } from '${this.config.importEnumPath}';`,renderStr:`${n.getIndentation(this.config)}${i}${a?``:`?`}: ${s}${this.nullable(e.nullable)};`,comment:t,typeName:s}}let l=this.parseEnum(e,o);return l?(this.enumsMap.has(c)||this.enumsMap.set(c,{fileName:c,content:l.renderStr}),{headerRef:`import type { ${s} } from '${this.config.importEnumPath}';`,renderStr:`${n.getIndentation(this.config)}${i}${a?``:`?`}: ${s}${this.nullable(e.nullable)};`,typeName:s}):null}addEnumByName(e,t){let n=r.typeNameToFileName(e);this.enumsMap.has(n)||this.enumsMap.set(n,{fileName:n,content:t})}hasEnum(e){let t=r.typeNameToFileName(e);return this.enumsMap.has(t)}getEnumTypeName(e){return r.getEnumTypeName(this.config,e)}getEnumImport(e){return`import type { ${r.getEnumTypeName(this.config,e)} } from '${this.config.importEnumPath}';`}};exports.EnumParser=a;
6
+ `)}:null}handleEnum(e,i,a=!1){let o=r.wordsToPascalCase(r.resolveSchemaName(i)),s=r.getEnumTypeName(this.config,o),c=r.typeNameToFileName(o),l=r.adjustImportPathForSegment(this.config.importEnumPath??``,r.getServerSegment(this.config));if(t.isValidJSON(e.example)){let t=this.convertJsonToEnumString(e.example,o);return this.enumsMap.has(c)||this.enumsMap.set(c,{fileName:c,content:t}),{headerRef:`import type { ${s} } from '${l}';`,renderStr:`${n.getIndentation(this.config)}${i}${a?``:`?`}: ${s}${this.nullable(e.nullable)};`,comment:t,typeName:s}}let u=this.parseEnum(e,o);return u?(this.enumsMap.has(c)||this.enumsMap.set(c,{fileName:c,content:u.renderStr}),{headerRef:`import type { ${s} } from '${l}';`,renderStr:`${n.getIndentation(this.config)}${i}${a?``:`?`}: ${s}${this.nullable(e.nullable)};`,typeName:s}):null}addEnumByName(e,t){let n=r.typeNameToFileName(e);this.enumsMap.has(n)||this.enumsMap.set(n,{fileName:n,content:t})}hasEnum(e){let t=r.typeNameToFileName(e);return this.enumsMap.has(t)}getEnumTypeName(e){return r.getEnumTypeName(this.config,e)}getEnumImport(e){return`import type { ${r.getEnumTypeName(this.config,e)} } from '${r.adjustImportPathForSegment(this.config.importEnumPath??``,r.getServerSegment(this.config))}';`}};exports.EnumParser=a;
@@ -2,6 +2,6 @@ const e=require(`../../utils/logger.cjs`),t=require(`../../utils/index.cjs`),n=r
2
2
  `).forEach((e,t)=>i.push(t===0?`@description ${e}`:e)),`deprecated`in e&&e.deprecated&&i.push(`@deprecated`),`default`in e&&e.default!==void 0&&i.push(`@default ${this.stringifyValue(e.default)}`),`example`in e&&e.example!==void 0&&i.push(`@example ${this.stringifyValue(e.example)}`),`format`in e&&e.format&&i.push(`@format ${e.format}`);let c=[[`pattern`,`@pattern`],[`minimum`,`@minimum`],[`maximum`,`@maximum`],[`exclusiveMinimum`,`@exclusiveMinimum`],[`exclusiveMaximum`,`@exclusiveMaximum`],[`minLength`,`@minLength`],[`maxLength`,`@maxLength`],[`minItems`,`@minItems`],[`maxItems`,`@maxItems`]],l=e;if(c.some(([e])=>l[e]!==void 0)){let e=c.map(([e,t])=>l[e]===void 0?``:`${t} ${this.stringifyValue(l[e])}`).filter(Boolean);i.push(...e)}if(!i.length)return``;let u=[`${r}/**`];return i.forEach(e=>{e&&(e.includes(`
3
3
  `)?e.split(`
4
4
  `).forEach(e=>u.push(`${r} * ${e}`)):u.push(`${r} * ${e}`))}),u.push(`${r} */`),u.join(`
5
- `)}nameTheHumpCenterStroke(e){let t=e.replace(`#/components/schemas/`,``),n=r.resolveSchemaName(t),i={typeName:n,fileName:r.typeNameToFileName(n),dataType:``};if(this.schemas){let e=this.schemas[t];e?.enum?i.dataType=`enum`:i.dataType=e?.type}return i}parseRef(e){if(!e?.trim())return{headerRefStr:``,typeName:``,dataType:``};let{fileName:t,typeName:n,dataType:i=``}=this.nameTheHumpCenterStroke(e),a;return a=i===`enum`?`import type { ${r.getEnumTypeName(this.config,n)} } from '${this.config.importEnumPath}';`:`import type { ${n} } from './${t}';`,{headerRefStr:a,typeName:n,dataType:i}}parseArray(e,i){let a=e,{items:o={},nullable:s}=a,c=o?.$ref;if(c){let{headerRefStr:e,typeName:o,dataType:l}=this.parseRef(c),u=a.example;if(l===`enum`&&typeof u==`string`&&t.isValidJSON(u)){let e=this.enumParser.convertJsonToEnumString(u,o);this.enumParser.addEnumByName(o,e)}let d=l===`enum`?r.getEnumTypeName(this.config,o):o;return{headerRef:e,renderStr:`${n.getIndentation(this.config)}${i}${this.isRequired(i)?``:`?`}: Array<${d}>${this.nullable(s)};`,typeName:d}}let l=o?.type,u=l===`integer`?`number`:l;return l===`object`&&(u=`Record<string, unknown>`),{headerRef:``,renderStr:`${n.getIndentation(this.config)}${i}${this.isRequired(i)?``:`?`}: Array<${u}>${this.nullable(s)};`,typeName:u}}parseBoolean(e,t){return e.type===`boolean`?`${n.getIndentation(this.config)}${t}${this.isRequired(t)?``:`?`}: boolean${this.nullable(e.nullable)};`:``}parseInteger(e,t){return Array.isArray(e.enum)?this.enumParser.handleEnum(e,t,this.isRequired(t))?.renderStr??``:`${n.getIndentation(this.config)}${t}${this.isRequired(t)?``:`?`}: number${this.nullable(e.nullable)};`}parseNumber(e,t){if(e.type!==`number`)return null;if(e.enum){let n=this.enumParser.handleEnum(e,t,this.isRequired(t));if(n)return n}return{headerRef:``,renderStr:`${n.getIndentation(this.config)}${t}${this.isRequired(t)?``:`?`}: number${this.nullable(e.nullable)};`}}getStringTypeByFormat(e){if(!e)return`string`;switch(e){case`date-time`:case`date`:case`time`:return`Date`;case`email`:case`idn-email`:case`uuid`:case`uri`:case`uri-reference`:case`iri`:case`iri-reference`:case`hostname`:case`idn-hostname`:case`ipv4`:case`ipv6`:return`string`;case`binary`:return`File`;default:return`string`}}parseString(e,t){if(e.type!==`string`)return null;if(e.enum){let n=this.enumParser.handleEnum(e,t,this.isRequired(t));if(n)return n}let r=this.getStringTypeByFormat(e.format);return{headerRef:``,renderStr:`${n.getIndentation(this.config)}${t}${this.isRequired(t)?``:`?`}: ${r}${this.nullable(e.nullable)};`}}parseObject(e,t){let r=``,i=``;if(e.type===`object`){let a=e;if(typeof a.additionalProperties==`object`){let e=this.parseArray(a.additionalProperties,t)??this.defaultReturn;r=e?.headerRef??``,i=e?.renderStr??``}i=typeof a.additionalProperties==`boolean`?`${n.getIndentation(this.config)}${t}${this.isRequired(t)?``:`?`}: Record<string, unknown>${this.nullable(a.nullable)};`:`${n.getIndentation(this.config)}${t}${this.isRequired(t)?``:`?`}: ${e.type}${this.nullable(e.nullable)};`}return{headerRef:r,renderStr:i}}parseProperties(e,i){let a=[],o=[];if(!e)return{headerRef:``,renderStr:`export interface ${i} {}`};let s=Object.keys(e).sort();for(let c of s){let s=e[c];if(s?.$ref){let{headerRefStr:e,typeName:l,dataType:u}=this.parseRef(s.$ref);!o.includes(e)&&l!==i&&o.push(e);let d=s,f=this.buildDocComment(d,c);f!==``&&a.push(f);let p=u===`enum`?r.getEnumTypeName(this.config,l):l;a.push(`${n.getIndentation(this.config)}${c}${this.isRequired(c)?``:`?`}: ${p};`);let m=s.example;if(u===`enum`&&m&&t.isValidJSON(m)){let e=this.enumParser.convertJsonToEnumString(m,l);this.enumParser.addEnumByName(l,e)}continue}if(`allOf`in s||`anyOf`in s||`oneOf`in s){let e=s.allOf?.length?`allOf`:s.anyOf?.length?`anyOf`:s.oneOf?.length?`oneOf`:null;if(e){let t=e===`allOf`?` & `:` | `,l=s[e],u=[];for(let e of l)if(e?.$ref){let{headerRefStr:t,typeName:n,dataType:a}=this.parseRef(e.$ref),s=a===`enum`?r.getEnumTypeName(this.config,n):n;!o.includes(t)&&n!==i&&o.push(t),u.push(s)}else switch(e.type){case`string`:u.push(`string`);break;case`number`:case`integer`:u.push(`number`);break;case`boolean`:u.push(`boolean`);break;case`array`:u.push(`unknown[]`);break;case`object`:u.push(`Record<string, unknown>`);break;default:u.push(`unknown`);break}if(u.length>0){let e=this.buildDocComment(s,c);e!==``&&a.push(e);let r=u.join(t),i=u.length>1&&s.nullable?`(${r})`:r;a.push(`${n.getIndentation(this.config)}${c}${this.isRequired(c)?``:`?`}: ${i}${this.nullable(s.nullable)};`);continue}}}let l=s,u=this.buildDocComment(l,c);switch(u!==``&&a.push(u),l.type){case`array`:{let e=this.parseArray(l,c)??this.defaultReturn;a.push(e?.renderStr??``),!o.includes(e.headerRef)&&i!==e.typeName&&o.push(e.headerRef)}break;case`boolean`:a.push(this.parseBoolean(l,c));break;case`integer`:a.push(this.parseInteger(l,c));break;case`number`:{let e=this.parseNumber(l,c);e&&(e.headerRef&&!o.includes(e.headerRef)&&o.push(e.headerRef),a.push(e.renderStr))}break;case`string`:if(l.enum){let e=this.enumParser.handleEnum(l,c,this.isRequired(c));e&&(e.headerRef&&!o.includes(e.headerRef)&&o.push(e.headerRef),e.renderStr&&a.push(e.renderStr))}else a.push(this.parseString(l,c)?.renderStr??``);break;case`object`:{let{headerRef:e,renderStr:t}=this.parseObject(l,c)??this.defaultReturn;a.push(t),o.includes(e)||o.push(e)}break}}let c=[`export interface ${i} {`,...a,`}`];if(o.length>0){let e=o.filter(e=>e!==``);e.length>0&&e.push(``),c.unshift(...e)}let l=c.join(`
5
+ `)}nameTheHumpCenterStroke(e){let t=e.replace(`#/components/schemas/`,``),n=r.resolveSchemaName(t),i={typeName:n,fileName:r.typeNameToFileName(n),dataType:``};if(this.schemas){let e=this.schemas[t];e?.enum?i.dataType=`enum`:i.dataType=e?.type}return i}parseRef(e){if(!e?.trim())return{headerRefStr:``,typeName:``,dataType:``};let{fileName:t,typeName:n,dataType:i=``}=this.nameTheHumpCenterStroke(e),a;if(i===`enum`){let e=r.getEnumTypeName(this.config,n),t=r.getServerSegment(this.config);a=`import type { ${e} } from '${r.adjustImportPathForSegment(this.config.importEnumPath??``,t)}';`}else a=`import type { ${n} } from './${t}';`;return{headerRefStr:a,typeName:n,dataType:i}}parseArray(e,i){let a=e,{items:o={},nullable:s}=a,c=o?.$ref;if(c){let{headerRefStr:e,typeName:o,dataType:l}=this.parseRef(c),u=a.example;if(l===`enum`&&typeof u==`string`&&t.isValidJSON(u)){let e=this.enumParser.convertJsonToEnumString(u,o);this.enumParser.addEnumByName(o,e)}let d=l===`enum`?r.getEnumTypeName(this.config,o):o;return{headerRef:e,renderStr:`${n.getIndentation(this.config)}${i}${this.isRequired(i)?``:`?`}: Array<${d}>${this.nullable(s)};`,typeName:d}}let l=o?.type,u=l===`integer`?`number`:l;return l===`object`&&(u=`Record<string, unknown>`),{headerRef:``,renderStr:`${n.getIndentation(this.config)}${i}${this.isRequired(i)?``:`?`}: Array<${u}>${this.nullable(s)};`,typeName:u}}parseBoolean(e,t){return e.type===`boolean`?`${n.getIndentation(this.config)}${t}${this.isRequired(t)?``:`?`}: boolean${this.nullable(e.nullable)};`:``}parseInteger(e,t){return Array.isArray(e.enum)?this.enumParser.handleEnum(e,t,this.isRequired(t))?.renderStr??``:`${n.getIndentation(this.config)}${t}${this.isRequired(t)?``:`?`}: number${this.nullable(e.nullable)};`}parseNumber(e,t){if(e.type!==`number`)return null;if(e.enum){let n=this.enumParser.handleEnum(e,t,this.isRequired(t));if(n)return n}return{headerRef:``,renderStr:`${n.getIndentation(this.config)}${t}${this.isRequired(t)?``:`?`}: number${this.nullable(e.nullable)};`}}getStringTypeByFormat(e){if(!e)return`string`;switch(e){case`date-time`:case`date`:case`time`:return`Date`;case`email`:case`idn-email`:case`uuid`:case`uri`:case`uri-reference`:case`iri`:case`iri-reference`:case`hostname`:case`idn-hostname`:case`ipv4`:case`ipv6`:return`string`;case`binary`:return`File`;default:return`string`}}parseString(e,t){if(e.type!==`string`)return null;if(e.enum){let n=this.enumParser.handleEnum(e,t,this.isRequired(t));if(n)return n}let r=this.getStringTypeByFormat(e.format);return{headerRef:``,renderStr:`${n.getIndentation(this.config)}${t}${this.isRequired(t)?``:`?`}: ${r}${this.nullable(e.nullable)};`}}parseObject(e,t){let r=``,i=``;if(e.type===`object`){let a=e;if(typeof a.additionalProperties==`object`){let e=this.parseArray(a.additionalProperties,t)??this.defaultReturn;r=e?.headerRef??``,i=e?.renderStr??``}i=typeof a.additionalProperties==`boolean`?`${n.getIndentation(this.config)}${t}${this.isRequired(t)?``:`?`}: Record<string, unknown>${this.nullable(a.nullable)};`:`${n.getIndentation(this.config)}${t}${this.isRequired(t)?``:`?`}: ${e.type}${this.nullable(e.nullable)};`}return{headerRef:r,renderStr:i}}parseProperties(e,i){let a=[],o=[];if(!e)return{headerRef:``,renderStr:`export interface ${i} {}`};let s=Object.keys(e).sort();for(let c of s){let s=e[c];if(s?.$ref){let{headerRefStr:e,typeName:l,dataType:u}=this.parseRef(s.$ref);!o.includes(e)&&l!==i&&o.push(e);let d=s,f=this.buildDocComment(d,c);f!==``&&a.push(f);let p=u===`enum`?r.getEnumTypeName(this.config,l):l;a.push(`${n.getIndentation(this.config)}${c}${this.isRequired(c)?``:`?`}: ${p};`);let m=s.example;if(u===`enum`&&m&&t.isValidJSON(m)){let e=this.enumParser.convertJsonToEnumString(m,l);this.enumParser.addEnumByName(l,e)}continue}if(`allOf`in s||`anyOf`in s||`oneOf`in s){let e=s.allOf?.length?`allOf`:s.anyOf?.length?`anyOf`:s.oneOf?.length?`oneOf`:null;if(e){let t=e===`allOf`?` & `:` | `,l=s[e],u=[];for(let e of l)if(e?.$ref){let{headerRefStr:t,typeName:n,dataType:a}=this.parseRef(e.$ref),s=a===`enum`?r.getEnumTypeName(this.config,n):n;!o.includes(t)&&n!==i&&o.push(t),u.push(s)}else switch(e.type){case`string`:u.push(`string`);break;case`number`:case`integer`:u.push(`number`);break;case`boolean`:u.push(`boolean`);break;case`array`:u.push(`unknown[]`);break;case`object`:u.push(`Record<string, unknown>`);break;default:u.push(`unknown`);break}if(u.length>0){let e=this.buildDocComment(s,c);e!==``&&a.push(e);let r=u.join(t),i=u.length>1&&s.nullable?`(${r})`:r;a.push(`${n.getIndentation(this.config)}${c}${this.isRequired(c)?``:`?`}: ${i}${this.nullable(s.nullable)};`);continue}}}let l=s,u=this.buildDocComment(l,c);switch(u!==``&&a.push(u),l.type){case`array`:{let e=this.parseArray(l,c)??this.defaultReturn;a.push(e?.renderStr??``),!o.includes(e.headerRef)&&i!==e.typeName&&o.push(e.headerRef)}break;case`boolean`:a.push(this.parseBoolean(l,c));break;case`integer`:a.push(this.parseInteger(l,c));break;case`number`:{let e=this.parseNumber(l,c);e&&(e.headerRef&&!o.includes(e.headerRef)&&o.push(e.headerRef),a.push(e.renderStr))}break;case`string`:if(l.enum){let e=this.enumParser.handleEnum(l,c,this.isRequired(c));e&&(e.headerRef&&!o.includes(e.headerRef)&&o.push(e.headerRef),e.renderStr&&a.push(e.renderStr))}else a.push(this.parseString(l,c)?.renderStr??``);break;case`object`:{let{headerRef:e,renderStr:t}=this.parseObject(l,c)??this.defaultReturn;a.push(t),o.includes(e)||o.push(e)}break}}let c=[`export interface ${i} {`,...a,`}`];if(o.length>0){let e=o.filter(e=>e!==``);e.length>0&&e.push(``),c.unshift(...e)}let l=c.join(`
6
6
  `);return{headerRef:o.join(`
7
7
  `),renderStr:l}}generateContent(t,n){if(`items`in t)return e.log.warn(`数组类型未处理: ${n}`),``;switch(t.type){case`boolean`:return this.parseBoolean(t,n);case`integer`:return this.parseInteger(t,n);case`number`:return this.parseNumber(t,n)?.renderStr??``;case`object`:return this.parseProperties(t.properties,n)?.renderStr??``;case`string`:return this.parseString(t,n)?.renderStr??``;default:return``}}main(){if(!this.schemas)return e.log.warn(`schemas 为空`),{enumsMap:this.enumParser.enumsMap,schemasMap:this.schemasMap};let t=Object.keys(this.schemas).sort();for(let n of t){let t=this.schemas[n];if(`$ref`in t){e.log.warn(`跳过 ReferenceObject: ${n}`);continue}let i=`type`in t?t:null;if(!i?.type){e.log.warn(`无效的 schema 对象: ${n}`);continue}if(Array.isArray(t.enum)){let e=r.resolveSchemaName(n),i=this.enumParser.parseEnum(t,e);i?.renderStr&&!this.enumParser.hasEnum(e)&&this.enumParser.addEnumByName(e,i.renderStr);continue}this.requiredFieldSet=new Set(t.required??[]);let a=r.resolveSchemaName(n),o=r.typeNameToFileName(a),s=this.generateContent(i,a);s&&((s.includes(`export enum `)||s.includes(`export const `)&&s.includes(`as const`))&&!this.enumParser.hasEnum(a)?this.enumParser.addEnumByName(a,s):this.schemasMap.set(a,{fileName:o,content:s}))}return{enumsMap:this.enumParser.enumsMap,schemasMap:this.schemasMap}}};exports.ComponentSchemaResolver=o;
@@ -1 +1 @@
1
- const e=require(`../../utils/logger.cjs`),t=require(`../../utils/index.cjs`),n=require(`../shared/constants.cjs`),r=require(`../shared/writer.cjs`);var i=class{config;appendMode;constructor(e,t){this.config=e,this.appendMode=t?.appendMode??!1}async writeSchemas(i){let a=[],o=[],s=`${this.config.saveTypeFolderPath}/models/`,c=Array.from(i.values()).sort((e,t)=>e.fileName.localeCompare(t.fileName));for(let r of c)a.push((async({fileName:r,content:i})=>{o.push(`export * from './${r}';`);let a=`${s}${r}.ts`;await t.writeFileRecursive(a,i),e.log.info(`${a.padEnd(n.PAD_END)} - Write done!`)})(r));await Promise.allSettled(a),o.sort(),await r.writeIndexFileWithDedup(`${s}index.ts`,o,{appendMode:this.appendMode}),e.log.success(`Component parse & write done!`)}async writeEnums(i){let a=[],o=[],s=Array.from(i.values()).sort((e,t)=>e.fileName.localeCompare(t.fileName));for(let r of s)a.push((async({fileName:r,content:i})=>{o.push(`export * from './${r}';`);let a=`${this.config.saveEnumFolderPath}/${r}.ts`;await t.writeFileRecursive(a,i),e.log.info(`${a.padEnd(n.PAD_END)} - Write done!`)})(r));await Promise.all(a),o.sort(),await r.writeIndexFileWithDedup(`${this.config.saveEnumFolderPath}/index.ts`,o,{appendMode:this.appendMode}),e.log.success(`Enums write done!`)}};exports.ComponentWriter=i;
1
+ const e=require(`../../_virtual/rolldown_runtime.cjs`),t=require(`../../utils/logger.cjs`),n=require(`../../utils/index.cjs`),r=require(`../shared/naming.cjs`),i=require(`../shared/constants.cjs`),a=require(`../shared/writer.cjs`);let o=require(`fs`);o=e.__toESM(o);var s=class{config;appendMode;constructor(e,t){this.config=e,this.appendMode=t?.appendMode??!1}async writeSchemas(e){let o=[],s=r.getServerSegment(this.config),c=s?`${s}/`:``,l=`${this.config.saveTypeFolderPath}/models/${c}`;await n.runWithConcurrency(Array.from(e.values()).sort((e,t)=>e.fileName.localeCompare(t.fileName)),32,async({fileName:e,content:r})=>{o.push(`export * from './${e}';`);let a=`${l}${e}.ts`;try{await n.writeFileRecursive(a,r),t.log.info(`${a.padEnd(i.PAD_END)} - Write done!`)}catch(e){t.log.warning(`${a} - Write failed: ${e instanceof Error?e.message:String(e)}`)}}),o.sort(),await a.writeIndexFileWithDedup(`${l}index.ts`,o,{appendMode:this.appendMode}),t.log.step(`Components parsed & written`)}async writeEnums(e){let r=[];await n.runWithConcurrency(Array.from(e.values()).sort((e,t)=>e.fileName.localeCompare(t.fileName)),32,async({fileName:e,content:a})=>{r.push(`export * from './${e}';`);let s=`${this.config.saveEnumFolderPath}/${e}.ts`;if(this.appendMode)try{await o.default.promises.readFile(s,`utf8`)!==a&&t.log.warning(`Enum 文件冲突:${s} 已存在且内容不同,将被当前服务覆盖。请检查不同 swagger 服务是否定义了同名但语义不一致的枚举。`)}catch{}await n.writeFileRecursive(s,a),t.log.info(`${s.padEnd(i.PAD_END)} - Write done!`)}),r.sort(),await a.writeIndexFileWithDedup(`${this.config.saveEnumFolderPath}/index.ts`,r,{appendMode:this.appendMode}),t.log.step(`Enums written`)}};exports.ComponentWriter=s;
@@ -1,10 +1,10 @@
1
- const e=require(`../_virtual/rolldown_runtime.cjs`),t=require(`../utils/logger.cjs`),n=require(`../utils/index.cjs`),r=require(`./components/index.cjs`),i=require(`./get-data.cjs`),a=require(`./path/index.cjs`);let o=require(`fs`);o=e.__toESM(o);let s=require(`path`);s=e.__toESM(s);let c=require(`shelljs`),l=require(`chalk`);l=e.__toESM(l);let u=require(`jiti`),d;const f=process.env.NODE_ENV===`debug`,p={saveTypeFolderPath:f?`apps/types`:`src/types`,saveApiListFolderPath:f?`apps/types`:`src/apis`,saveEnumFolderPath:f?`apps/enums`:`src/enums`,importEnumPath:`../../../enums`,requestMethodsImportPath:`./config/fetch`,formatting:{indentation:` `,lineEnding:`
2
- `},swaggerConfig:{url:`https://generator3.swagger.io/openapi.json`,apiListFileName:`index.ts`,headers:{},dataLevel:`serve`,parameterSeparator:`_`,includeInterface:[],excludeInterface:[]},enmuConfig:{erasableSyntaxOnly:!1,varnames:`enum-varnames`,comment:`enum-descriptions`}};var m=class{schemas={};paths={};async handle(e,n,o){try{t.spinner.start(`Fetching Swagger data...`);let s=await i.getSwaggerJson(e);if(!s)throw t.spinner.error(`Failed to fetch Swagger data`),Error(`无法获取 Swagger 数据`);t.spinner.success(`Swagger data fetched`),this.schemas=s.components?.schemas??{},this.paths=s.paths??{};let c=new r.default(this.schemas,e,{appendMode:n}),l=new a.default(this.paths,s.components?.parameters,this.schemas,e);return t.spinner.start(`Generating types and APIs...`),await c.handle(),await l.handle(),t.spinner.success(`Types and APIs generated`),o===`gen`?l.getGeneratedInterfacesForOutput():o===`miss`?l.getMissingInterfacesForOutput():null}catch(e){throw e instanceof Error?Error(`Handle Swagger data failed: ${e.message}`):Error(`Handle Swagger data failed: unknown error`)}}async resolvePrettierExecutable(){let e=process.platform===`win32`,n=s.default.join(process.cwd(),`node_modules`,`.bin`,e?`prettier.cmd`:`prettier`);try{return await o.default.promises.access(n,o.default.constants.X_OK),t.log.info(`Using local prettier: ${n}`),`"${n}"`}catch{return`npx prettier`}}async detectPrettierConfig(){for(let e of[`.prettierrc`,`.prettierrc.json`,`.prettierrc.json5`,`.prettierrc.yaml`,`.prettierrc.yml`,`.prettierrc.js`,`.prettierrc.cjs`,`.prettierrc.mjs`,`.prettierrc.ts`,`.prettierrc.cts`,`.prettierrc.mts`,`prettier.config.js`,`prettier.config.cjs`,`prettier.config.mjs`,`prettier.config.ts`,`prettier.config.cts`,`prettier.config.mts`]){let n=s.default.join(process.cwd(),e);try{return await o.default.promises.access(n),t.log.info(`Auto-detected prettier config: ${e}`),n}catch{}}try{let e=await o.default.promises.readFile(s.default.join(process.cwd(),`package.json`),`utf8`);if(JSON.parse(e).prettier)return t.log.info(`Using prettier config from package.json`),s.default.join(process.cwd(),`package.json`)}catch{}return null}async formatGeneratedFiles(e,n){let r=await this.resolvePrettierExecutable(),i=``;if(typeof n==`string`&&n.trim()){let e=s.default.resolve(process.cwd(),n.trim());try{await o.default.promises.access(e),i=` --config "${e}"`}catch{t.log.warning(`Prettier config file not found: ${n}, falling back to auto-detection...`);let e=await this.detectPrettierConfig();e&&(i=` --config "${e}"`)}}else{let e=await this.detectPrettierConfig();e&&(i=` --config "${e}"`)}let a=[],u=async(e,t)=>{try{await o.default.promises.access(e),a.push(`"${e}/${t}"`)}catch{}};if(await u(e.saveTypeFolderPath,`**/*.{ts,d.ts}`),await u(e.saveApiListFolderPath,`**/*.ts`),await u(e.saveEnumFolderPath,`**/*.ts`),a.length===0){t.log.warning(`No generated directories found to format.`);return}let d=`${r} --write ${a.join(` `)}${i}`;try{t.spinner.start(`Formatting generated files...`);let{stderr:e}=await new Promise((e,t)=>{(0,c.exec)(d,(n,r,i)=>{n?t(Error(String(n))):e({stdout:r,stderr:i})})});e&&(t.log.print(`
3
- `),t.log.print(`$`,l.default.yellow(d)),t.log.print(`
1
+ const e=require(`../_virtual/rolldown_runtime.cjs`),t=require(`../utils/logger.cjs`),n=require(`../utils/index.cjs`),r=require(`./shared/naming.cjs`),i=require(`./components/index.cjs`),a=require(`./get-data.cjs`),o=require(`./path/index.cjs`);let s=require(`inquirer`);s=e.__toESM(s);let c=require(`fs`);c=e.__toESM(c);let l=require(`path`);l=e.__toESM(l);let u=require(`shelljs`),d=require(`chalk`);d=e.__toESM(d);let f=require(`jiti`),p;const m=process.env.NODE_ENV===`debug`,h={saveTypeFolderPath:m?`apps/types`:`src/types`,saveApiListFolderPath:m?`apps/types`:`src/apis`,saveEnumFolderPath:m?`apps/enums`:`src/enums`,importEnumPath:`../../../enums`,requestMethodsImportPath:`./config/fetch`,formatting:{indentation:` `,lineEnding:`
2
+ `},swaggerConfig:{url:`https://generator3.swagger.io/openapi.json`,apiListFileName:`index.ts`,headers:{},dataLevel:`serve`,parameterSeparator:`_`,includeInterface:[],excludeInterface:[]},enmuConfig:{erasableSyntaxOnly:!1,varnames:`enum-varnames`,comment:`enum-descriptions`}};var g=class{schemas={};paths={};async handle(e,n,s){let c=r.getServiceTag(e);t.log.section(c||`service`,e.swaggerJsonUrl);try{t.spinner.start(`Fetching Swagger data...`);let r=await a.getSwaggerJson(e);if(!r)throw t.spinner.error(`Failed to fetch Swagger data`),Error(`无法获取 Swagger 数据`);t.spinner.success(`Swagger data fetched`),this.schemas=r.components?.schemas??{},this.paths=r.paths??{};let c=new i.default(this.schemas,e,{appendMode:n}),l=new o.default(this.paths,r.components?.parameters,this.schemas,e);return t.spinner.start(`Generating types and APIs...`),await c.handle(),await l.handle(),t.spinner.success(`Types and APIs generated`),s===`gen`?l.getGeneratedInterfacesForOutput():s===`miss`?l.getMissingInterfacesForOutput():null}catch(e){throw e instanceof Error?Error(`Handle Swagger data failed: ${e.message}`):Error(`Handle Swagger data failed: unknown error`)}}async resolvePrettierExecutable(){let e=process.platform===`win32`,n=l.default.join(process.cwd(),`node_modules`,`.bin`,e?`prettier.cmd`:`prettier`);try{return await c.default.promises.access(n,c.default.constants.X_OK),t.log.info(`Using local prettier: ${n}`),`"${n}"`}catch{return`npx prettier`}}async detectPrettierConfig(){for(let e of[`.prettierrc`,`.prettierrc.json`,`.prettierrc.json5`,`.prettierrc.yaml`,`.prettierrc.yml`,`.prettierrc.js`,`.prettierrc.cjs`,`.prettierrc.mjs`,`.prettierrc.ts`,`.prettierrc.cts`,`.prettierrc.mts`,`prettier.config.js`,`prettier.config.cjs`,`prettier.config.mjs`,`prettier.config.ts`,`prettier.config.cts`,`prettier.config.mts`]){let n=l.default.join(process.cwd(),e);try{return await c.default.promises.access(n),t.log.info(`Auto-detected prettier config: ${e}`),n}catch{}}try{let e=await c.default.promises.readFile(l.default.join(process.cwd(),`package.json`),`utf8`);if(JSON.parse(e).prettier)return t.log.info(`Using prettier config from package.json`),l.default.join(process.cwd(),`package.json`)}catch{}return null}async formatGeneratedFiles(e,n){let r=await this.resolvePrettierExecutable(),i=``;if(typeof n==`string`&&n.trim()){let e=l.default.resolve(process.cwd(),n.trim());try{await c.default.promises.access(e),i=` --config "${e}"`}catch{t.log.warning(`Prettier config file not found: ${n}, falling back to auto-detection...`);let e=await this.detectPrettierConfig();e&&(i=` --config "${e}"`)}}else{let e=await this.detectPrettierConfig();e&&(i=` --config "${e}"`)}let a=[],o=async(e,t)=>{try{await c.default.promises.access(e),a.push(`"${e}/${t}"`)}catch{}};if(await o(e.saveTypeFolderPath,`**/*.{ts,d.ts}`),await o(e.saveApiListFolderPath,`**/*.ts`),await o(e.saveEnumFolderPath,`**/*.ts`),a.length===0){t.log.warning(`No generated directories found to format.`);return}let s=`${r} --write ${a.join(` `)}${i}`;try{t.spinner.start(`Formatting generated files...`);let{stderr:e}=await new Promise((e,t)=>{(0,u.exec)(s,(n,r,i)=>{n?t(Error(String(n))):e({stdout:r,stderr:i})})});e&&(t.log.print(`
3
+ `),t.log.print(`$`,d.default.yellow(s)),t.log.print(`
4
4
  `)),t.spinner.success(`File formatting successful`),t.log.print(`
5
- `)}catch(e){t.spinner.error(`Format failed`),t.log.print(``),t.log.print(e),t.log.error(`Format failed, please manually execute the following command:`),t.log.print(`$`,l.default.yellow(d)),t.log.print(``)}}async copyAjaxConfigFiles(e){let n=[`dio.ts`,`error-message.ts`,`fetch.ts`,`api-type.d.ts`],r=f?s.default.join(__dirname,`..`,`..`,`postbuild-assets`,`ajax-config`):s.default.join(__dirname,`..`,`ajax-config`),i=s.default.join(e,`config`);try{await o.default.promises.access(i),t.log.info(`config folder already exists at ${i}, skipping generation.`);return}catch{await o.default.promises.mkdir(i,{recursive:!0})}for(let e of n){let n=s.default.join(r,e),a=s.default.join(i,e);try{await o.default.promises.access(n),await o.default.promises.copyFile(n,a),t.log.success(`${e} create done.`)}catch(e){throw e instanceof Error?(t.log.error(`Source file ${n} does not exist`),Error(`Source file ${n} does not exist: ${e.message}`)):Error(`Source file ${n} does not exist: unknown error`)}}}getSystemLocale(){try{return Intl.DateTimeFormat().resolvedOptions().locale.toLowerCase()}catch{return(process.env.LANG??process.env.LC_ALL??process.env.LC_MESSAGES??``).toLowerCase()}}showLegacyConfigHint(e){let n={url:e.swaggerJsonUrl??`https://your.swagger.json`,publicPrefix:e.publicPrefix??``,apiListFileName:e.apiListFileName??`index.ts`,headers:e.headers??{}},r=this.getSystemLocale();r.startsWith(`zh`)||r.includes(`chinese`)?(t.log.print(`
5
+ `)}catch(e){t.spinner.error(`Format failed`),t.log.print(``),t.log.print(e),t.log.error(`Format failed, please manually execute the following command:`),t.log.print(`$`,d.default.yellow(s)),t.log.print(``)}}async copyAjaxConfigFiles(e){let n=[`dio.ts`,`error-message.ts`,`fetch.ts`,`api-type.d.ts`],r=m?l.default.join(__dirname,`..`,`..`,`postbuild-assets`,`ajax-config`):l.default.join(__dirname,`..`,`ajax-config`),i=l.default.join(e,`config`);try{await c.default.promises.access(i),t.log.info(`config folder already exists at ${i}, skipping generation.`);return}catch{await c.default.promises.mkdir(i,{recursive:!0})}for(let e of n){let n=l.default.join(r,e),a=l.default.join(i,e);try{await c.default.promises.access(n),await c.default.promises.copyFile(n,a),t.log.success(`${e} create done.`)}catch(e){throw e instanceof Error?(t.log.error(`Source file ${n} does not exist`),Error(`Source file ${n} does not exist: ${e.message}`)):Error(`Source file ${n} does not exist: unknown error`)}}}getSystemLocale(){try{return Intl.DateTimeFormat().resolvedOptions().locale.toLowerCase()}catch{return(process.env.LANG??process.env.LC_ALL??process.env.LC_MESSAGES??``).toLowerCase()}}showLegacyConfigHint(e){let n={url:e.swaggerJsonUrl??`https://your.swagger.json`,publicPrefix:e.publicPrefix??``,apiListFileName:e.apiListFileName??`index.ts`,headers:e.headers??{}},r=this.getSystemLocale();r.startsWith(`zh`)||r.includes(`chinese`)?(t.log.print(`
6
6
  检测到旧版配置,请更新 an.config.json:`),t.log.print(`1) 将 swaggerJsonUrl / publicPrefix / headers 移到 swaggerConfig 字段。`),t.log.print(`2) 单个服务可直接填写对象,多个服务请使用数组,并确保 apiListFileName 唯一。`),t.log.print(`示例:`),t.log.print(JSON.stringify({swaggerConfig:n},null,2)),t.log.print(``)):(t.log.print(`
7
- Legacy configuration detected, please update an.config.json:`),t.log.print(`1) Move swaggerJsonUrl / publicPrefix / headers to swaggerConfig field.`),t.log.print(`2) Single service can be an object directly, multiple services should use an array, and ensure apiListFileName is unique.`),t.log.print(`Example:`),t.log.print(JSON.stringify({swaggerConfig:n},null,2)),t.log.print(``))}normalizeswaggerConfig(e,t){let n=!1,r=t?e.swaggerConfig:void 0;r||=(n=!0,{url:e.swaggerJsonUrl??``,publicPrefix:e.publicPrefix??``,apiListFileName:e.apiListFileName??`index.ts`,headers:e.headers??{},modulePrefix:e.modulePrefix});let i=(t,r)=>{let i=t.url||e.swaggerJsonUrl;if(!i)throw Error(`swaggerConfig[${r}] 缺少 url,请补充后重试。`);let a=t.publicPrefix??e.publicPrefix??``;!t.url&&e.swaggerJsonUrl&&(n=!0);let o=(t.apiListFileName??e.apiListFileName??`index.ts`).trim()||`index.ts`,s=t.headers??e.headers??{},c=t.dataLevel??e.dataLevel??`serve`,l=t.parameterSeparator??e.parameterSeparator??`_`,u=t.includeInterface??e.includeInterface??[],d=t.excludeInterface??e.excludeInterface??[],f=t.includeTags??e.includeTags,p=t.excludeTags??e.excludeTags,m={url:i,publicPrefix:a,apiListFileName:o,headers:s,dataLevel:c,parameterSeparator:l,includeInterface:u,excludeInterface:d,modulePrefix:t.modulePrefix??e.modulePrefix??``,responseModelTransform:t.responseModelTransform??e.responseModelTransform,timeout:t.timeout??e.timeout};return f!==void 0&&(m.includeTags=f),p!==void 0&&(m.excludeTags=p),m},a=Array.isArray(r)?r.map((e,t)=>i(e,t)):[i(r,0)];if(a.length===0)throw Error(`swaggerConfig 不能为空,请至少配置一个 swagger 服务。`);if(a.length>1){let e=new Set;a.forEach(t=>{if(e.has(t.apiListFileName))throw Error(`swaggerConfig 中 apiListFileName 重复:${t.apiListFileName},请为每个服务设置唯一文件名。`);e.add(t.apiListFileName)})}return n&&this.showLegacyConfigHint(e),a}buildServerConfig(e,t){return{...e,swaggerJsonUrl:t.url,publicPrefix:t.publicPrefix??e.publicPrefix,headers:t.headers,apiListFileName:t.apiListFileName,dataLevel:t.dataLevel,parameterSeparator:t.parameterSeparator,includeInterface:t.includeInterface,excludeInterface:t.excludeInterface,includeTags:t.includeTags,excludeTags:t.excludeTags,modulePrefix:t.modulePrefix,responseModelTransform:t.responseModelTransform??e.responseModelTransform,timeout:t.timeout??e.timeout,swaggerConfig:t}}async loadTsConfig(e){try{let t=await(0,u.createJiti)(__filename,{interopDefault:!0}).import(e),n=`default`in t&&t.default?t.default:t;return d=!0,n}catch(e){d=!0;let t=e instanceof Error?e.message:String(e);throw Error(`配置文件加载失败,请检查 an.config.ts 文件: ${t}`)}}async loadJsonConfig(e){try{let t=await o.default.promises.readFile(e,`utf8`);d=!0;try{return JSON.parse(t)}catch(e){throw d=!0,Error(`配置文件格式错误,请检查 an.config.json 的 JSON 格式是否正确: ${e instanceof Error?e.message:String(e)}`)}}catch(e){throw e instanceof Error&&`code`in e&&e.code,e}}async getConfig(e){let r=s.default.join(e,`an.config.ts`),i=s.default.join(e,`an.config.json`);return o.default.existsSync(r)?(t.log.info(`检测到 an.config.ts 配置文件。`),this.loadTsConfig(r)):o.default.existsSync(i)?this.loadJsonConfig(i):(d=!1,t.log.warning(`配置文件不存在,将自动创建配置文件。`),await n.writeFileRecursive(r,this.generateTsConfigContent()),t.log.success(`配置文件已创建,请检查项目根目录下的 an.config.ts 文件并配置后重新运行。`),p)}generateTsConfigContent(){return`import { defineConfig } from 'anl/config';
7
+ Legacy configuration detected, please update an.config.json:`),t.log.print(`1) Move swaggerJsonUrl / publicPrefix / headers to swaggerConfig field.`),t.log.print(`2) Single service can be an object directly, multiple services should use an array, and ensure apiListFileName is unique.`),t.log.print(`Example:`),t.log.print(JSON.stringify({swaggerConfig:n},null,2)),t.log.print(``))}normalizeswaggerConfig(e,t){let n=!1,r=t?e.swaggerConfig:void 0;r||=(n=!0,{url:e.swaggerJsonUrl??``,publicPrefix:e.publicPrefix??``,apiListFileName:e.apiListFileName??`index.ts`,headers:e.headers??{},modulePrefix:e.modulePrefix});let i=(t,r)=>{let i=t.url||e.swaggerJsonUrl;if(!i)throw Error(`swaggerConfig[${r}] 缺少 url,请补充后重试。`);let a=t.publicPrefix??e.publicPrefix??``;!t.url&&e.swaggerJsonUrl&&(n=!0);let o=(t.apiListFileName??e.apiListFileName??`index.ts`).trim()||`index.ts`;if(/[\\/]/.test(o)||o.includes(`..`))throw Error(`swaggerConfig[${r}].apiListFileName 非法:"${o}",请使用单个文件名(如 "bff.ts"),不要包含路径分隔符或 ".."。`);let s=t.headers??e.headers??{},c=t.dataLevel??e.dataLevel??`serve`,l=t.parameterSeparator??e.parameterSeparator??`_`,u=t.includeInterface??e.includeInterface??[],d=t.excludeInterface??e.excludeInterface??[],f=t.includeTags??e.includeTags,p=t.excludeTags??e.excludeTags,m={url:i,publicPrefix:a,apiListFileName:o,headers:s,dataLevel:c,parameterSeparator:l,includeInterface:u,excludeInterface:d,modulePrefix:t.modulePrefix??e.modulePrefix??``,responseModelTransform:t.responseModelTransform??e.responseModelTransform,timeout:t.timeout??e.timeout,namespaceIsolation:t.namespaceIsolation??e.namespaceIsolation??`segment`};return t.name?.trim()&&(m.name=t.name.trim()),f!==void 0&&(m.includeTags=f),p!==void 0&&(m.excludeTags=p),m},a=Array.isArray(r)?r.map((e,t)=>i(e,t)):[i(r,0)];if(a.length===0)throw Error(`swaggerConfig 不能为空,请至少配置一个 swagger 服务。`);if(a.length>1){let e=new Set;a.forEach(t=>{if(e.has(t.apiListFileName))throw Error(`swaggerConfig 中 apiListFileName 重复:${t.apiListFileName},请为每个服务设置唯一文件名。`);e.add(t.apiListFileName)});let t=new Set;a.forEach(e=>{if(e.name){if(t.has(e.name))throw Error(`swaggerConfig 中 name 重复:${e.name},请为每个服务设置唯一名称。`);t.add(e.name)}})}return n&&this.showLegacyConfigHint(e),a}buildServerConfig(e,t,n,r){return{...e,swaggerJsonUrl:t.url,publicPrefix:t.publicPrefix??e.publicPrefix,headers:t.headers,apiListFileName:t.apiListFileName,dataLevel:t.dataLevel,parameterSeparator:t.parameterSeparator,includeInterface:t.includeInterface,excludeInterface:t.excludeInterface,includeTags:t.includeTags,excludeTags:t.excludeTags,modulePrefix:t.modulePrefix,responseModelTransform:t.responseModelTransform??e.responseModelTransform,timeout:t.timeout??e.timeout,namespaceIsolation:t.namespaceIsolation??e.namespaceIsolation??`segment`,swaggerConfig:t,__segment:n,__namespacePrefix:r}}async loadTsConfig(e){try{let t=await(0,f.createJiti)(__filename,{interopDefault:!0}).import(e),n=`default`in t&&t.default?t.default:t;return p=!0,n}catch(e){p=!0;let t=e instanceof Error?e.message:String(e);throw Error(`配置文件加载失败,请检查 an.config.ts 文件: ${t}`)}}async loadJsonConfig(e){try{let t=await c.default.promises.readFile(e,`utf8`);p=!0;try{return JSON.parse(t)}catch(e){throw p=!0,Error(`配置文件格式错误,请检查 an.config.json 的 JSON 格式是否正确: ${e instanceof Error?e.message:String(e)}`)}}catch(e){throw e instanceof Error&&`code`in e&&e.code,e}}async getConfig(e){let r=l.default.join(e,`an.config.ts`),i=l.default.join(e,`an.config.json`);return c.default.existsSync(r)?(t.log.info(`检测到 an.config.ts 配置文件。`),this.loadTsConfig(r)):c.default.existsSync(i)?this.loadJsonConfig(i):(p=!1,t.log.warning(`配置文件不存在,将自动创建配置文件。`),await n.writeFileRecursive(r,this.generateTsConfigContent()),t.log.success(`配置文件已创建,请检查项目根目录下的 an.config.ts 文件并配置后重新运行。`),h)}generateTsConfigContent(){return`import { defineConfig } from 'anl/config';
8
8
 
9
9
  export default defineConfig({
10
10
  saveTypeFolderPath: 'src/types',
@@ -33,6 +33,12 @@ export default defineConfig({
33
33
  comment: 'enum-descriptions',
34
34
  },
35
35
  });
36
- `}async initialize(e,r,i){let a=process.cwd();try{let s=await this.getConfig(a),c={...p,...s},u=i??c.logLevel;u&&t.setLogLevel(u);let f=Object.prototype.hasOwnProperty.call(s,`swaggerConfig`),m=this.normalizeswaggerConfig(c,f);if(!d)return;await o.default.promises.mkdir(c.saveApiListFolderPath,{recursive:!0}),await this.copyAjaxConfigFiles(c.saveApiListFolderPath),await n.clearDirExcept(c.saveApiListFolderPath,[`config`]),await n.clearDir(c.saveTypeFolderPath),await n.clearDir(c.saveEnumFolderPath);let h=[];for(let t=0;t<m.length;t++){let n=this.buildServerConfig(c,m[t]),r=t>0,i=await this.handle(n,r,e);e&&i&&h.push({serverUrl:m[t].url,list:i})}if(r!==void 0&&r!==!1&&await this.formatGeneratedFiles(c,r),t.log.success(`Successfully, all done, see you next time!`),t.log.print(`
37
- `),e&&h.length>0){let n=e===`miss`?`excludeInterface`:`includeInterface`;for(let{serverUrl:e,list:r}of h)m.length>1?t.log.print(l.default.cyan(`\n[${n}] ${e}`)):t.log.print(l.default.cyan(`\n[${n}]`)),t.log.print(JSON.stringify(r,null,2));t.log.print(`
38
- `)}}catch(e){let n=e instanceof Error?e.message:`Unknown error`;t.log.error(`Initialization failed: ${n}`)}}};f&&new m().initialize().catch(e=>{console.error(e)}),exports.Main=m;
36
+ `}resolveSelectedServiceIndices(e,t){let n=new Map;e.forEach((e,t)=>{e.name&&n.set(e.name.toLowerCase(),t)}),e.forEach((e,t)=>{let i=r.computeSegment(e.apiListFileName).toLowerCase();i&&!n.has(i)&&n.set(i,t)});let i=new Set,a=[];for(let e of t){let t=e.toLowerCase(),r=n.get(t);r===void 0?a.push(e):i.add(r)}if(a.length){let t=e.map(e=>e.name||r.computeSegment(e.apiListFileName)).filter(Boolean).join(`, `);throw Error(`未找到匹配的 swagger 服务:${a.join(`, `)}。可用服务:${t||`<无>`}`)}return Array.from(i).sort((e,t)=>e-t)}async promptSelectServices(e){let t=e.map((e,t)=>{let n=e.name||r.computeSegment(e.apiListFileName)||`#${t}`;return{name:`${n} (${e.apiListFileName} ← ${e.url})`,value:t,short:n}}),{picked:n}=await s.default.prompt([{type:`checkbox`,name:`picked`,message:`请选择需要重新生成的 swagger 服务(空选 = 全部):`,choices:t,pageSize:Math.min(20,t.length)}]);return!n||n.length===0?e.map((e,t)=>t):n.sort((e,t)=>e-t)}async initialize(e,i,a,o){let s=process.cwd();try{let l=await this.getConfig(s),u={...h,...l},f=a??u.logLevel;f&&t.setLogLevel(f);let m=Object.prototype.hasOwnProperty.call(l,`swaggerConfig`),g=this.normalizeswaggerConfig(u,m);if(!p)return;let _=g.length>1,v=_?g.map(e=>r.computeSegment(e.apiListFileName)):g.map(()=>``);if(_){let e=new Map;v.forEach((t,n)=>{if(!t)throw Error(`swaggerConfig[${n}].apiListFileName="${g[n].apiListFileName}" 无法派生有效 segment(清洗后为空),请使用包含字母/数字的文件名。`);if(t.toLowerCase()===`index`)throw Error(`swaggerConfig[${n}].apiListFileName="${g[n].apiListFileName}" 派生 segment 为 "index",会与顶层 models/index.ts 形成自引用,请改为其他文件名(如 "main.ts" / "default.ts")。`);if(e.has(t))throw Error(`swaggerConfig 多个服务的 apiListFileName 在派生 segment 时冲突:"${g[e.get(t)].apiListFileName}" 与 "${g[n].apiListFileName}" 都解析为 "${t}",请改名以避免目录覆盖。`);e.set(t,n)})}let y=g.map(e=>(e.namespaceIsolation??u.namespaceIsolation??`segment`)===`none`?``:r.segmentToNamespacePrefix(r.computeSegment(e.apiListFileName)));if(_){let e=g.map((e,t)=>({s:e,idx:t})).filter(({s:e})=>(e.namespaceIsolation??u.namespaceIsolation??`segment`)===`none`).map(({s:e})=>e.apiListFileName);e.length>0&&t.log.warning(`检测到多服务场景下以下服务关闭了 namespace 前缀(namespaceIsolation: 'none'):${e.join(`, `)} 不同服务若存在同名 path,将会因 declare namespace 全局合并而互相污染类型,请确认是否符合预期。`);let n=new Map;y.forEach((e,t)=>{if(e){if(n.has(e))throw Error(`swaggerConfig 多个服务派生的 namespace 前缀冲突:"${g[n.get(e)].apiListFileName}" "${g[t].apiListFileName}" 都解析为前缀 "${e}",请改名以避免类型同名合并。`);n.set(e,t)}})}let b,x;o?.length?(b=this.resolveSelectedServiceIndices(g,o),x=b.length!==g.length):g.length>1&&process.stdin.isTTY&&process.stdout.isTTY?(t.log.print(d.default.cyan(`
37
+ 检测到多个 swagger 服务,请选择本次要重新生成的服务:`)),b=await this.promptSelectServices(g),x=b.length!==g.length):(b=g.map((e,t)=>t),x=!1),this.printExecutionPlan(g,b,x),await c.default.promises.mkdir(u.saveApiListFolderPath,{recursive:!0}),await this.copyAjaxConfigFiles(u.saveApiListFolderPath),x?await this.cleanSelectedTargets(u,g,b,v,_):(await n.clearDirExcept(u.saveApiListFolderPath,[`config`]),await n.clearDir(u.saveTypeFolderPath),await n.clearDir(u.saveEnumFolderPath));let S=[];for(let t=0;t<b.length;t++){let n=b[t],r=this.buildServerConfig(u,g[n],v[n],y[n]),i=x?!0:t>0,a=await this.handle(r,i,e);e&&a&&S.push({serverUrl:g[n].url,list:a})}if(_&&await this.writeTopLevelModelsBarrel(u,v,b,x),i!==void 0&&i!==!1&&(x?await this.formatSelectedFiles(u,g,b,v,_,i):await this.formatGeneratedFiles(u,i)),t.log.banner(`All done — see you next time!`),e&&S.length>0){let n=e===`miss`?`excludeInterface`:`includeInterface`;for(let{serverUrl:e,list:r}of S)b.length>1?t.log.print(d.default.cyan(`\n[${n}] ${e}`)):t.log.print(d.default.cyan(`\n[${n}]`)),t.log.print(JSON.stringify(r,null,2));t.log.print(`
38
+ `)}}catch(e){let n=e instanceof Error?e.message:`Unknown error`;t.log.error(`Initialization failed: ${n}`),process.exitCode=1}}printExecutionPlan(e,n,i){let a=new Set(n);t.log.print(d.default.cyan(i?`
39
+ [anl type] 选择型生成,仅处理以下服务:`:`
40
+ [anl type] 全量生成,将处理所有服务:`)),e.forEach((e,n)=>{let i=e.name||r.computeSegment(e.apiListFileName)||`#${n}`;a.has(n)?t.log.print(` ${d.default.green(`●`)} ${i} (${e.apiListFileName}) ${d.default.gray(e.url)}`):t.log.print(` ${d.default.gray(`○ skip `)}${i} (${e.apiListFileName}) ${d.default.gray(e.url)}`)}),t.log.print(``)}async cleanSelectedTargets(e,t,r,i,a){for(let o of r)if(await n.clearDir(`${e.saveApiListFolderPath}/${t[o].apiListFileName}`),a){let t=i[o];t&&(await n.clearDir(`${e.saveTypeFolderPath}/connectors/${t}`),await n.clearDir(`${e.saveTypeFolderPath}/models/${t}`))}else await n.clearDir(`${e.saveTypeFolderPath}/connectors`),await n.clearDir(`${e.saveTypeFolderPath}/models`)}async writeTopLevelModelsBarrel(e,i,a,o){let s=`${e.saveTypeFolderPath}/models/index.ts`,l=e=>{let t=r.segmentToNamespacePrefix(e);if(!t)throw Error(`无法为 segment "${e}" 生成 namespace 别名,请改用包含字母/数字的 apiListFileName。`);return`export * as ${t} from './${e}';`},u=o?a.map(e=>i[e]).filter(Boolean):i.filter(Boolean),d=u.map(e=>l(e)),f=e=>{let t=e.match(/from\s+['"]\.\/([^'\"]+)['"]/);return t?t[1]:null},p;if(o){let e=[];try{e=(await c.default.promises.readFile(s,`utf8`)).split(`
41
+ `).filter(e=>e.trim()!==``)}catch{e=[]}let t=new Set(u);p=[...e.filter(e=>{let n=f(e);return!(n&&t.has(n))}).map(e=>{let t=f(e);if(!t||/export\s+\*\s+as\s+/.test(e))return e;try{return l(t)}catch{return e}}),...d]}else p=d;await n.writeFileRecursive(s,p.join(`
42
+ `)+`
43
+ `),t.log.info(`${s} - Top-level models barrel ${o?`merged`:`written`}.`)}async formatSelectedFiles(e,n,r,i,a,o){let s=[];for(let t of r){let r=`${e.saveApiListFolderPath}/${n[t].apiListFileName}`;try{await c.default.promises.access(r),s.push(`"${r}"`)}catch{}let o=a&&i[t]?[`${e.saveTypeFolderPath}/connectors/${i[t]}`,`${e.saveTypeFolderPath}/models/${i[t]}`]:[`${e.saveTypeFolderPath}/connectors`,`${e.saveTypeFolderPath}/models`];for(let e of o)try{await c.default.promises.access(e),s.push(`"${e}/**/*.{ts,d.ts}"`)}catch{}}if(s.length===0){t.log.warning(`No files to format for the selected services.`);return}let f=await this.resolvePrettierExecutable(),p=``;if(typeof o==`string`&&o.trim()){let e=l.default.resolve(process.cwd(),o.trim());try{await c.default.promises.access(e),p=` --config "${e}"`}catch{let e=await this.detectPrettierConfig();e&&(p=` --config "${e}"`)}}else{let e=await this.detectPrettierConfig();e&&(p=` --config "${e}"`)}let m=`${f} --write ${s.join(` `)}${p}`;try{t.spinner.start(`Formatting selected files...`),await new Promise((e,t)=>{(0,u.exec)(m,n=>{n?t(Error(String(n))):e()})}),t.spinner.success(`File formatting successful`),t.log.print(`
44
+ `)}catch(e){t.spinner.error(`Format failed`),t.log.print(e),t.log.error(`Format failed, please manually execute the following command:`),t.log.print(`$`,d.default.yellow(m))}}};m&&new g().initialize().catch(e=>{console.error(e)}),exports.Main=g;
@@ -1 +1 @@
1
- function e(e){let t=e.replace(/^[0-9]+/,``);return t?(t=t.replace(/[^a-zA-Z0-9_.-]/g,``),t):`num`+e}function t(t,n=!1){let r=e(t).split(/[-_.]+/).filter(e=>e.length>0);return r.length===0?``:r.map((e,t)=>t===0&&n?e.toLowerCase():e.charAt(0).toUpperCase()+e.slice(1).toLowerCase()).join(``)}function n(t){let n=e(t).split(/[-_.]+/).filter(e=>e.length>0);return n.length===0?``:n.map(e=>e.charAt(0).toUpperCase()+e.slice(1).toLowerCase()).join(``)}function r(e){return e?e.replace(/^\/+|\/+$/g,``):``}function i(e,t){let n=t.replace(/^\/+/,``),i=r(e.publicPrefix);if(i&&n.startsWith(i+`/`))n=n.slice(i.length+1);else if(i&&n===i)n=``;else if(i&&n.startsWith(i)){let e=n.slice(i.length);(e.startsWith(`/`)||e===``)&&(n=e.replace(/^\/+/,``))}return n}function a(t){let n=[];for(let r=0;r<t.length;r++){let i=t[r],a=t[r+1];i.type===`normal`&&a?.type===`param`&&e(i.normalized).toLowerCase().replace(/[-_.]/g,``)===e(a.normalized).toLowerCase().replace(/[-_.]/g,``)||n.push(i)}return n}function o(r,o){let s=r;r.startsWith(`/`)||(s=`/`+r);let[c,l]=s.split(`|`),u=i(o,c),d=u?u.split(`/`).filter(e=>e):[],f=a(d.map(e=>e.startsWith(`{`)&&e.endsWith(`}`)?{type:`param`,original:e,normalized:e.slice(1,-1)}:{type:`normal`,original:e,normalized:e})),p=o.parameterSeparator??`_`,m=``,h=[],g=e=>{if(h.length>0){let n=h.map((n,r)=>t(n,e&&r===0)).join(``);m+=(m&&h.length>0?p:``)+n,h=[]}};for(let t of f)if(t.type===`normal`)h.push(t.normalized);else{g(m===``);let n=e(t.normalized);m+=(m?p:``)+n}g(m===``);let _=``;h=[];let v=()=>{if(h.length>0){let e=h.map(e=>n(e)).join(``);_+=(_&&h.length>0?p:``)+e,h=[]}};for(let e of f)if(e.type===`normal`)h.push(e.normalized);else{v();let t=n(e.normalized);_+=(_?p:``)+t}v();let y=``;d.length>0?(y=d.map(e=>e.replace(/[{}]/g,``)).join(`-`),y=`${y}-${l}`.toLowerCase()):y=`${l}`.toLowerCase();let b=`/`+u;return u||(b=`/`),b=b.replace(/\{(\w+)\}/g,(e,t)=>`\${${t}}`),{apiName:m?`${m}_${l}`:l,fileName:y,typeName:_?`${_}_${l}`:l,path:b}}exports.convertEndpointString=o;
1
+ const e=require(`../shared/naming.cjs`);function t(e){let t=e.replace(/^[0-9]+/,``);return t?(t=t.replace(/[^a-zA-Z0-9_.-]/g,``),t):`num`+e}function n(e,n=!1){let r=t(e).split(/[-_.]+/).filter(e=>e.length>0);return r.length===0?``:r.map((e,t)=>t===0&&n?e.toLowerCase():e.charAt(0).toUpperCase()+e.slice(1).toLowerCase()).join(``)}function r(e){let n=t(e).split(/[-_.]+/).filter(e=>e.length>0);return n.length===0?``:n.map(e=>e.charAt(0).toUpperCase()+e.slice(1).toLowerCase()).join(``)}function i(e){return e?e.replace(/^\/+|\/+$/g,``):``}function a(e,t){let n=t.replace(/^\/+/,``),r=i(e.publicPrefix);if(r&&n.startsWith(r+`/`))n=n.slice(r.length+1);else if(r&&n===r)n=``;else if(r&&n.startsWith(r)){let e=n.slice(r.length);(e.startsWith(`/`)||e===``)&&(n=e.replace(/^\/+/,``))}return n}function o(e){let n=[];for(let r=0;r<e.length;r++){let i=e[r],a=e[r+1];i.type===`normal`&&a?.type===`param`&&t(i.normalized).toLowerCase().replace(/[-_.]/g,``)===t(a.normalized).toLowerCase().replace(/[-_.]/g,``)||n.push(i)}return n}function s(i,s){let c=i;i.startsWith(`/`)||(c=`/`+i);let[l,u]=c.split(`|`),d=a(s,l),f=d?d.split(`/`).filter(e=>e):[],p=o(f.map(e=>e.startsWith(`{`)&&e.endsWith(`}`)?{type:`param`,original:e,normalized:e.slice(1,-1)}:{type:`normal`,original:e,normalized:e})),m=s.parameterSeparator??`_`,h=``,g=[],_=e=>{if(g.length>0){let t=g.map((t,r)=>n(t,e&&r===0)).join(``);h+=(h&&g.length>0?m:``)+t,g=[]}};for(let e of p)if(e.type===`normal`)g.push(e.normalized);else{_(h===``);let n=t(e.normalized);h+=(h?m:``)+n}_(h===``);let v=``;g=[];let y=()=>{if(g.length>0){let e=g.map(e=>r(e)).join(``);v+=(v&&g.length>0?m:``)+e,g=[]}};for(let e of p)if(e.type===`normal`)g.push(e.normalized);else{y();let t=r(e.normalized);v+=(v?m:``)+t}y();let b=``;f.length>0?(b=f.map(e=>e.replace(/[{}]/g,``)).join(`-`),b=`${b}-${u}`.toLowerCase()):b=`${u}`.toLowerCase();let x=`/`+d;d||(x=`/`),x=x.replace(/\{(\w+)\}/g,(e,t)=>`\${${t}}`);let S=v?`${v}_${u}`:u,C=e.getNamespacePrefix(s),w=C?`${C}_${S}`:S;return{apiName:h?`${h}_${u}`:u,fileName:b,typeName:w,path:x}}exports.convertEndpointString=s;
@@ -1,3 +1,3 @@
1
- const e=require(`../shared/format.cjs`),t=require(`../shared/naming.cjs`),n=require(`../shared/schema-utils.cjs`),r=require(`../shared/http.cjs`),i={schemas:`#/components/schemas/`,parameters:`#/components/parameters/`,definitions:`#/definitions/`};var a=class{config;schemas;parameters;referenceCache=new Map;resolvedToOriginalName=new Map;handleError;constructor(e,t,n,r){this.config=e,this.schemas=t??{},this.parameters=n??{},this.handleError=r}stringifySchemaResult(t){if(Array.isArray(t)){let n=e.getLineEnding(this.config),r=e.getIndentation(this.config);return`{${n}${t.join(n)}${n}${r}}`}return t}handleComplexType(e){try{return e.oneOf?e.oneOf.map(e=>this.stringifySchemaResult(this.main(e))).join(` | `):e.allOf?e.allOf.map(e=>this.stringifySchemaResult(this.main(e))).join(` & `):e.anyOf?e.anyOf.map(e=>this.stringifySchemaResult(this.main(e))).join(` | `):e.enum?e.type===`number`||e.type===`integer`?e.enum.join(` | `):e.enum.map(e=>`'${e}'`).join(` | `):`unknown`}catch(e){return this.handleError({type:`SCHEMA`,message:`Failed to handle complex type`,details:e}),`unknown`}}referenceObjectParse(e){try{let n=e.$ref,r=this.referenceCache.get(n);if(r)return r;let a=n;n.startsWith(i.schemas)&&(a=n.replace(i.schemas,``)),n.startsWith(i.parameters)&&(a=n.replace(i.parameters,``)),n.startsWith(i.definitions)&&(a=n.replace(i.definitions,``));let o=t.resolveSchemaName(a),s=t.typeNameToFileName(o),c=this.schemas?.[a];t.containsChinese(a)&&this.resolvedToOriginalName.set(o,a);let l=!1;if(c&&!(`$ref`in c)){let e=`properties`in c||c.type===`object`,t=c.type===`array`||`items`in c;`enum`in c&&Array.isArray(c.enum)&&!e&&!t&&(l=!0)}else l=/Enum$/i.test(a);let u=l?t.getEnumTypeName(this.config,o):o,d=l?`import('${this.config.importEnumPath}/${s}').${u}`:`import('../models/${s}').${o}`;return this.referenceCache.set(n,d),d}catch(e){return this.handleError({type:`REFERENCE`,message:`Failed to parse reference object`,details:e}),`unknown`}}nonArraySchemaObjectParse(e){if(!e)return`unknown`;if(e.format===`binary`||e.type===`string`&&e.format===`binary`)return`File`;switch(e.type){case`boolean`:return`boolean`;case`integer`:case`number`:return`number`;case`object`:return this.propertiesParse(e.properties);case`string`:return e.format===`binary`?`File`:`string`;default:return`unknown`}}arraySchemaObjectParse(e){if(e.type!==`array`)return``;let{items:t}=e,n=`$ref`in t?t:null,r=t;if(n)return`Array<${this.referenceObjectParse(n)}>`;if(r){let e=this.main(t);return Array.isArray(e)?`Array<{${e.join(`
1
+ const e=require(`../shared/format.cjs`),t=require(`../shared/naming.cjs`),n=require(`../shared/schema-utils.cjs`),r=require(`../shared/http.cjs`),i={schemas:`#/components/schemas/`,parameters:`#/components/parameters/`,definitions:`#/definitions/`};var a=class{config;schemas;parameters;referenceCache=new Map;resolvedToOriginalName=new Map;handleError;constructor(e,t,n,r){this.config=e,this.schemas=t??{},this.parameters=n??{},this.handleError=r}stringifySchemaResult(t){if(Array.isArray(t)){let n=e.getLineEnding(this.config),r=e.getIndentation(this.config);return`{${n}${t.join(n)}${n}${r}}`}return t}handleComplexType(e){try{return e.oneOf?e.oneOf.map(e=>this.stringifySchemaResult(this.main(e))).join(` | `):e.allOf?e.allOf.map(e=>this.stringifySchemaResult(this.main(e))).join(` & `):e.anyOf?e.anyOf.map(e=>this.stringifySchemaResult(this.main(e))).join(` | `):e.enum?e.type===`number`||e.type===`integer`?e.enum.join(` | `):e.enum.map(e=>`'${e}'`).join(` | `):`unknown`}catch(e){return this.handleError({type:`SCHEMA`,message:`Failed to handle complex type`,details:e}),`unknown`}}referenceObjectParse(e){try{let n=e.$ref,r=this.referenceCache.get(n);if(r)return r;let a=n;n.startsWith(i.schemas)&&(a=n.replace(i.schemas,``)),n.startsWith(i.parameters)&&(a=n.replace(i.parameters,``)),n.startsWith(i.definitions)&&(a=n.replace(i.definitions,``));let o=t.resolveSchemaName(a),s=t.typeNameToFileName(o),c=this.schemas?.[a];t.containsChinese(a)&&this.resolvedToOriginalName.set(o,a);let l=!1;if(c&&!(`$ref`in c)){let e=`properties`in c||c.type===`object`,t=c.type===`array`||`items`in c;`enum`in c&&Array.isArray(c.enum)&&!e&&!t&&(l=!0)}else l=/Enum$/i.test(a);let u=l?t.getEnumTypeName(this.config,o):o,d=t.getServerSegment(this.config),f=t.adjustImportPathForSegment(this.config.importEnumPath??``,d),p=d?`../../models/${d}`:`../models`,m=l?`import('${f}/${s}').${u}`:`import('${p}/${s}').${o}`;return this.referenceCache.set(n,m),m}catch(e){return this.handleError({type:`REFERENCE`,message:`Failed to parse reference object`,details:e}),`unknown`}}nonArraySchemaObjectParse(e){if(!e)return`unknown`;if(e.format===`binary`||e.type===`string`&&e.format===`binary`)return`File`;switch(e.type){case`boolean`:return`boolean`;case`integer`:case`number`:return`number`;case`object`:return this.propertiesParse(e.properties);case`string`:return e.format===`binary`?`File`:`string`;default:return`unknown`}}arraySchemaObjectParse(e){if(e.type!==`array`)return``;let{items:t}=e,n=`$ref`in t?t:null,r=t;if(n)return`Array<${this.referenceObjectParse(n)}>`;if(r){let e=this.main(t);return Array.isArray(e)?`Array<{${e.join(`
2
2
  `)}}>`:`Array<${e}>`}return``}propertiesParse(e){return n.formatObjectProperties(e,this.config,e=>this.main(e))}transformResponseModel(t,n){if(!n)return t;if(n.modelPattern&&typeof t==`string`){let e=/^import\('[^']+'\)\.(\w+)$/.exec(t),r=e?e[1]:t;if(!new RegExp(n.modelPattern).test(r))return t}try{switch(n.type){case`unwrap`:{let e=n.dataField??`data`;if(Array.isArray(t))return this.handleError({type:`RESPONSE`,message:`Response model unwrap is not supported for inline object response types`}),t;let r=/^import\('([^']+)'\)\.(\w+)$/.exec(t);if(r){let[,t,n]=r,i=this.resolvedToOriginalName.get(n)??n,a=this.schemas?.[i];if(a&&!(`$ref`in a)){let t=a;if(t.properties?.[e]){let n=t.properties[e];return this.main(n)}else this.handleError({type:`RESPONSE`,message:`Field "${e}" not found in response type "${n}"`})}}return t}case`wrap`:{if(!n.wrapperFields)return this.handleError({type:`RESPONSE`,message:`wrapperFields is required when using wrap transform`}),t;let r=e.getIndentation(this.config),i=r+r,a=[],o=n.dataField??`data`;for(let[e,r]of Object.entries(n.wrapperFields))if(e===o)if(Array.isArray(t)){let n=t.join(`
3
3
  `);a.push(`${i}${e}?: {${n}\n${i}};`)}else a.push(`${i}${e}?: ${t};`);else a.push(`${i}${e}?: ${r};`);return a}case`replace`:return n.wrapperType?n.wrapperType:(this.handleError({type:`RESPONSE`,message:`wrapperType is required when using replace transform`}),t);default:return t}}catch(e){return this.handleError({type:`RESPONSE`,message:`Failed to transform response model`,details:e}),t}}responseObjectParse(e){try{let t=e.content;if(!t)return``;let n;for(let e of r.SUPPORTED_REQUEST_TYPES_ALL)if(t[e]?.schema){n=t[e].schema;break}return n?this.main(n):``}catch(e){return this.handleError({type:`RESPONSE`,message:`Failed to parse response object`,details:e}),``}}main(e){try{if(!e)return`unknown`;if(`oneOf`in e||`allOf`in e||`anyOf`in e||`enum`in e)return this.handleComplexType(e);if(`$ref`in e)return this.referenceObjectParse(e);let t=e,r=t.type,i=n.nullableSuffix(t.nullable),a=n.applyTypeMapping(this.config,t);if(a)return a;if(r===`array`&&t.items)return n.stringifyArrayType(this.main(t.items),this.config);if(r===`object`||typeof t==`object`){if(t.properties){let e=this.propertiesParse(t.properties);return e.length?e:[`unknown`]}if(t.additionalProperties===!0)return`Record<string, unknown>`+i;if(typeof t.additionalProperties==`object`)return`Record<string, ${this.main(t.additionalProperties)}>`+i}return`unknown`}catch(e){return this.handleError({type:`SCHEMA`,message:`Failed to parse schema`,details:e}),`unknown`}}};exports.SchemaResolver=a;
@@ -1,4 +1,4 @@
1
- const e=require(`../../utils/logger.cjs`),t=require(`../../utils/index.cjs`),n=require(`../shared/format.cjs`),r=require(`../shared/constants.cjs`);var i=class{config;constructor(e){this.config=e}async write(i,a,o){let s=[],c=this.config.saveTypeFolderPath,l=(i,a)=>new Promise((s,l)=>{try{let{payload:u,response:d,fileName:f}=a,[,p]=i.split(`|`);o.includes(p)||o.push(p);let m=[`declare namespace ${a.typeName} {`,...u.path,...u.query,...u.header,...u.body,`${n.getIndentation(this.config)}${d}`,`}`],h=`${c}/connectors/${f}.d.ts`;t.writeFileRecursive(h,m.join(`
2
- `)).then(()=>{e.log.info(`${h.padEnd(r.PAD_END)} - Write done!`),s(1)}).catch(e=>{l(Error(String(e)))})}catch(e){l(Error(String(e)))}}),u=Array.from(i.entries()).sort((e,t)=>e[0].localeCompare(t[0]));for(let[e,t]of u)s.push(l(e,t));await Promise.all(s),o.sort(),a.unshift(`import { ${o.join(`, `)} } from '${this.config.requestMethodsImportPath||`./api`}';`,`
3
- `);let d=this.config.apiListFileName??`index.ts`,f=`${this.config.saveApiListFolderPath}/${d}`;await t.clearDir(f),await t.writeFileRecursive(f,a.join(`
4
- `)),e.log.success(`Path parse & write done!`)}};exports.PathWriter=i;
1
+ const e=require(`../../utils/logger.cjs`),t=require(`../../utils/index.cjs`),n=require(`../shared/format.cjs`),r=require(`../shared/naming.cjs`),i=require(`../shared/constants.cjs`);var a=class{config;constructor(e){this.config=e}async write(a,o,s){let c=this.config.saveTypeFolderPath,l=r.getServerSegment(this.config),u=l?`${c}/connectors/${l}`:`${c}/connectors`,d=async(r,a)=>{let{payload:o,response:c,fileName:l}=a,[,d]=r.split(`|`);s.includes(d)||s.push(d);let f=[`declare namespace ${a.typeName} {`,...o.path,...o.query,...o.header,...o.body,`${n.getIndentation(this.config)}${c}`,`}`],p=`${u}/${l}.d.ts`;await t.writeFileRecursive(p,f.join(`
2
+ `)),e.log.info(`${p.padEnd(i.PAD_END)} - Write done!`)};await t.runWithConcurrency(Array.from(a.entries()).sort((e,t)=>e[0].localeCompare(t[0])),32,([e,t])=>d(e,t)),s.sort(),o.unshift(`import { ${s.join(`, `)} } from '${this.config.requestMethodsImportPath||`./api`}';`,`
3
+ `);let f=this.config.apiListFileName??`index.ts`,p=`${this.config.saveApiListFolderPath}/${f}`;await t.clearDir(p),await t.writeFileRecursive(p,o.join(`
4
+ `)),e.log.step(`Paths parsed & written`)}};exports.PathWriter=a;
@@ -1 +1 @@
1
- require(`../../_virtual/rolldown_runtime.cjs`);let e=require(`pinyin-pro`);function t(e){return/[\u4e00-\u9fff]/.test(e)}function n(e){return e?e.charAt(0).toUpperCase()+e.slice(1):``}function r(e){return e.split(/[^a-zA-Z0-9_]+/).filter(Boolean).map(e=>n(e)).join(``)}function i(i){return t(i)?(i.match(/[\u4e00-\u9fff]+|[^\u4e00-\u9fff]+/g)??[]).map(i=>t(i)?(0,e.pinyin)(i,{toneType:`none`,type:`array`}).map(e=>n(e)).join(``):r(i)).join(``):i}function a(e){return e?/^[0-9]/.test(e)?`_${e}`:e:`Unknown`}function o(e){return e?t(e)?a(i(e)):/[^a-zA-Z0-9_$]/.test(e)?a(r(e)):a(e):`Unknown`}function s(e){return e.replace(/[^a-zA-Z0-9]+/g,`-`).replace(/([a-z])([A-Z])/g,`$1-$2`).toLowerCase().replace(/-+/g,`-`).replace(/^-|-$/g,``)}function c(e,t){return e.enmuConfig.erasableSyntaxOnly?`${t}Type`:t}function l(e){return!/^[a-zA-Z_$][a-zA-Z0-9_$]*$/.test(e)}function u(e){return l(e)?`"${e}"`:e}exports.containsChinese=t,exports.formatPropertyName=u,exports.getEnumTypeName=c,exports.resolveSchemaName=o,exports.typeNameToFileName=s,exports.wordsToPascalCase=r;
1
+ require(`../../_virtual/rolldown_runtime.cjs`);const e=require(`../../utils/logger.cjs`);require(`../../utils/index.cjs`);let t=require(`pinyin-pro`);function n(e){return/[\u4e00-\u9fff]/.test(e)}function r(e){return e?e.charAt(0).toUpperCase()+e.slice(1):``}function i(e){return e.split(/[^a-zA-Z0-9_]+/).filter(Boolean).map(e=>r(e)).join(``)}function a(e){return n(e)?(e.match(/[\u4e00-\u9fff]+|[^\u4e00-\u9fff]+/g)??[]).map(e=>n(e)?(0,t.pinyin)(e,{toneType:`none`,type:`array`}).map(e=>r(e)).join(``):i(e)).join(``):e}function o(e){return e?/^[0-9]/.test(e)?`_${e}`:e:`Unknown`}function s(e){return e?n(e)?o(a(e)):/[^a-zA-Z0-9_$]/.test(e)?o(i(e)):o(e):`Unknown`}function c(e){return e.replace(/[^a-zA-Z0-9]+/g,`-`).replace(/([a-z])([A-Z])/g,`$1-$2`).toLowerCase().replace(/-+/g,`-`).replace(/^-|-$/g,``)}function l(e){let t=(e??``).trim();return t?(t.split(/[\\/]/).pop()??``).replace(/\.[^.]+$/,``).replace(/[^a-zA-Z0-9_-]+/g,`-`).replace(/^-+|-+$/g,``):``}function u(e){return e.__segment??``}function d(e){if(!e)return``;let t=e.split(/[-_.]+/).filter(Boolean).map(e=>r(e.toLowerCase())).join(``);return t?/^[0-9]/.test(t)?`_${t}`:t:``}function f(e){let t=e.__namespacePrefix;return typeof t==`string`?t:(e.namespaceIsolation??`segment`)===`none`?``:d(u(e))}function p(e){let t=e.apiListFileName?.replace(/\.[^/.]+$/,``).trim();if(t)return`【${t}】`;let n=u(e);if(n)return`【${n}】`;let r=e.swaggerJsonUrl;if(r)try{let e=new URL(r).host;if(e)return`【${e}】`}catch{}return``}function m(t,n){return!n||!t?t:t.startsWith(`./`)||t.startsWith(`../`)?`../`+t:(t.startsWith(`/`)||/^[a-zA-Z@]/.test(t)||e.log.warning(`importEnumPath="${t}" 形态不明确,建议以 "./" 或 "../" 开头。多服务隔离已开启,工具未自动补偿层级,请自行确认 enum 引用是否正确。`),t)}function h(e,t){return e.enmuConfig.erasableSyntaxOnly?`${t}Type`:t}function g(e){return!/^[a-zA-Z_$][a-zA-Z0-9_$]*$/.test(e)}function _(e){return g(e)?`"${e}"`:e}exports.adjustImportPathForSegment=m,exports.computeSegment=l,exports.containsChinese=n,exports.formatPropertyName=_,exports.getEnumTypeName=h,exports.getNamespacePrefix=f,exports.getServerSegment=u,exports.getServiceTag=p,exports.resolveSchemaName=s,exports.segmentToNamespacePrefix=d,exports.typeNameToFileName=c,exports.wordsToPascalCase=i;
@@ -1 +1 @@
1
- const e=require(`../_virtual/rolldown_runtime.cjs`);require(`./logger.cjs`);let t=require(`fs`);t=e.__toESM(t);let n=require(`path`);n=e.__toESM(n);let r=require(`module`),i=require(`shelljs`);const a=function(e,n){return new Promise((r,i)=>{try{let a=e.substring(0,e.lastIndexOf(`/`));t.default.mkdir(a,{recursive:!0},a=>{if(a)return i(Error(`创建目录失败`));t.default.writeFile(e,n,function(e){if(e)return i(Error(`写入文件失败`));r(!0)})})}catch(e){console.error(e),i(Error(String(e)))}})};function o(e){return new Promise((t,n)=>{try{(0,i.exec)(`rm -rf ${e}`),t(!0)}catch(e){console.error(e),n(Error(String(e)))}})}function s(e,n=[]){return new Promise((r,a)=>{try{if(!t.default.existsSync(e)){r(!0);return}t.default.readdirSync(e).forEach(r=>{if(n.includes(r))return;let a=`${e}/${r}`;t.default.statSync(a).isDirectory()?(0,i.exec)(`rm -rf ${a}`):t.default.unlinkSync(a)}),r(!0)}catch(e){console.error(e),a(Error(String(e)))}})}function c(e){if(typeof e!=`string`)return!1;try{return JSON.parse(e),!0}catch{return!1}}function l(e,t=!0){let n=(0,r.createRequire)(__filename);try{let r=n(e);if(t){let t=setTimeout(()=>{delete n.cache[n.resolve(e)],clearTimeout(t)},200)}return r}catch(e){throw Error(e instanceof Error?e.message:String(e))}}exports.clearDir=o,exports.clearDirExcept=s,exports.isValidJSON=c,exports.requireModule=l,exports.writeFileRecursive=a;
1
+ const e=require(`../_virtual/rolldown_runtime.cjs`);require(`./logger.cjs`);let t=require(`fs`);t=e.__toESM(t);let n=require(`path`);n=e.__toESM(n);let r=require(`module`),i=require(`shelljs`);const a=function(e,n){return new Promise((r,i)=>{try{let a=e.substring(0,e.lastIndexOf(`/`));t.default.mkdir(a,{recursive:!0},a=>{if(a)return i(Error(`创建目录失败`));t.default.writeFile(e,n,function(e){if(e)return i(Error(`写入文件失败`));r(!0)})})}catch(e){console.error(e),i(Error(String(e)))}})};async function o(e,t,n){let r=Array(e.length),i=Math.max(1,Math.min(t,e.length)),a=0,o=Array.from({length:i},async()=>{for(;;){let t=a++;if(t>=e.length)return;r[t]=await n(e[t],t)}});return await Promise.all(o),r}function s(e){return new Promise((t,n)=>{try{(0,i.exec)(`rm -rf ${e}`),t(!0)}catch(e){console.error(e),n(Error(String(e)))}})}function c(e,n=[]){return new Promise((r,a)=>{try{if(!t.default.existsSync(e)){r(!0);return}t.default.readdirSync(e).forEach(r=>{if(n.includes(r))return;let a=`${e}/${r}`;t.default.statSync(a).isDirectory()?(0,i.exec)(`rm -rf ${a}`):t.default.unlinkSync(a)}),r(!0)}catch(e){console.error(e),a(Error(String(e)))}})}function l(e){if(typeof e!=`string`)return!1;try{return JSON.parse(e),!0}catch{return!1}}function u(e,t=!0){let n=(0,r.createRequire)(__filename);try{let r=n(e);if(t){let t=setTimeout(()=>{delete n.cache[n.resolve(e)],clearTimeout(t)},200)}return r}catch(e){throw Error(e instanceof Error?e.message:String(e))}}exports.clearDir=s,exports.clearDirExcept=c,exports.isValidJSON=l,exports.requireModule=u,exports.runWithConcurrency=o,exports.writeFileRecursive=a;
@@ -1 +1 @@
1
- const e=require(`../_virtual/rolldown_runtime.cjs`);let t=require(`chalk`);t=e.__toESM(t);let n=require(`ora`);n=e.__toESM(n);const r={silent:0,error:1,warn:2,info:3,verbose:4};let i=`info`;function a(e){i=e}function o(e){return r[i]>=r[e]}function s(e){let t=[`[${e.type}]`];if(e.path||e.method){let n=[e.method,e.path].filter(Boolean).join(` `);t.push(n),t.push(`-`)}return t.push(e.message),t.join(` `)}const c=(0,n.default)();function l(e){c.isSpinning?(c.clear(),e(),c.render()):e()}const u={info:e=>{o(`verbose`)&&l(()=>console.log(t.default.dim(e)))},error:e=>{o(`error`)&&l(()=>console.log(t.default.red(`❌ ${e}`)))},success:e=>{o(`info`)&&l(()=>console.log(t.default.green(`🥂 ${e}`)))},warning:e=>{o(`warn`)&&l(()=>console.log(t.default.yellow(`❗️ ${e}`)))},load:e=>{o(`verbose`)&&l(()=>console.log(t.default.dim(`🌐 ${e}`)))},verbose:e=>{o(`verbose`)&&l(()=>console.log(t.default.dim(e)))},warn:e=>{o(`warn`)&&l(()=>console.log(t.default.yellow(e)))},print:(...e)=>{o(`info`)&&l(()=>console.log(...e))}},d={stop:()=>c.stop(),error:e=>o(`error`)&&c.fail(`❌ ${t.default.red(e)}`),start:e=>{o(`info`)&&(c.text=t.default.blue(e),c.start())},success:e=>{o(`info`)&&c.stopAndPersist({symbol:t.default.green(`✔`),text:t.default.green(e)})}};exports.formatParseError=s,exports.log=u,exports.setLogLevel=a,exports.spinner=d;
1
+ const e=require(`../_virtual/rolldown_runtime.cjs`);let t=require(`chalk`);t=e.__toESM(t);let n=require(`ora`);n=e.__toESM(n);const r={silent:0,error:1,warn:2,info:3,verbose:4};let i=`info`;function a(e){i=e}function o(e){return r[i]>=r[e]}function s(e){let t=[`[${e.type}]`];if(e.path||e.method){let n=[e.method,e.path].filter(Boolean).join(` `);t.push(n),t.push(`-`)}return t.push(e.message),t.join(` `)}const c=(0,n.default)();function l(e){c.isSpinning?(c.clear(),e(),c.render()):e()}const u={info:e=>{o(`verbose`)&&l(()=>console.log(t.default.dim(e)))},error:e=>{o(`error`)&&l(()=>console.log(t.default.red(`❌ ${e}`)))},success:e=>{o(`info`)&&l(()=>console.log(t.default.green(`🥂 ${e}`)))},warning:e=>{o(`warn`)&&l(()=>console.log(t.default.yellow(`❗️ ${e}`)))},load:e=>{o(`verbose`)&&l(()=>console.log(t.default.dim(`🌐 ${e}`)))},verbose:e=>{o(`verbose`)&&l(()=>console.log(t.default.dim(e)))},warn:e=>{o(`warn`)&&l(()=>console.log(t.default.yellow(e)))},print:(...e)=>{o(`info`)&&l(()=>console.log(...e))},section:(e,n)=>{o(`info`)&&l(()=>{console.log(``);let r=t.default.cyan.bold(`▸ ${e}`);console.log(n?`${r} ${t.default.dim(n)}`:r),console.log(t.default.dim(`─`.repeat(60)))})},step:e=>{o(`info`)&&l(()=>console.log(` ${t.default.green(`✓`)} ${e}`))},banner:e=>{o(`info`)&&l(()=>{console.log(``),console.log(t.default.green.bold(`✨ ${e}`)),console.log(``)})}},d={stop:()=>c.stop(),error:e=>o(`error`)&&c.fail(`❌ ${t.default.red(e)}`),start:e=>{o(`info`)&&(c.text=t.default.cyan(e),c.start())},success:e=>{o(`info`)&&c.stopAndPersist({symbol:` ${t.default.green(`✓`)}`,text:e})}};exports.formatParseError=s,exports.log=u,exports.setLogLevel=a,exports.spinner=d;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "anl",
3
- "version": "26.331.0",
3
+ "version": "26.509.1",
4
4
  "description": "FE command line tool",
5
5
  "main": "bin/an-cli.js",
6
6
  "exports": {
@@ -27,7 +27,11 @@
27
27
  "pub": "bash publish.sh",
28
28
  "ts": "tsc ./src/int.ts --noEmit --watch",
29
29
  "blink": "pnpm run build && pnpm link",
30
- "docs": "docsify serve ./docs"
30
+ "docs": "docsify serve ./docs",
31
+ "test:type": "node bin/an-cli.js type",
32
+ "test:type:one": "node bin/an-cli.js type -S op",
33
+ "test:type:multi": "node bin/an-cli.js type -S op,notice",
34
+ "test:type:miss": "node bin/an-cli.js type -S notExist"
31
35
  },
32
36
  "bin": {
33
37
  "anl": "bin/an-cli.js"