type-flash 1.0.5 → 1.0.6

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/dist/index.d.mts CHANGED
@@ -1,5 +1,5 @@
1
1
  /**
2
- * 类型定义
2
+ * 类型定义文件
3
3
  */
4
4
  /**
5
5
  * 原始类型
@@ -51,14 +51,6 @@ interface LiteralType {
51
51
  kind: 'literal';
52
52
  value: string | number | boolean;
53
53
  }
54
- /**
55
- * 枚举类型
56
- */
57
- interface EnumType {
58
- kind: 'enum';
59
- name: string;
60
- values: (string | number)[];
61
- }
62
54
  /**
63
55
  * null 类型
64
56
  */
@@ -82,7 +74,7 @@ interface GenericType {
82
74
  /**
83
75
  * TS 类型节点(联合类型,支持 discriminated union 类型收窄)
84
76
  */
85
- type TSTypeNode = PrimitiveType | ArrayType | ObjectType | UnionType | LiteralType | EnumType | NullType | UndefinedType | GenericType;
77
+ type TSTypeNode = PrimitiveType | ArrayType | ObjectType | UnionType | LiteralType | NullType | UndefinedType | GenericType;
86
78
  /**
87
79
  * 命名风格
88
80
  */
@@ -115,10 +107,6 @@ interface GenerateOptions {
115
107
  strictNullChecks?: boolean;
116
108
  /** 是否将可选属性标记为 ?,默认 true */
117
109
  markOptional?: boolean;
118
- /** 是否提取枚举类型,默认 true */
119
- extractEnums?: boolean;
120
- /** 枚举提取阈值(字段不同值数量 ≤ 此值时提取为枚举),默认 5 */
121
- enumThreshold?: number;
122
110
  /** 是否提取泛型(如 PageResult<T>),默认 true */
123
111
  extractGenerics?: boolean;
124
112
  /** 缩进空格数,默认 2 */
@@ -310,7 +298,7 @@ declare class CodeFormatter {
310
298
  private allNamedTypes;
311
299
  constructor(options: Required<GenerateOptions>, namer: TypeNamer);
312
300
  /**
313
- * 查找类型对应的命名(用于对象/枚举类型引用)
301
+ * 查找类型对应的命名(用于对象类型引用)
314
302
  */
315
303
  private findTypeName;
316
304
  /**
@@ -321,10 +309,6 @@ declare class CodeFormatter {
321
309
  * 格式化对象类型(interface 或 type)
322
310
  */
323
311
  private formatObjectType;
324
- /**
325
- * 格式化枚举类型
326
- */
327
- private formatEnumType;
328
312
  /**
329
313
  * 格式化类型节点为字符串
330
314
  */
@@ -357,10 +341,6 @@ declare class CodeFormatter {
357
341
  * 格式化多行 JSDoc 注释
358
342
  */
359
343
  private formatJSDoc;
360
- /**
361
- * 转换为枚举键名(UPPER_SNAKE_CASE)
362
- */
363
- private toEnumKey;
364
344
  /**
365
345
  * 格式化所有类型定义
366
346
  */
@@ -370,6 +350,14 @@ declare class CodeFormatter {
370
350
  */
371
351
  generateOutput(typeDefs: NamedTypeDef[], rootTypeName: string): string;
372
352
  }
353
+ /**
354
+ * 根据字段名猜测 JSDoc 注释
355
+ */
356
+ declare function guessCommentFromFieldName(fieldName: string): string | undefined;
357
+ /**
358
+ * 为对象类型的属性添加猜测的注释
359
+ */
360
+ declare function addGuessedComments(type: ObjectType): ObjectType;
373
361
 
374
362
  /**
375
363
  * ts-gen - 类型推断引擎
@@ -424,7 +412,6 @@ declare function isStructurallyEqual(a: TSTypeNode, b: TSTypeNode): boolean;
424
412
  *
425
413
  * 核心功能:
426
414
  * - 泛型提取(如 PageResult<T>)
427
- * - 枚举提取
428
415
  * - 空值处理
429
416
  * - 可选属性处理
430
417
  */
@@ -438,17 +425,6 @@ declare class GenericExtractor {
438
425
  extract(type: TSTypeNode): TSTypeNode;
439
426
  private tryMatchPattern;
440
427
  }
441
- /**
442
- * 枚举提取器
443
- * 从字符串字段中提取枚举类型
444
- */
445
- declare class EnumExtractor {
446
- private threshold;
447
- constructor(threshold?: number);
448
- extract(jsonData: any, type: TSTypeNode): TSTypeNode;
449
- private tryExtractEnum;
450
- private isValidEnumValues;
451
- }
452
428
  /**
453
429
  * 空值处理器
454
430
  */
@@ -475,71 +451,29 @@ declare function applyEnhancements(jsonData: any, type: TSTypeNode, options: Gen
475
451
  * ts-gen - JSON 智能生成 TypeScript 类型定义
476
452
  *
477
453
  * 主入口文件
478
- *
479
- * @example
480
- * ```ts
481
- * import { generate } from 'ts-gen';
482
- *
483
- * const json = { name: 'foo', age: 25 };
484
- * const result = generate(json, { rootName: 'User' });
485
- * console.log(result.code);
486
- * ```
487
454
  */
488
455
 
489
456
  /**
490
457
  * 从 JSON 数据生成 TypeScript 类型定义
491
- *
492
- * @param jsonData JSON 数据(对象或数组)
493
- * @param options 生成选项
494
- * @returns 生成结果,包含代码字符串和类型定义列表
495
- *
496
- * @example
497
- * ```ts
498
- * import { generate } from 'ts-gen';
499
- *
500
- * const data = {
501
- * id: 1,
502
- * name: 'Alice',
503
- * email: 'alice@example.com',
504
- * profile: {
505
- * avatar: 'https://...',
506
- * bio: null
507
- * }
508
- * };
509
- *
510
- * const result = generate(data, {
511
- * rootName: 'User',
512
- * outputStyle: 'interface'
513
- * });
514
- *
515
- * console.log(result.code);
516
- * ```
458
+ * @param jsonData JSON 数据
459
+ * @param options 配置选项
460
+ * @returns 生成结果
517
461
  */
518
- declare function generate(jsonData: unknown, options?: GenerateOptions): GenerateResult;
462
+ declare function generate(jsonData: any, options?: GenerateOptions): GenerateResult;
519
463
  /**
520
- * 从 JSON 字符串生成 TypeScript 类型定义
521
- *
464
+ * 从 JSON 字符串生成类型定义
522
465
  * @param jsonString JSON 字符串
523
- * @param options 生成选项
466
+ * @param options 配置选项
524
467
  * @returns 生成结果
525
- *
526
- * @example
527
- * ```ts
528
- * import { generateFromString } from 'ts-gen';
529
- *
530
- * const jsonStr = '{"name": "foo", "age": 25}';
531
- * const result = generateFromString(jsonStr, { rootName: 'User' });
532
- * ```
533
468
  */
534
469
  declare function generateFromString(jsonString: string, options?: GenerateOptions): GenerateResult;
535
470
  /**
536
- * 生成单个类型的字符串表示(不生成完整文件)
537
- *
471
+ * 生成单个类型的字符串表示
538
472
  * @param jsonData JSON 数据
539
- * @param options 生成选项
540
- * @returns 类型定义字符串
473
+ * @param options 配置选项
474
+ * @returns 类型字符串
541
475
  */
542
- declare function generateType(jsonData: unknown, options?: GenerateOptions): string;
476
+ declare function generateType(jsonData: any, options?: GenerateOptions): string;
543
477
 
544
478
  declare const _default: {
545
479
  generate: typeof generate;
@@ -547,4 +481,4 @@ declare const _default: {
547
481
  generateType: typeof generateType;
548
482
  };
549
483
 
550
- export { type ArrayType, CodeFormatter, EnumExtractor, type EnumType, type GenerateOptions, type GenerateResult, GenericExtractor, type GenericType, type NamedTypeDef, type NamingStyle, NullHandler, type ObjectType, OptionalHandler, type OutputStyle, type PrimitiveType, type PropertyDef, type SortOrder, type TSTypeNode, TypeCollector, TypeNamer, type UnionType, applyEnhancements, createUnion, _default as default, generate, generateFromString, generateType, inferArrayType, inferObjectType, inferType, isStructurallyEqual, mergeObjects, mergeTypes };
484
+ export { type ArrayType, CodeFormatter, type GenerateOptions, type GenerateResult, GenericExtractor, type GenericType, type NamedTypeDef, type NamingStyle, NullHandler, type ObjectType, OptionalHandler, type OutputStyle, type PrimitiveType, type PropertyDef, type SortOrder, type TSTypeNode, TypeCollector, TypeNamer, type UnionType, addGuessedComments, applyEnhancements, createUnion, _default as default, generate, generateFromString, generateType, guessCommentFromFieldName, inferArrayType, inferObjectType, inferType, isStructurallyEqual, mergeObjects, mergeTypes };
package/dist/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  /**
2
- * 类型定义
2
+ * 类型定义文件
3
3
  */
4
4
  /**
5
5
  * 原始类型
@@ -51,14 +51,6 @@ interface LiteralType {
51
51
  kind: 'literal';
52
52
  value: string | number | boolean;
53
53
  }
54
- /**
55
- * 枚举类型
56
- */
57
- interface EnumType {
58
- kind: 'enum';
59
- name: string;
60
- values: (string | number)[];
61
- }
62
54
  /**
63
55
  * null 类型
64
56
  */
@@ -82,7 +74,7 @@ interface GenericType {
82
74
  /**
83
75
  * TS 类型节点(联合类型,支持 discriminated union 类型收窄)
84
76
  */
85
- type TSTypeNode = PrimitiveType | ArrayType | ObjectType | UnionType | LiteralType | EnumType | NullType | UndefinedType | GenericType;
77
+ type TSTypeNode = PrimitiveType | ArrayType | ObjectType | UnionType | LiteralType | NullType | UndefinedType | GenericType;
86
78
  /**
87
79
  * 命名风格
88
80
  */
@@ -115,10 +107,6 @@ interface GenerateOptions {
115
107
  strictNullChecks?: boolean;
116
108
  /** 是否将可选属性标记为 ?,默认 true */
117
109
  markOptional?: boolean;
118
- /** 是否提取枚举类型,默认 true */
119
- extractEnums?: boolean;
120
- /** 枚举提取阈值(字段不同值数量 ≤ 此值时提取为枚举),默认 5 */
121
- enumThreshold?: number;
122
110
  /** 是否提取泛型(如 PageResult<T>),默认 true */
123
111
  extractGenerics?: boolean;
124
112
  /** 缩进空格数,默认 2 */
@@ -310,7 +298,7 @@ declare class CodeFormatter {
310
298
  private allNamedTypes;
311
299
  constructor(options: Required<GenerateOptions>, namer: TypeNamer);
312
300
  /**
313
- * 查找类型对应的命名(用于对象/枚举类型引用)
301
+ * 查找类型对应的命名(用于对象类型引用)
314
302
  */
315
303
  private findTypeName;
316
304
  /**
@@ -321,10 +309,6 @@ declare class CodeFormatter {
321
309
  * 格式化对象类型(interface 或 type)
322
310
  */
323
311
  private formatObjectType;
324
- /**
325
- * 格式化枚举类型
326
- */
327
- private formatEnumType;
328
312
  /**
329
313
  * 格式化类型节点为字符串
330
314
  */
@@ -357,10 +341,6 @@ declare class CodeFormatter {
357
341
  * 格式化多行 JSDoc 注释
358
342
  */
359
343
  private formatJSDoc;
360
- /**
361
- * 转换为枚举键名(UPPER_SNAKE_CASE)
362
- */
363
- private toEnumKey;
364
344
  /**
365
345
  * 格式化所有类型定义
366
346
  */
@@ -370,6 +350,14 @@ declare class CodeFormatter {
370
350
  */
371
351
  generateOutput(typeDefs: NamedTypeDef[], rootTypeName: string): string;
372
352
  }
353
+ /**
354
+ * 根据字段名猜测 JSDoc 注释
355
+ */
356
+ declare function guessCommentFromFieldName(fieldName: string): string | undefined;
357
+ /**
358
+ * 为对象类型的属性添加猜测的注释
359
+ */
360
+ declare function addGuessedComments(type: ObjectType): ObjectType;
373
361
 
374
362
  /**
375
363
  * ts-gen - 类型推断引擎
@@ -424,7 +412,6 @@ declare function isStructurallyEqual(a: TSTypeNode, b: TSTypeNode): boolean;
424
412
  *
425
413
  * 核心功能:
426
414
  * - 泛型提取(如 PageResult<T>)
427
- * - 枚举提取
428
415
  * - 空值处理
429
416
  * - 可选属性处理
430
417
  */
@@ -438,17 +425,6 @@ declare class GenericExtractor {
438
425
  extract(type: TSTypeNode): TSTypeNode;
439
426
  private tryMatchPattern;
440
427
  }
441
- /**
442
- * 枚举提取器
443
- * 从字符串字段中提取枚举类型
444
- */
445
- declare class EnumExtractor {
446
- private threshold;
447
- constructor(threshold?: number);
448
- extract(jsonData: any, type: TSTypeNode): TSTypeNode;
449
- private tryExtractEnum;
450
- private isValidEnumValues;
451
- }
452
428
  /**
453
429
  * 空值处理器
454
430
  */
@@ -475,71 +451,29 @@ declare function applyEnhancements(jsonData: any, type: TSTypeNode, options: Gen
475
451
  * ts-gen - JSON 智能生成 TypeScript 类型定义
476
452
  *
477
453
  * 主入口文件
478
- *
479
- * @example
480
- * ```ts
481
- * import { generate } from 'ts-gen';
482
- *
483
- * const json = { name: 'foo', age: 25 };
484
- * const result = generate(json, { rootName: 'User' });
485
- * console.log(result.code);
486
- * ```
487
454
  */
488
455
 
489
456
  /**
490
457
  * 从 JSON 数据生成 TypeScript 类型定义
491
- *
492
- * @param jsonData JSON 数据(对象或数组)
493
- * @param options 生成选项
494
- * @returns 生成结果,包含代码字符串和类型定义列表
495
- *
496
- * @example
497
- * ```ts
498
- * import { generate } from 'ts-gen';
499
- *
500
- * const data = {
501
- * id: 1,
502
- * name: 'Alice',
503
- * email: 'alice@example.com',
504
- * profile: {
505
- * avatar: 'https://...',
506
- * bio: null
507
- * }
508
- * };
509
- *
510
- * const result = generate(data, {
511
- * rootName: 'User',
512
- * outputStyle: 'interface'
513
- * });
514
- *
515
- * console.log(result.code);
516
- * ```
458
+ * @param jsonData JSON 数据
459
+ * @param options 配置选项
460
+ * @returns 生成结果
517
461
  */
518
- declare function generate(jsonData: unknown, options?: GenerateOptions): GenerateResult;
462
+ declare function generate(jsonData: any, options?: GenerateOptions): GenerateResult;
519
463
  /**
520
- * 从 JSON 字符串生成 TypeScript 类型定义
521
- *
464
+ * 从 JSON 字符串生成类型定义
522
465
  * @param jsonString JSON 字符串
523
- * @param options 生成选项
466
+ * @param options 配置选项
524
467
  * @returns 生成结果
525
- *
526
- * @example
527
- * ```ts
528
- * import { generateFromString } from 'ts-gen';
529
- *
530
- * const jsonStr = '{"name": "foo", "age": 25}';
531
- * const result = generateFromString(jsonStr, { rootName: 'User' });
532
- * ```
533
468
  */
534
469
  declare function generateFromString(jsonString: string, options?: GenerateOptions): GenerateResult;
535
470
  /**
536
- * 生成单个类型的字符串表示(不生成完整文件)
537
- *
471
+ * 生成单个类型的字符串表示
538
472
  * @param jsonData JSON 数据
539
- * @param options 生成选项
540
- * @returns 类型定义字符串
473
+ * @param options 配置选项
474
+ * @returns 类型字符串
541
475
  */
542
- declare function generateType(jsonData: unknown, options?: GenerateOptions): string;
476
+ declare function generateType(jsonData: any, options?: GenerateOptions): string;
543
477
 
544
478
  declare const _default: {
545
479
  generate: typeof generate;
@@ -547,4 +481,4 @@ declare const _default: {
547
481
  generateType: typeof generateType;
548
482
  };
549
483
 
550
- export { type ArrayType, CodeFormatter, EnumExtractor, type EnumType, type GenerateOptions, type GenerateResult, GenericExtractor, type GenericType, type NamedTypeDef, type NamingStyle, NullHandler, type ObjectType, OptionalHandler, type OutputStyle, type PrimitiveType, type PropertyDef, type SortOrder, type TSTypeNode, TypeCollector, TypeNamer, type UnionType, applyEnhancements, createUnion, _default as default, generate, generateFromString, generateType, inferArrayType, inferObjectType, inferType, isStructurallyEqual, mergeObjects, mergeTypes };
484
+ export { type ArrayType, CodeFormatter, type GenerateOptions, type GenerateResult, GenericExtractor, type GenericType, type NamedTypeDef, type NamingStyle, NullHandler, type ObjectType, OptionalHandler, type OutputStyle, type PrimitiveType, type PropertyDef, type SortOrder, type TSTypeNode, TypeCollector, TypeNamer, type UnionType, addGuessedComments, applyEnhancements, createUnion, _default as default, generate, generateFromString, generateType, guessCommentFromFieldName, inferArrayType, inferObjectType, inferType, isStructurallyEqual, mergeObjects, mergeTypes };
package/dist/index.js CHANGED
@@ -1,10 +1,9 @@
1
- "use strict";var $=Object.defineProperty;var F=Object.getOwnPropertyDescriptor;var _=Object.getOwnPropertyNames;var z=Object.prototype.hasOwnProperty;var V=(n,e)=>{for(var t in e)$(n,t,{get:e[t],enumerable:!0})},L=(n,e,t,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let i of _(e))!z.call(n,i)&&i!==t&&$(n,i,{get:()=>e[i],enumerable:!(r=F(e,i))||r.enumerable});return n};var q=n=>L($({},"__esModule",{value:!0}),n);var W={};V(W,{CodeFormatter:()=>d,EnumExtractor:()=>h,GenericExtractor:()=>g,NullHandler:()=>N,OptionalHandler:()=>S,TypeCollector:()=>f,TypeNamer:()=>y,applyEnhancements:()=>x,createUnion:()=>j,default:()=>B,generate:()=>v,generateFromString:()=>U,generateType:()=>D,inferArrayType:()=>A,inferObjectType:()=>P,inferType:()=>m,isStructurallyEqual:()=>b,mergeObjects:()=>O,mergeTypes:()=>T});module.exports=q(W);var E={rootName:"Root",outputStyle:"interface",namingStyle:"PascalCase",sortProperties:"alpha",addExport:!0,addComments:!1,strictNullChecks:!1,markOptional:!0,extractEnums:!0,enumThreshold:5,extractGenerics:!0,indentSize:2,lineEnding:`
2
- `,typeNameMap:{},typePrefix:"",typeSuffix:""};function k(n){return{kind:"primitive",type:n}}function I(){return{kind:"null"}}function Z(){return{kind:"undefined"}}function H(n){return{kind:"array",elementType:n}}function C(n=[]){return{kind:"object",properties:n}}function j(n){let e=[],t=new Set;for(let r of n)if(r.kind==="union")for(let i of r.types){let s=u(i);t.has(s)||(t.add(s),e.push(i))}else{let i=u(r);t.has(i)||(t.add(i),e.push(r))}return e.length===1?e[0]:{kind:"union",types:e}}function u(n){switch(n.kind){case"primitive":return`primitive:${n.type}`;case"null":return"null";case"undefined":return"undefined";case"literal":return`literal:${typeof n.value}:${String(n.value)}`;case"array":return`array:${u(n.elementType)}`;case"object":return`object:${n.properties.map(e=>`${e.name}:${u(e.type)}:${e.optional}`).join(",")}`;case"union":return`union:${n.types.map(u).sort().join("|")}`;case"enum":return`enum:${n.name}:${n.values.join(",")}`;case"generic":return`generic:${n.name}:${n.typeArgs.map(u).join(",")}`;default:return"unknown"}}function T(n,e){return u(n)===u(e)?n:n.kind==="object"&&e.kind==="object"?O(n,e):n.kind==="array"&&e.kind==="array"?H(T(n.elementType,e.elementType)):j([n,e])}function O(n,e){let t=new Map;for(let r of n.properties)t.set(r.name,{...r});for(let r of e.properties){let i=t.get(r.name);i?(i.type=T(i.type,r.type),i.optional=i.optional||r.optional,r.comment&&!i.comment&&(i.comment=r.comment)):t.set(r.name,{...r,optional:!0})}for(let[r,i]of t)e.properties.some(o=>o.name===r)||(i.optional=!0);return C(Array.from(t.values()))}function m(n){return n===null?I():n===void 0?Z():typeof n=="string"?k("string"):typeof n=="number"?k("number"):typeof n=="boolean"?k("boolean"):Array.isArray(n)?A(n):typeof n=="object"?P(n):k("unknown")}function A(n){if(n.length===0)return{kind:"array",elementType:{kind:"primitive",type:"any"}};let e=n.map(r=>m(r)),t=e[0];for(let r=1;r<e.length;r++)t=T(t,e[r]);return{kind:"array",elementType:t}}function P(n){let e=[];for(let[t,r]of Object.entries(n)){let i=m(r);e.push({name:t,type:i,optional:!1})}return C(e)}function b(n,e){return u(n)===u(e)}function l(n){switch(n.kind){case"primitive":case"null":case"undefined":return{...n};case"literal":return{...n};case"array":return{...n,elementType:l(n.elementType)};case"object":return{...n,properties:n.properties.map(e=>({...e,type:l(e.type)}))};case"union":return{...n,types:n.types.map(e=>l(e))};case"enum":return{...n,values:[...n.values]};case"generic":return{...n,typeArgs:n.typeArgs.map(e=>l(e))};default:return{...n}}}var y=class{constructor(e={}){this.namedTypes=new Map;this.nameCounter=new Map;this.processing=new WeakSet;this.circularRefs=new Map;this.namingStyle=e.namingStyle||"PascalCase",this.prefix=e.prefix||"",this.suffix=e.suffix||"",this.customNameMap=e.customNameMap||{}}nameType(e,t={depth:0}){if(e.kind!=="object"&&e.kind!=="enum")return null;let r=this.buildPathKey(t);if(this.customNameMap[r])return this.applyAffixes(this.customNameMap[r]);let i=this.getTypeKey(e);if(this.namedTypes.has(i))return this.namedTypes.get(i);let s=this.generateName(e,t);return s=this.ensureUniqueName(s),s=this.applyAffixes(s),this.namedTypes.set(i,s),s}generateName(e,t){if(e.kind==="enum")return t.fieldName?this.toPascalCase(t.fieldName)+"Enum":"AnonymousEnum";if(e.kind==="object"){if(t.fieldName){let r=this.toPascalCase(t.fieldName);return t.parentName?`${t.parentName}${r}`:r}return t.parentName?`${t.parentName}Item`:"AnonymousObject"}return"UnknownType"}ensureUniqueName(e){let t=this.nameCounter.get(e)||0;if(t===0)return this.nameCounter.set(e,1),e;let r=`${e}${t+1}`;return this.nameCounter.set(e,t+1),r}applyAffixes(e){let t=e;return this.prefix&&(t=this.toPascalCase(this.prefix)+t),this.suffix&&(t=t+this.toPascalCase(this.suffix)),t}buildPathKey(e){let t=[];return e.parentName&&t.push(e.parentName),e.fieldName&&t.push(e.fieldName),t.join(".")}getTypeKey(e){return e.kind==="object"?`object:${e.properties.map(t=>`${t.name}:${this.getSimpleTypeKey(t.type)}:${t.optional}`).sort().join(",")}`:e.kind==="enum"?`enum:${e.values.sort().join(",")}`:e.kind}getSimpleTypeKey(e){switch(e.kind){case"primitive":return e.type;case"null":return"null";case"undefined":return"undefined";case"array":return`array<${this.getSimpleTypeKey(e.elementType)}>`;case"object":return"object";case"union":return e.types.map(t=>this.getSimpleTypeKey(t)).sort().join("|");case"enum":return`enum:${e.name}`;case"generic":return`generic:${e.name}`;default:return"unknown"}}toPascalCase(e){return e?e.replace(/[-_\s]+/g," ").replace(/([a-z])([A-Z])/g,"$1 $2").trim().split(" ").filter(Boolean).map(r=>r.charAt(0).toUpperCase()+r.slice(1).toLowerCase()).join(""):""}toCamelCase(e){let t=this.toPascalCase(e);return t.charAt(0).toLowerCase()+t.slice(1)}formatName(e){return this.namingStyle==="camelCase"?this.toCamelCase(e):this.toPascalCase(e)}isCircular(e){return this.processing.has(e)}markProcessing(e){this.processing.add(e)}unmarkProcessing(e){this.processing.delete(e)}getAllNamedTypes(){return new Map(this.namedTypes)}reset(){this.namedTypes.clear(),this.nameCounter.clear(),this.processing=new WeakSet,this.circularRefs.clear()}},f=class{constructor(e){this.collected=[];this.seenStructs=new Set;this.namer=e}collect(e,t){this.collected=[],this.seenStructs.clear(),this.namer.reset();let r=this.getStructKey(e);this.namer.nameType(e,{fieldName:t,depth:0}),this.collectRecursive(e,{fieldName:t,parentName:void 0,depth:0});let i=this.collected.find(o=>o.name===t),s=this.collected.filter(o=>o.name!==t);return i?[i,...s]:this.collected}collectRecursive(e,t){let r=this.getStructKey(e);if(e.kind==="object"){let i=this.namer.nameType(e,t);if(i&&!this.seenStructs.has(r)){this.seenStructs.add(r),this.collected.push({name:i,type:l(e)});for(let s of e.properties)this.collectRecursive(s.type,{fieldName:s.name,parentName:i,depth:t.depth+1})}return}if(e.kind==="array"){this.collectRecursive(e.elementType,{fieldName:t.fieldName?t.fieldName+"Item":void 0,parentName:t.parentName,depth:t.depth+1});return}if(e.kind==="union"){for(let i of e.types)this.collectRecursive(i,t);return}if(e.kind==="enum"){let i=this.namer.nameType(e,t);i&&!this.seenStructs.has(r)&&(this.seenStructs.add(r),this.collected.push({name:i,type:l(e)}));return}if(e.kind==="generic"){for(let i of e.typeArgs)this.collectRecursive(i,{...t,depth:t.depth+1});return}}getStructKey(e){return e.kind==="object"?`object:${e.properties.map(t=>`${t.name}:${this.getPropTypeKey(t.type)}:${t.optional}`).sort().join("|")}`:e.kind==="enum"?`enum:${[...e.values].sort().join(",")}`:e.kind}getPropTypeKey(e){switch(e.kind){case"primitive":return e.type;case"null":return"null";case"undefined":return"undefined";case"array":return`array:${this.getPropTypeKey(e.elementType)}`;case"object":return"object";case"union":return e.types.map(t=>this.getPropTypeKey(t)).sort().join("|");case"enum":return`enum:${e.name}`;case"generic":return`generic:${e.name}`;default:return"unknown"}}};var d=class{constructor(e,t){this.allNamedTypes=[];this.options=e,this.namer=t}findTypeName(e){for(let t of this.allNamedTypes)if(b(t.type,e))return t.name;return null}formatTypeDef(e){let{name:t,type:r,comment:i}=e,s=this.options.addExport?"export ":"";return r.kind==="enum"?this.formatEnumType(t,r,s,i):this.formatObjectType(t,r,s,i)}formatObjectType(e,t,r,i){let s=" ".repeat(this.options.indentSize),o=this.sortProperties(t.properties),a=[];i&&a.push(this.formatJSDoc(i)),this.options.outputStyle==="interface"?a.push(`${r}interface ${e} {`):a.push(`${r}type ${e} = {`);for(let p of o){let c=this.formatPropertyName(p.name),K=p.optional?"?":"",M=this.formatType(p.type),w=`${s}${c}${K}: ${M};`;p.comment&&(w+=` // ${p.comment}`),a.push(w)}return this.options.outputStyle==="interface"?a.push("}"):a.push("};"),a.join(`
3
- `)}formatEnumType(e,t,r,i){let s=" ".repeat(this.options.indentSize),o=[];i&&o.push(this.formatJSDoc(i)),o.push(`${r}enum ${e} {`);for(let a of t.values){let p=this.toEnumKey(String(a)),c=typeof a=="string"?`'${a}'`:String(a);o.push(`${s}${p} = ${c},`)}return o.push("}"),o.join(`
4
- `)}formatType(e){if(e.kind==="object"||e.kind==="enum"){let t=this.findTypeName(e);if(t)return t}switch(e.kind){case"primitive":return e.type;case"null":return"null";case"undefined":return"undefined";case"array":return this.formatArrayType(e);case"object":return this.formatInlineObject(e);case"union":return this.formatUnionType(e.types);case"literal":return this.formatLiteral(e.value);case"enum":return e.name;case"generic":return`${e.name}<${e.typeArgs.map(t=>this.formatType(t)).join(", ")}>`;default:return"unknown"}}formatLiteral(e){return typeof e=="string"?`'${e}'`:String(e)}formatArrayType(e){let t=this.formatType(e.elementType);return e.elementType.kind==="union"?`(${t})[]`:`${t}[]`}formatInlineObject(e){let t=" ".repeat(this.options.indentSize),r=this.sortProperties(e.properties);if(r.length===0)return"{}";let i=["{"];for(let s of r){let o=this.formatPropertyName(s.name),a=s.optional?"?":"",p=this.formatType(s.type);i.push(`${t}${o}${a}: ${p};`)}return i.push("}"),i.join(`
1
+ "use strict";var x=Object.defineProperty;var K=Object.getOwnPropertyDescriptor;var E=Object.getOwnPropertyNames;var L=Object.prototype.hasOwnProperty;var z=(n,e)=>{for(var t in e)x(n,t,{get:e[t],enumerable:!0})},_=(n,e,t,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let i of E(e))!L.call(n,i)&&i!==t&&x(n,i,{get:()=>e[i],enumerable:!(r=K(e,i))||r.enumerable});return n};var q=n=>_(x({},"__esModule",{value:!0}),n);var B={};z(B,{CodeFormatter:()=>y,GenericExtractor:()=>T,NullHandler:()=>g,OptionalHandler:()=>h,TypeCollector:()=>f,TypeNamer:()=>m,addGuessedComments:()=>k,applyEnhancements:()=>b,createUnion:()=>O,default:()=>H,generate:()=>j,generateFromString:()=>R,generateType:()=>D,guessCommentFromFieldName:()=>A,inferArrayType:()=>$,inferObjectType:()=>P,inferType:()=>l,isStructurallyEqual:()=>S,mergeObjects:()=>v,mergeTypes:()=>d});module.exports=q(B);var w={rootName:"Root",outputStyle:"interface",namingStyle:"PascalCase",sortProperties:"alpha",addExport:!0,addComments:!1,strictNullChecks:!1,markOptional:!0,extractGenerics:!0,indentSize:2,lineEnding:`
2
+ `,typeNameMap:{},typePrefix:"",typeSuffix:""};function N(n){return{kind:"primitive",type:n}}function I(){return{kind:"null"}}function Z(){return{kind:"undefined"}}function V(n){return{kind:"array",elementType:n}}function G(n=[]){return{kind:"object",properties:n}}function O(n){let e=[],t=new Set;for(let r of n)if(r.kind==="union")for(let i of r.types){let o=p(i);t.has(o)||(t.add(o),e.push(i))}else{let i=p(r);t.has(i)||(t.add(i),e.push(r))}return e.length===1?e[0]:{kind:"union",types:e}}function p(n){switch(n.kind){case"primitive":return`primitive:${n.type}`;case"null":return"null";case"undefined":return"undefined";case"literal":return`literal:${typeof n.value}:${String(n.value)}`;case"array":return`array:${p(n.elementType)}`;case"object":return`object:${n.properties.map(e=>`${e.name}:${p(e.type)}:${e.optional}`).join(",")}`;case"union":return`union:${n.types.map(p).sort().join("|")}`;case"generic":return`generic:${n.name}:${n.typeArgs.map(p).join(",")}`;default:return"unknown"}}function d(n,e){return p(n)===p(e)?n:n.kind==="object"&&e.kind==="object"?v(n,e):n.kind==="array"&&e.kind==="array"?V(d(n.elementType,e.elementType)):O([n,e])}function v(n,e){let t=new Map;for(let r of n.properties)t.set(r.name,{...r});for(let r of e.properties){let i=t.get(r.name);i?(i.type=d(i.type,r.type),i.optional=i.optional||r.optional,r.comment&&!i.comment&&(i.comment=r.comment)):t.set(r.name,{...r,optional:!0})}for(let[r,i]of t)e.properties.some(s=>s.name===r)||(i.optional=!0);return G(Array.from(t.values()))}function l(n){return n===null?I():n===void 0?Z():typeof n=="string"?N("string"):typeof n=="number"?N("number"):typeof n=="boolean"?N("boolean"):Array.isArray(n)?$(n):typeof n=="object"?P(n):N("unknown")}function $(n){if(n.length===0)return{kind:"array",elementType:{kind:"primitive",type:"any"}};let e=n.map(r=>l(r)),t=e[0];for(let r=1;r<e.length;r++)t=d(t,e[r]);return{kind:"array",elementType:t}}function P(n){let e=[];for(let[t,r]of Object.entries(n)){let i=l(r);e.push({name:t,type:i,optional:!1})}return G(e)}function S(n,e){return p(n)===p(e)}function u(n){switch(n.kind){case"primitive":case"null":case"undefined":return{...n};case"literal":return{...n};case"array":return{...n,elementType:u(n.elementType)};case"object":return{...n,properties:n.properties.map(e=>({...e,type:u(e.type)}))};case"union":return{...n,types:n.types.map(e=>u(e))};case"generic":return{...n,typeArgs:n.typeArgs.map(e=>u(e))};default:return{...n}}}var m=class{constructor(e={}){this.namedTypes=new Map;this.nameCounter=new Map;this.processing=new WeakSet;this.circularRefs=new Map;this.namingStyle=e.namingStyle||"PascalCase",this.prefix=e.prefix||"",this.suffix=e.suffix||"",this.customNameMap=e.customNameMap||{}}nameType(e,t={depth:0}){if(e.kind!=="object")return null;let r=this.buildPathKey(t);if(this.customNameMap[r])return this.applyAffixes(this.customNameMap[r]);let i=this.getTypeKey(e);if(this.namedTypes.has(i))return this.namedTypes.get(i);let o=this.generateName(e,t);return o=this.ensureUniqueName(o),o=this.applyAffixes(o),this.namedTypes.set(i,o),o}generateName(e,t){if(e.kind==="object"){if(t.fieldName){let r=this.toPascalCase(t.fieldName);return t.parentName?`${t.parentName}${r}`:r}return t.parentName?`${t.parentName}Item`:"AnonymousObject"}return"UnknownType"}ensureUniqueName(e){let t=this.nameCounter.get(e)||0;if(t===0)return this.nameCounter.set(e,1),e;let r=`${e}${t+1}`;return this.nameCounter.set(e,t+1),r}applyAffixes(e){let t=e;return this.prefix&&(t=this.toPascalCase(this.prefix)+t),this.suffix&&(t=t+this.toPascalCase(this.suffix)),t}buildPathKey(e){let t=[];return e.parentName&&t.push(e.parentName),e.fieldName&&t.push(e.fieldName),t.join(".")}getTypeKey(e){return e.kind==="object"?`object:${e.properties.map(t=>`${t.name}:${this.getSimpleTypeKey(t.type)}:${t.optional}`).sort().join(",")}`:e.kind}getSimpleTypeKey(e){switch(e.kind){case"primitive":return e.type;case"null":return"null";case"undefined":return"undefined";case"array":return`array<${this.getSimpleTypeKey(e.elementType)}>`;case"object":return"object";case"union":return e.types.map(t=>this.getSimpleTypeKey(t)).sort().join("|");case"generic":return`generic:${e.name}`;default:return"unknown"}}toPascalCase(e){return e?e.replace(/[-_\s]+/g," ").replace(/([a-z])([A-Z])/g,"$1 $2").trim().split(" ").filter(Boolean).map(r=>r.charAt(0).toUpperCase()+r.slice(1).toLowerCase()).join(""):""}toCamelCase(e){let t=this.toPascalCase(e);return t.charAt(0).toLowerCase()+t.slice(1)}formatName(e){return this.namingStyle==="camelCase"?this.toCamelCase(e):this.toPascalCase(e)}isCircular(e){return this.processing.has(e)}markProcessing(e){this.processing.add(e)}unmarkProcessing(e){this.processing.delete(e)}getAllNamedTypes(){return new Map(this.namedTypes)}reset(){this.namedTypes.clear(),this.nameCounter.clear(),this.processing=new WeakSet,this.circularRefs.clear()}},f=class{constructor(e){this.collected=[];this.seenStructs=new Set;this.namer=e}collect(e,t){this.collected=[],this.seenStructs.clear(),this.namer.reset();let r=this.getStructKey(e);this.namer.nameType(e,{fieldName:t,depth:0}),this.collectRecursive(e,{fieldName:t,parentName:void 0,depth:0});let i=this.collected.find(s=>s.name===t),o=this.collected.filter(s=>s.name!==t);return i?[i,...o]:this.collected}collectRecursive(e,t){let r=this.getStructKey(e);if(e.kind==="object"){let i=this.namer.nameType(e,t);if(i&&!this.seenStructs.has(r)){this.seenStructs.add(r),this.collected.push({name:i,type:u(e)});for(let o of e.properties)this.collectRecursive(o.type,{fieldName:o.name,parentName:i,depth:t.depth+1})}return}if(e.kind==="array"){this.collectRecursive(e.elementType,{fieldName:t.fieldName?t.fieldName+"Item":void 0,parentName:t.parentName,depth:t.depth+1});return}if(e.kind==="union"){for(let i of e.types)this.collectRecursive(i,t);return}if(e.kind==="generic"){for(let i of e.typeArgs)this.collectRecursive(i,{...t,depth:t.depth+1});return}}getStructKey(e){return e.kind==="object"?`object:${e.properties.map(t=>`${t.name}:${this.getPropTypeKey(t.type)}:${t.optional}`).sort().join("|")}`:e.kind}getPropTypeKey(e){switch(e.kind){case"primitive":return e.type;case"null":return"null";case"undefined":return"undefined";case"array":return`array:${this.getPropTypeKey(e.elementType)}`;case"object":return"object";case"union":return e.types.map(t=>this.getPropTypeKey(t)).sort().join("|");case"generic":return`generic:${e.name}`;default:return"unknown"}}};var y=class{constructor(e,t){this.allNamedTypes=[];this.options=e,this.namer=t}findTypeName(e){if(e.kind!=="object")return null;for(let t of this.allNamedTypes)if(S(t.type,e))return t.name;return null}formatTypeDef(e){let{name:t,type:r,comment:i}=e,o=this.options.addExport?"export ":"";return this.formatObjectType(t,r,o,i)}formatObjectType(e,t,r,i){let o=" ".repeat(this.options.indentSize),s=this.sortProperties(t.properties),a=[];i&&a.push(this.formatJSDoc(i)),this.options.outputStyle==="interface"?a.push(`${r}interface ${e} {`):a.push(`${r}type ${e} = {`);for(let c of s){let U=this.formatPropertyName(c.name),F=c.optional?"?":"",M=this.formatType(c.type),C=`${o}${U}${F}: ${M};`;c.comment&&(C+=` // ${c.comment}`),a.push(C)}return this.options.outputStyle==="interface"?a.push("}"):a.push("};"),a.join(`
3
+ `)}formatType(e){if(e.kind==="object"){let t=this.findTypeName(e);if(t)return t}switch(e.kind){case"primitive":return e.type;case"null":return"null";case"undefined":return"undefined";case"array":return this.formatArrayType(e);case"object":return this.formatInlineObject(e);case"union":return this.formatUnionType(e.types);case"literal":return this.formatLiteral(e.value);case"generic":return`${e.name}<${e.typeArgs.map(t=>this.formatType(t)).join(", ")}>`;default:return"unknown"}}formatLiteral(e){return typeof e=="string"?`'${e}'`:String(e)}formatArrayType(e){let t=this.formatType(e.elementType);return e.elementType.kind==="union"?`(${t})[]`:`${t}[]`}formatInlineObject(e){let t=" ".repeat(this.options.indentSize),r=this.sortProperties(e.properties);if(r.length===0)return"{}";let i=["{"];for(let o of r){let s=this.formatPropertyName(o.name),a=o.optional?"?":"",c=this.formatType(o.type);i.push(`${t}${s}${a}: ${c};`)}return i.push("}"),i.join(`
5
4
  `)}formatUnionType(e){return e.map(t=>this.formatType(t)).join(" | ")}formatPropertyName(e){return/^[a-zA-Z_$][a-zA-Z0-9_$]*$/.test(e)?e:`'${e}'`}sortProperties(e){return this.options.sortProperties==="definition"?[...e]:[...e].sort((t,r)=>t.name.localeCompare(r.name))}formatJSDoc(e){let t=e.split(`
6
5
  `);return t.length===1?`/** ${e} */`:["/**",...t.map(r=>` * ${r}`)," */"].join(`
7
- `)}toEnumKey(e){return e.replace(/[-_\s]+/g,"_").replace(/([a-z])([A-Z])/g,"$1_$2").toUpperCase().replace(/^_+|_+$/g,"")}formatAll(e){return this.allNamedTypes=e,e.map(t=>this.formatTypeDef(t)).join(`
6
+ `)}formatAll(e){return this.allNamedTypes=e,e.map(t=>this.formatTypeDef(t)).join(`
8
7
 
9
8
  `)}generateOutput(e,t){let r=`/**
10
9
  * Generated by ts-gen
@@ -12,4 +11,4 @@
12
11
  */`,i=this.formatAll(e);return`${r}
13
12
 
14
13
  ${i}
15
- `}};function J(n){return{id:"\u552F\u4E00\u6807\u8BC6",name:"\u540D\u79F0",title:"\u6807\u9898",desc:"\u63CF\u8FF0",description:"\u63CF\u8FF0",avatar:"\u5934\u50CF",email:"\u90AE\u7BB1",phone:"\u624B\u673A\u53F7",status:"\u72B6\u6001",type:"\u7C7B\u578B",createdAt:"\u521B\u5EFA\u65F6\u95F4",updatedAt:"\u66F4\u65B0\u65F6\u95F4",deletedAt:"\u5220\u9664\u65F6\u95F4",list:"\u6570\u636E\u5217\u8868",total:"\u603B\u6570",page:"\u9875\u7801",pageSize:"\u6BCF\u9875\u6570\u91CF"}[n]}function R(n){return{...n,properties:n.properties.map(e=>({...e,comment:e.comment||J(e.name)}))}}var g=class{constructor(){this.patterns=[{name:"PageResult",arrayFields:["list","records","rows","items"],countFields:["total","count","totalCount"]},{name:"ListResult",arrayFields:["list","data","items"],countFields:[]},{name:"ApiResponse",arrayFields:["data"],countFields:[]}]}extract(e){if(e.kind!=="object")return e;for(let t of this.patterns){let r=this.tryMatchPattern(e,t);if(r)return r}return e}tryMatchPattern(e,t){let r=null,i=t.countFields.length===0;for(let s of e.properties)t.arrayFields.includes(s.name)&&s.type.kind==="array"&&(r={name:s.name,elementType:s.type.elementType}),t.countFields.includes(s.name)&&(i=!0);return r&&i?{kind:"generic",name:t.name,typeArgs:[r.elementType]}:null}},h=class{constructor(e=5){this.threshold=e}extract(e,t){if(t.kind==="object"&&e&&typeof e=="object"){let r=t.properties.map(i=>{let s=e[i.name];if(i.type.kind==="primitive"&&i.type.type==="string"){let o=this.tryExtractEnum([s],i.type,i.name);if(o)return{...i,type:o}}if(i.type.kind==="array"&&Array.isArray(s)){let o=i.type.elementType;if(o.kind==="primitive"&&o.type==="string"){let p=[...new Set(s.filter(c=>typeof c=="string"))];if(p.length>0&&p.length<=this.threshold&&this.isValidEnumValues(p)){let c={kind:"enum",name:`${G(i.name)}ItemEnum`,values:p};return{...i,type:{kind:"array",elementType:c}}}}let a=this.extract(s.length>0?s[0]:void 0,o);return{...i,type:{kind:"array",elementType:a}}}return{...i,type:this.extract(s,i.type)}});return{...t,properties:r}}if(t.kind==="array"&&Array.isArray(e)){let r=t.elementType,i=this.extract(e.length>0?e[0]:void 0,r);return{...t,elementType:i}}return t}tryExtractEnum(e,t,r){let i=e.filter(o=>typeof o=="string"),s=[...new Set(i)];return s.length===0||s.length>this.threshold||!this.isValidEnumValues(s)?null:{kind:"enum",name:`${G(r)}Enum`,values:s}}isValidEnumValues(e){return e.every(t=>/^[a-zA-Z0-9_-]+$/.test(t))}},N=class{constructor(e=!1){this.strict=e}process(e){if(this.strict)return e;if(e.kind==="union"){let t=e.types.filter(r=>r.kind!=="null");return t.length===0?{kind:"null"}:t.length===1?t[0]:{...e,types:t}}return e.kind==="array"?{...e,elementType:this.process(e.elementType)}:e.kind==="object"?{...e,properties:e.properties.map(t=>({...t,type:this.process(t.type)}))}:e}},S=class{constructor(e=!0){this.markOptional=e}process(e,t){if(!this.markOptional)return t;if(t.kind==="array"&&Array.isArray(e)){let r=t.elementType;if(r.kind==="object"){let i=this.processArrayObjects(e,r);return{...t,elementType:i}}}return t}processArrayObjects(e,t){if(e.length<=1)return t;let r={},i=e.length;for(let s of e)if(s&&typeof s=="object")for(let o of Object.keys(s))r[o]=(r[o]||0)+1;return{...t,properties:t.properties.map(s=>{let a=(r[s.name]||0)<i;return{...s,optional:a}})}}};function x(n,e,t){let r=e;return t.markOptional&&(r=new S(t.markOptional).process(n,r)),t.extractEnums&&(r=new h(t.enumThreshold||5).extract(n,r)),t.extractGenerics&&(r=new g().extract(r)),r=new N(t.strictNullChecks).process(r),r}function G(n){return n.charAt(0).toUpperCase()+n.slice(1)}function v(n,e={}){let t={...E,...e},r=m(n);r=x(n,r,t),t.addComments&&r.kind==="object"&&(r=R(r));let i=new y({namingStyle:t.namingStyle,prefix:t.typePrefix,suffix:t.typeSuffix,customNameMap:t.typeNameMap}),s=new f(i),o=t.rootName||"Root",a=s.collect(r,o);return{code:new d(t,i).generateOutput(a,o),types:a}}function U(n,e={}){let t=JSON.parse(n);return v(t,e)}function D(n,e={}){return v(n,e).code}var B={generate:v,generateFromString:U,generateType:D};0&&(module.exports={CodeFormatter,EnumExtractor,GenericExtractor,NullHandler,OptionalHandler,TypeCollector,TypeNamer,applyEnhancements,createUnion,generate,generateFromString,generateType,inferArrayType,inferObjectType,inferType,isStructurallyEqual,mergeObjects,mergeTypes});
14
+ `}};function A(n){return{id:"\u552F\u4E00\u6807\u8BC6",name:"\u540D\u79F0",title:"\u6807\u9898",desc:"\u63CF\u8FF0",description:"\u63CF\u8FF0",avatar:"\u5934\u50CF",email:"\u90AE\u7BB1",phone:"\u624B\u673A\u53F7",status:"\u72B6\u6001",type:"\u7C7B\u578B",createdAt:"\u521B\u5EFA\u65F6\u95F4",updatedAt:"\u66F4\u65B0\u65F6\u95F4",deletedAt:"\u5220\u9664\u65F6\u95F4",list:"\u6570\u636E\u5217\u8868",total:"\u603B\u6570",page:"\u9875\u7801",pageSize:"\u6BCF\u9875\u6570\u91CF"}[n]}function k(n){return{...n,properties:n.properties.map(e=>({...e,comment:e.comment||A(e.name)}))}}var T=class{constructor(){this.patterns=[{name:"PageResult",arrayFields:["list","records","rows","items"],countFields:["total","count","totalCount"]},{name:"ListResult",arrayFields:["list","data","items"],countFields:[]},{name:"ApiResponse",arrayFields:["data"],countFields:[]}]}extract(e){if(e.kind!=="object")return e;for(let t of this.patterns){let r=this.tryMatchPattern(e,t);if(r)return r}return e}tryMatchPattern(e,t){let r=null,i=t.countFields.length===0;for(let o of e.properties)t.arrayFields.includes(o.name)&&o.type.kind==="array"&&(r={name:o.name,elementType:o.type.elementType}),t.countFields.includes(o.name)&&(i=!0);return r&&i?{kind:"generic",name:t.name,typeArgs:[r.elementType]}:null}},g=class{constructor(e=!1){this.strict=e}process(e){if(this.strict)return e;if(e.kind==="union"){let t=e.types.filter(r=>r.kind!=="null");return t.length===0?{kind:"null"}:t.length===1?t[0]:{...e,types:t}}return e.kind==="array"?{...e,elementType:this.process(e.elementType)}:e.kind==="object"?{...e,properties:e.properties.map(t=>({...t,type:this.process(t.type)}))}:e}},h=class{constructor(e=!0){this.markOptional=e}process(e,t){if(!this.markOptional)return t;if(t.kind==="array"&&Array.isArray(e)){let r=t.elementType;if(r.kind==="object"){let i=this.processArrayObjects(e,r);return{...t,elementType:i}}}return t}processArrayObjects(e,t){if(e.length<=1)return t;let r={},i=e.length;for(let o of e)if(o&&typeof o=="object")for(let s of Object.keys(o))r[s]=(r[s]||0)+1;return{...t,properties:t.properties.map(o=>{let a=(r[o.name]||0)<i;return{...o,optional:a}})}}};function b(n,e,t){let r=e;return t.markOptional&&(r=new h(t.markOptional).process(n,r)),t.extractGenerics&&(r=new T().extract(r)),r=new g(t.strictNullChecks).process(r),r}function j(n,e={}){let t={...w,...e},r=l(n);r=b(n,r,t),t.addComments&&r.kind==="object"&&(r=k(r));let i=new m({namingStyle:t.namingStyle,prefix:t.typePrefix,suffix:t.typeSuffix,customNameMap:t.typeNameMap}),s=new f(i).collect(r,t.rootName);return{code:new y(t,i).generateOutput(s,t.rootName),types:s}}function R(n,e={}){let t=JSON.parse(n);return j(t,e)}function D(n,e={}){return j(n,e).code}var H={generate:j,generateFromString:R,generateType:D};0&&(module.exports={CodeFormatter,GenericExtractor,NullHandler,OptionalHandler,TypeCollector,TypeNamer,addGuessedComments,applyEnhancements,createUnion,generate,generateFromString,generateType,guessCommentFromFieldName,inferArrayType,inferObjectType,inferType,isStructurallyEqual,mergeObjects,mergeTypes});
package/dist/index.mjs CHANGED
@@ -1,10 +1,9 @@
1
- var j={rootName:"Root",outputStyle:"interface",namingStyle:"PascalCase",sortProperties:"alpha",addExport:!0,addComments:!1,strictNullChecks:!1,markOptional:!0,extractEnums:!0,enumThreshold:5,extractGenerics:!0,indentSize:2,lineEnding:`
2
- `,typeNameMap:{},typePrefix:"",typeSuffix:""};function T(n){return{kind:"primitive",type:n}}function D(){return{kind:"null"}}function K(){return{kind:"undefined"}}function M(n){return{kind:"array",elementType:n}}function O(n=[]){return{kind:"object",properties:n}}function A(n){let e=[],t=new Set;for(let r of n)if(r.kind==="union")for(let i of r.types){let s=u(i);t.has(s)||(t.add(s),e.push(i))}else{let i=u(r);t.has(i)||(t.add(i),e.push(r))}return e.length===1?e[0]:{kind:"union",types:e}}function u(n){switch(n.kind){case"primitive":return`primitive:${n.type}`;case"null":return"null";case"undefined":return"undefined";case"literal":return`literal:${typeof n.value}:${String(n.value)}`;case"array":return`array:${u(n.elementType)}`;case"object":return`object:${n.properties.map(e=>`${e.name}:${u(e.type)}:${e.optional}`).join(",")}`;case"union":return`union:${n.types.map(u).sort().join("|")}`;case"enum":return`enum:${n.name}:${n.values.join(",")}`;case"generic":return`generic:${n.name}:${n.typeArgs.map(u).join(",")}`;default:return"unknown"}}function g(n,e){return u(n)===u(e)?n:n.kind==="object"&&e.kind==="object"?P(n,e):n.kind==="array"&&e.kind==="array"?M(g(n.elementType,e.elementType)):A([n,e])}function P(n,e){let t=new Map;for(let r of n.properties)t.set(r.name,{...r});for(let r of e.properties){let i=t.get(r.name);i?(i.type=g(i.type,r.type),i.optional=i.optional||r.optional,r.comment&&!i.comment&&(i.comment=r.comment)):t.set(r.name,{...r,optional:!0})}for(let[r,i]of t)e.properties.some(o=>o.name===r)||(i.optional=!0);return O(Array.from(t.values()))}function m(n){return n===null?D():n===void 0?K():typeof n=="string"?T("string"):typeof n=="number"?T("number"):typeof n=="boolean"?T("boolean"):Array.isArray(n)?w(n):typeof n=="object"?E(n):T("unknown")}function w(n){if(n.length===0)return{kind:"array",elementType:{kind:"primitive",type:"any"}};let e=n.map(r=>m(r)),t=e[0];for(let r=1;r<e.length;r++)t=g(t,e[r]);return{kind:"array",elementType:t}}function E(n){let e=[];for(let[t,r]of Object.entries(n)){let i=m(r);e.push({name:t,type:i,optional:!1})}return O(e)}function b(n,e){return u(n)===u(e)}function l(n){switch(n.kind){case"primitive":case"null":case"undefined":return{...n};case"literal":return{...n};case"array":return{...n,elementType:l(n.elementType)};case"object":return{...n,properties:n.properties.map(e=>({...e,type:l(e.type)}))};case"union":return{...n,types:n.types.map(e=>l(e))};case"enum":return{...n,values:[...n.values]};case"generic":return{...n,typeArgs:n.typeArgs.map(e=>l(e))};default:return{...n}}}var y=class{constructor(e={}){this.namedTypes=new Map;this.nameCounter=new Map;this.processing=new WeakSet;this.circularRefs=new Map;this.namingStyle=e.namingStyle||"PascalCase",this.prefix=e.prefix||"",this.suffix=e.suffix||"",this.customNameMap=e.customNameMap||{}}nameType(e,t={depth:0}){if(e.kind!=="object"&&e.kind!=="enum")return null;let r=this.buildPathKey(t);if(this.customNameMap[r])return this.applyAffixes(this.customNameMap[r]);let i=this.getTypeKey(e);if(this.namedTypes.has(i))return this.namedTypes.get(i);let s=this.generateName(e,t);return s=this.ensureUniqueName(s),s=this.applyAffixes(s),this.namedTypes.set(i,s),s}generateName(e,t){if(e.kind==="enum")return t.fieldName?this.toPascalCase(t.fieldName)+"Enum":"AnonymousEnum";if(e.kind==="object"){if(t.fieldName){let r=this.toPascalCase(t.fieldName);return t.parentName?`${t.parentName}${r}`:r}return t.parentName?`${t.parentName}Item`:"AnonymousObject"}return"UnknownType"}ensureUniqueName(e){let t=this.nameCounter.get(e)||0;if(t===0)return this.nameCounter.set(e,1),e;let r=`${e}${t+1}`;return this.nameCounter.set(e,t+1),r}applyAffixes(e){let t=e;return this.prefix&&(t=this.toPascalCase(this.prefix)+t),this.suffix&&(t=t+this.toPascalCase(this.suffix)),t}buildPathKey(e){let t=[];return e.parentName&&t.push(e.parentName),e.fieldName&&t.push(e.fieldName),t.join(".")}getTypeKey(e){return e.kind==="object"?`object:${e.properties.map(t=>`${t.name}:${this.getSimpleTypeKey(t.type)}:${t.optional}`).sort().join(",")}`:e.kind==="enum"?`enum:${e.values.sort().join(",")}`:e.kind}getSimpleTypeKey(e){switch(e.kind){case"primitive":return e.type;case"null":return"null";case"undefined":return"undefined";case"array":return`array<${this.getSimpleTypeKey(e.elementType)}>`;case"object":return"object";case"union":return e.types.map(t=>this.getSimpleTypeKey(t)).sort().join("|");case"enum":return`enum:${e.name}`;case"generic":return`generic:${e.name}`;default:return"unknown"}}toPascalCase(e){return e?e.replace(/[-_\s]+/g," ").replace(/([a-z])([A-Z])/g,"$1 $2").trim().split(" ").filter(Boolean).map(r=>r.charAt(0).toUpperCase()+r.slice(1).toLowerCase()).join(""):""}toCamelCase(e){let t=this.toPascalCase(e);return t.charAt(0).toLowerCase()+t.slice(1)}formatName(e){return this.namingStyle==="camelCase"?this.toCamelCase(e):this.toPascalCase(e)}isCircular(e){return this.processing.has(e)}markProcessing(e){this.processing.add(e)}unmarkProcessing(e){this.processing.delete(e)}getAllNamedTypes(){return new Map(this.namedTypes)}reset(){this.namedTypes.clear(),this.nameCounter.clear(),this.processing=new WeakSet,this.circularRefs.clear()}},f=class{constructor(e){this.collected=[];this.seenStructs=new Set;this.namer=e}collect(e,t){this.collected=[],this.seenStructs.clear(),this.namer.reset();let r=this.getStructKey(e);this.namer.nameType(e,{fieldName:t,depth:0}),this.collectRecursive(e,{fieldName:t,parentName:void 0,depth:0});let i=this.collected.find(o=>o.name===t),s=this.collected.filter(o=>o.name!==t);return i?[i,...s]:this.collected}collectRecursive(e,t){let r=this.getStructKey(e);if(e.kind==="object"){let i=this.namer.nameType(e,t);if(i&&!this.seenStructs.has(r)){this.seenStructs.add(r),this.collected.push({name:i,type:l(e)});for(let s of e.properties)this.collectRecursive(s.type,{fieldName:s.name,parentName:i,depth:t.depth+1})}return}if(e.kind==="array"){this.collectRecursive(e.elementType,{fieldName:t.fieldName?t.fieldName+"Item":void 0,parentName:t.parentName,depth:t.depth+1});return}if(e.kind==="union"){for(let i of e.types)this.collectRecursive(i,t);return}if(e.kind==="enum"){let i=this.namer.nameType(e,t);i&&!this.seenStructs.has(r)&&(this.seenStructs.add(r),this.collected.push({name:i,type:l(e)}));return}if(e.kind==="generic"){for(let i of e.typeArgs)this.collectRecursive(i,{...t,depth:t.depth+1});return}}getStructKey(e){return e.kind==="object"?`object:${e.properties.map(t=>`${t.name}:${this.getPropTypeKey(t.type)}:${t.optional}`).sort().join("|")}`:e.kind==="enum"?`enum:${[...e.values].sort().join(",")}`:e.kind}getPropTypeKey(e){switch(e.kind){case"primitive":return e.type;case"null":return"null";case"undefined":return"undefined";case"array":return`array:${this.getPropTypeKey(e.elementType)}`;case"object":return"object";case"union":return e.types.map(t=>this.getPropTypeKey(t)).sort().join("|");case"enum":return`enum:${e.name}`;case"generic":return`generic:${e.name}`;default:return"unknown"}}};var d=class{constructor(e,t){this.allNamedTypes=[];this.options=e,this.namer=t}findTypeName(e){for(let t of this.allNamedTypes)if(b(t.type,e))return t.name;return null}formatTypeDef(e){let{name:t,type:r,comment:i}=e,s=this.options.addExport?"export ":"";return r.kind==="enum"?this.formatEnumType(t,r,s,i):this.formatObjectType(t,r,s,i)}formatObjectType(e,t,r,i){let s=" ".repeat(this.options.indentSize),o=this.sortProperties(t.properties),a=[];i&&a.push(this.formatJSDoc(i)),this.options.outputStyle==="interface"?a.push(`${r}interface ${e} {`):a.push(`${r}type ${e} = {`);for(let p of o){let c=this.formatPropertyName(p.name),G=p.optional?"?":"",U=this.formatType(p.type),$=`${s}${c}${G}: ${U};`;p.comment&&($+=` // ${p.comment}`),a.push($)}return this.options.outputStyle==="interface"?a.push("}"):a.push("};"),a.join(`
3
- `)}formatEnumType(e,t,r,i){let s=" ".repeat(this.options.indentSize),o=[];i&&o.push(this.formatJSDoc(i)),o.push(`${r}enum ${e} {`);for(let a of t.values){let p=this.toEnumKey(String(a)),c=typeof a=="string"?`'${a}'`:String(a);o.push(`${s}${p} = ${c},`)}return o.push("}"),o.join(`
4
- `)}formatType(e){if(e.kind==="object"||e.kind==="enum"){let t=this.findTypeName(e);if(t)return t}switch(e.kind){case"primitive":return e.type;case"null":return"null";case"undefined":return"undefined";case"array":return this.formatArrayType(e);case"object":return this.formatInlineObject(e);case"union":return this.formatUnionType(e.types);case"literal":return this.formatLiteral(e.value);case"enum":return e.name;case"generic":return`${e.name}<${e.typeArgs.map(t=>this.formatType(t)).join(", ")}>`;default:return"unknown"}}formatLiteral(e){return typeof e=="string"?`'${e}'`:String(e)}formatArrayType(e){let t=this.formatType(e.elementType);return e.elementType.kind==="union"?`(${t})[]`:`${t}[]`}formatInlineObject(e){let t=" ".repeat(this.options.indentSize),r=this.sortProperties(e.properties);if(r.length===0)return"{}";let i=["{"];for(let s of r){let o=this.formatPropertyName(s.name),a=s.optional?"?":"",p=this.formatType(s.type);i.push(`${t}${o}${a}: ${p};`)}return i.push("}"),i.join(`
1
+ var O={rootName:"Root",outputStyle:"interface",namingStyle:"PascalCase",sortProperties:"alpha",addExport:!0,addComments:!1,strictNullChecks:!1,markOptional:!0,extractGenerics:!0,indentSize:2,lineEnding:`
2
+ `,typeNameMap:{},typePrefix:"",typeSuffix:""};function d(n){return{kind:"primitive",type:n}}function U(){return{kind:"null"}}function F(){return{kind:"undefined"}}function M(n){return{kind:"array",elementType:n}}function v(n=[]){return{kind:"object",properties:n}}function $(n){let e=[],t=new Set;for(let r of n)if(r.kind==="union")for(let i of r.types){let o=p(i);t.has(o)||(t.add(o),e.push(i))}else{let i=p(r);t.has(i)||(t.add(i),e.push(r))}return e.length===1?e[0]:{kind:"union",types:e}}function p(n){switch(n.kind){case"primitive":return`primitive:${n.type}`;case"null":return"null";case"undefined":return"undefined";case"literal":return`literal:${typeof n.value}:${String(n.value)}`;case"array":return`array:${p(n.elementType)}`;case"object":return`object:${n.properties.map(e=>`${e.name}:${p(e.type)}:${e.optional}`).join(",")}`;case"union":return`union:${n.types.map(p).sort().join("|")}`;case"generic":return`generic:${n.name}:${n.typeArgs.map(p).join(",")}`;default:return"unknown"}}function T(n,e){return p(n)===p(e)?n:n.kind==="object"&&e.kind==="object"?P(n,e):n.kind==="array"&&e.kind==="array"?M(T(n.elementType,e.elementType)):$([n,e])}function P(n,e){let t=new Map;for(let r of n.properties)t.set(r.name,{...r});for(let r of e.properties){let i=t.get(r.name);i?(i.type=T(i.type,r.type),i.optional=i.optional||r.optional,r.comment&&!i.comment&&(i.comment=r.comment)):t.set(r.name,{...r,optional:!0})}for(let[r,i]of t)e.properties.some(s=>s.name===r)||(i.optional=!0);return v(Array.from(t.values()))}function l(n){return n===null?U():n===void 0?F():typeof n=="string"?d("string"):typeof n=="number"?d("number"):typeof n=="boolean"?d("boolean"):Array.isArray(n)?A(n):typeof n=="object"?C(n):d("unknown")}function A(n){if(n.length===0)return{kind:"array",elementType:{kind:"primitive",type:"any"}};let e=n.map(r=>l(r)),t=e[0];for(let r=1;r<e.length;r++)t=T(t,e[r]);return{kind:"array",elementType:t}}function C(n){let e=[];for(let[t,r]of Object.entries(n)){let i=l(r);e.push({name:t,type:i,optional:!1})}return v(e)}function S(n,e){return p(n)===p(e)}function u(n){switch(n.kind){case"primitive":case"null":case"undefined":return{...n};case"literal":return{...n};case"array":return{...n,elementType:u(n.elementType)};case"object":return{...n,properties:n.properties.map(e=>({...e,type:u(e.type)}))};case"union":return{...n,types:n.types.map(e=>u(e))};case"generic":return{...n,typeArgs:n.typeArgs.map(e=>u(e))};default:return{...n}}}var m=class{constructor(e={}){this.namedTypes=new Map;this.nameCounter=new Map;this.processing=new WeakSet;this.circularRefs=new Map;this.namingStyle=e.namingStyle||"PascalCase",this.prefix=e.prefix||"",this.suffix=e.suffix||"",this.customNameMap=e.customNameMap||{}}nameType(e,t={depth:0}){if(e.kind!=="object")return null;let r=this.buildPathKey(t);if(this.customNameMap[r])return this.applyAffixes(this.customNameMap[r]);let i=this.getTypeKey(e);if(this.namedTypes.has(i))return this.namedTypes.get(i);let o=this.generateName(e,t);return o=this.ensureUniqueName(o),o=this.applyAffixes(o),this.namedTypes.set(i,o),o}generateName(e,t){if(e.kind==="object"){if(t.fieldName){let r=this.toPascalCase(t.fieldName);return t.parentName?`${t.parentName}${r}`:r}return t.parentName?`${t.parentName}Item`:"AnonymousObject"}return"UnknownType"}ensureUniqueName(e){let t=this.nameCounter.get(e)||0;if(t===0)return this.nameCounter.set(e,1),e;let r=`${e}${t+1}`;return this.nameCounter.set(e,t+1),r}applyAffixes(e){let t=e;return this.prefix&&(t=this.toPascalCase(this.prefix)+t),this.suffix&&(t=t+this.toPascalCase(this.suffix)),t}buildPathKey(e){let t=[];return e.parentName&&t.push(e.parentName),e.fieldName&&t.push(e.fieldName),t.join(".")}getTypeKey(e){return e.kind==="object"?`object:${e.properties.map(t=>`${t.name}:${this.getSimpleTypeKey(t.type)}:${t.optional}`).sort().join(",")}`:e.kind}getSimpleTypeKey(e){switch(e.kind){case"primitive":return e.type;case"null":return"null";case"undefined":return"undefined";case"array":return`array<${this.getSimpleTypeKey(e.elementType)}>`;case"object":return"object";case"union":return e.types.map(t=>this.getSimpleTypeKey(t)).sort().join("|");case"generic":return`generic:${e.name}`;default:return"unknown"}}toPascalCase(e){return e?e.replace(/[-_\s]+/g," ").replace(/([a-z])([A-Z])/g,"$1 $2").trim().split(" ").filter(Boolean).map(r=>r.charAt(0).toUpperCase()+r.slice(1).toLowerCase()).join(""):""}toCamelCase(e){let t=this.toPascalCase(e);return t.charAt(0).toLowerCase()+t.slice(1)}formatName(e){return this.namingStyle==="camelCase"?this.toCamelCase(e):this.toPascalCase(e)}isCircular(e){return this.processing.has(e)}markProcessing(e){this.processing.add(e)}unmarkProcessing(e){this.processing.delete(e)}getAllNamedTypes(){return new Map(this.namedTypes)}reset(){this.namedTypes.clear(),this.nameCounter.clear(),this.processing=new WeakSet,this.circularRefs.clear()}},f=class{constructor(e){this.collected=[];this.seenStructs=new Set;this.namer=e}collect(e,t){this.collected=[],this.seenStructs.clear(),this.namer.reset();let r=this.getStructKey(e);this.namer.nameType(e,{fieldName:t,depth:0}),this.collectRecursive(e,{fieldName:t,parentName:void 0,depth:0});let i=this.collected.find(s=>s.name===t),o=this.collected.filter(s=>s.name!==t);return i?[i,...o]:this.collected}collectRecursive(e,t){let r=this.getStructKey(e);if(e.kind==="object"){let i=this.namer.nameType(e,t);if(i&&!this.seenStructs.has(r)){this.seenStructs.add(r),this.collected.push({name:i,type:u(e)});for(let o of e.properties)this.collectRecursive(o.type,{fieldName:o.name,parentName:i,depth:t.depth+1})}return}if(e.kind==="array"){this.collectRecursive(e.elementType,{fieldName:t.fieldName?t.fieldName+"Item":void 0,parentName:t.parentName,depth:t.depth+1});return}if(e.kind==="union"){for(let i of e.types)this.collectRecursive(i,t);return}if(e.kind==="generic"){for(let i of e.typeArgs)this.collectRecursive(i,{...t,depth:t.depth+1});return}}getStructKey(e){return e.kind==="object"?`object:${e.properties.map(t=>`${t.name}:${this.getPropTypeKey(t.type)}:${t.optional}`).sort().join("|")}`:e.kind}getPropTypeKey(e){switch(e.kind){case"primitive":return e.type;case"null":return"null";case"undefined":return"undefined";case"array":return`array:${this.getPropTypeKey(e.elementType)}`;case"object":return"object";case"union":return e.types.map(t=>this.getPropTypeKey(t)).sort().join("|");case"generic":return`generic:${e.name}`;default:return"unknown"}}};var y=class{constructor(e,t){this.allNamedTypes=[];this.options=e,this.namer=t}findTypeName(e){if(e.kind!=="object")return null;for(let t of this.allNamedTypes)if(S(t.type,e))return t.name;return null}formatTypeDef(e){let{name:t,type:r,comment:i}=e,o=this.options.addExport?"export ":"";return this.formatObjectType(t,r,o,i)}formatObjectType(e,t,r,i){let o=" ".repeat(this.options.indentSize),s=this.sortProperties(t.properties),a=[];i&&a.push(this.formatJSDoc(i)),this.options.outputStyle==="interface"?a.push(`${r}interface ${e} {`):a.push(`${r}type ${e} = {`);for(let c of s){let G=this.formatPropertyName(c.name),R=c.optional?"?":"",D=this.formatType(c.type),x=`${o}${G}${R}: ${D};`;c.comment&&(x+=` // ${c.comment}`),a.push(x)}return this.options.outputStyle==="interface"?a.push("}"):a.push("};"),a.join(`
3
+ `)}formatType(e){if(e.kind==="object"){let t=this.findTypeName(e);if(t)return t}switch(e.kind){case"primitive":return e.type;case"null":return"null";case"undefined":return"undefined";case"array":return this.formatArrayType(e);case"object":return this.formatInlineObject(e);case"union":return this.formatUnionType(e.types);case"literal":return this.formatLiteral(e.value);case"generic":return`${e.name}<${e.typeArgs.map(t=>this.formatType(t)).join(", ")}>`;default:return"unknown"}}formatLiteral(e){return typeof e=="string"?`'${e}'`:String(e)}formatArrayType(e){let t=this.formatType(e.elementType);return e.elementType.kind==="union"?`(${t})[]`:`${t}[]`}formatInlineObject(e){let t=" ".repeat(this.options.indentSize),r=this.sortProperties(e.properties);if(r.length===0)return"{}";let i=["{"];for(let o of r){let s=this.formatPropertyName(o.name),a=o.optional?"?":"",c=this.formatType(o.type);i.push(`${t}${s}${a}: ${c};`)}return i.push("}"),i.join(`
5
4
  `)}formatUnionType(e){return e.map(t=>this.formatType(t)).join(" | ")}formatPropertyName(e){return/^[a-zA-Z_$][a-zA-Z0-9_$]*$/.test(e)?e:`'${e}'`}sortProperties(e){return this.options.sortProperties==="definition"?[...e]:[...e].sort((t,r)=>t.name.localeCompare(r.name))}formatJSDoc(e){let t=e.split(`
6
5
  `);return t.length===1?`/** ${e} */`:["/**",...t.map(r=>` * ${r}`)," */"].join(`
7
- `)}toEnumKey(e){return e.replace(/[-_\s]+/g,"_").replace(/([a-z])([A-Z])/g,"$1_$2").toUpperCase().replace(/^_+|_+$/g,"")}formatAll(e){return this.allNamedTypes=e,e.map(t=>this.formatTypeDef(t)).join(`
6
+ `)}formatAll(e){return this.allNamedTypes=e,e.map(t=>this.formatTypeDef(t)).join(`
8
7
 
9
8
  `)}generateOutput(e,t){let r=`/**
10
9
  * Generated by ts-gen
@@ -12,4 +11,4 @@ var j={rootName:"Root",outputStyle:"interface",namingStyle:"PascalCase",sortProp
12
11
  */`,i=this.formatAll(e);return`${r}
13
12
 
14
13
  ${i}
15
- `}};function F(n){return{id:"\u552F\u4E00\u6807\u8BC6",name:"\u540D\u79F0",title:"\u6807\u9898",desc:"\u63CF\u8FF0",description:"\u63CF\u8FF0",avatar:"\u5934\u50CF",email:"\u90AE\u7BB1",phone:"\u624B\u673A\u53F7",status:"\u72B6\u6001",type:"\u7C7B\u578B",createdAt:"\u521B\u5EFA\u65F6\u95F4",updatedAt:"\u66F4\u65B0\u65F6\u95F4",deletedAt:"\u5220\u9664\u65F6\u95F4",list:"\u6570\u636E\u5217\u8868",total:"\u603B\u6570",page:"\u9875\u7801",pageSize:"\u6BCF\u9875\u6570\u91CF"}[n]}function C(n){return{...n,properties:n.properties.map(e=>({...e,comment:e.comment||F(e.name)}))}}var h=class{constructor(){this.patterns=[{name:"PageResult",arrayFields:["list","records","rows","items"],countFields:["total","count","totalCount"]},{name:"ListResult",arrayFields:["list","data","items"],countFields:[]},{name:"ApiResponse",arrayFields:["data"],countFields:[]}]}extract(e){if(e.kind!=="object")return e;for(let t of this.patterns){let r=this.tryMatchPattern(e,t);if(r)return r}return e}tryMatchPattern(e,t){let r=null,i=t.countFields.length===0;for(let s of e.properties)t.arrayFields.includes(s.name)&&s.type.kind==="array"&&(r={name:s.name,elementType:s.type.elementType}),t.countFields.includes(s.name)&&(i=!0);return r&&i?{kind:"generic",name:t.name,typeArgs:[r.elementType]}:null}},N=class{constructor(e=5){this.threshold=e}extract(e,t){if(t.kind==="object"&&e&&typeof e=="object"){let r=t.properties.map(i=>{let s=e[i.name];if(i.type.kind==="primitive"&&i.type.type==="string"){let o=this.tryExtractEnum([s],i.type,i.name);if(o)return{...i,type:o}}if(i.type.kind==="array"&&Array.isArray(s)){let o=i.type.elementType;if(o.kind==="primitive"&&o.type==="string"){let p=[...new Set(s.filter(c=>typeof c=="string"))];if(p.length>0&&p.length<=this.threshold&&this.isValidEnumValues(p)){let c={kind:"enum",name:`${R(i.name)}ItemEnum`,values:p};return{...i,type:{kind:"array",elementType:c}}}}let a=this.extract(s.length>0?s[0]:void 0,o);return{...i,type:{kind:"array",elementType:a}}}return{...i,type:this.extract(s,i.type)}});return{...t,properties:r}}if(t.kind==="array"&&Array.isArray(e)){let r=t.elementType,i=this.extract(e.length>0?e[0]:void 0,r);return{...t,elementType:i}}return t}tryExtractEnum(e,t,r){let i=e.filter(o=>typeof o=="string"),s=[...new Set(i)];return s.length===0||s.length>this.threshold||!this.isValidEnumValues(s)?null:{kind:"enum",name:`${R(r)}Enum`,values:s}}isValidEnumValues(e){return e.every(t=>/^[a-zA-Z0-9_-]+$/.test(t))}},S=class{constructor(e=!1){this.strict=e}process(e){if(this.strict)return e;if(e.kind==="union"){let t=e.types.filter(r=>r.kind!=="null");return t.length===0?{kind:"null"}:t.length===1?t[0]:{...e,types:t}}return e.kind==="array"?{...e,elementType:this.process(e.elementType)}:e.kind==="object"?{...e,properties:e.properties.map(t=>({...t,type:this.process(t.type)}))}:e}},k=class{constructor(e=!0){this.markOptional=e}process(e,t){if(!this.markOptional)return t;if(t.kind==="array"&&Array.isArray(e)){let r=t.elementType;if(r.kind==="object"){let i=this.processArrayObjects(e,r);return{...t,elementType:i}}}return t}processArrayObjects(e,t){if(e.length<=1)return t;let r={},i=e.length;for(let s of e)if(s&&typeof s=="object")for(let o of Object.keys(s))r[o]=(r[o]||0)+1;return{...t,properties:t.properties.map(s=>{let a=(r[s.name]||0)<i;return{...s,optional:a}})}}};function x(n,e,t){let r=e;return t.markOptional&&(r=new k(t.markOptional).process(n,r)),t.extractEnums&&(r=new N(t.enumThreshold||5).extract(n,r)),t.extractGenerics&&(r=new h().extract(r)),r=new S(t.strictNullChecks).process(r),r}function R(n){return n.charAt(0).toUpperCase()+n.slice(1)}function v(n,e={}){let t={...j,...e},r=m(n);r=x(n,r,t),t.addComments&&r.kind==="object"&&(r=C(r));let i=new y({namingStyle:t.namingStyle,prefix:t.typePrefix,suffix:t.typeSuffix,customNameMap:t.typeNameMap}),s=new f(i),o=t.rootName||"Root",a=s.collect(r,o);return{code:new d(t,i).generateOutput(a,o),types:a}}function _(n,e={}){let t=JSON.parse(n);return v(t,e)}function z(n,e={}){return v(n,e).code}var re={generate:v,generateFromString:_,generateType:z};export{d as CodeFormatter,N as EnumExtractor,h as GenericExtractor,S as NullHandler,k as OptionalHandler,f as TypeCollector,y as TypeNamer,x as applyEnhancements,A as createUnion,re as default,v as generate,_ as generateFromString,z as generateType,w as inferArrayType,E as inferObjectType,m as inferType,b as isStructurallyEqual,P as mergeObjects,g as mergeTypes};
14
+ `}};function w(n){return{id:"\u552F\u4E00\u6807\u8BC6",name:"\u540D\u79F0",title:"\u6807\u9898",desc:"\u63CF\u8FF0",description:"\u63CF\u8FF0",avatar:"\u5934\u50CF",email:"\u90AE\u7BB1",phone:"\u624B\u673A\u53F7",status:"\u72B6\u6001",type:"\u7C7B\u578B",createdAt:"\u521B\u5EFA\u65F6\u95F4",updatedAt:"\u66F4\u65B0\u65F6\u95F4",deletedAt:"\u5220\u9664\u65F6\u95F4",list:"\u6570\u636E\u5217\u8868",total:"\u603B\u6570",page:"\u9875\u7801",pageSize:"\u6BCF\u9875\u6570\u91CF"}[n]}function k(n){return{...n,properties:n.properties.map(e=>({...e,comment:e.comment||w(e.name)}))}}var g=class{constructor(){this.patterns=[{name:"PageResult",arrayFields:["list","records","rows","items"],countFields:["total","count","totalCount"]},{name:"ListResult",arrayFields:["list","data","items"],countFields:[]},{name:"ApiResponse",arrayFields:["data"],countFields:[]}]}extract(e){if(e.kind!=="object")return e;for(let t of this.patterns){let r=this.tryMatchPattern(e,t);if(r)return r}return e}tryMatchPattern(e,t){let r=null,i=t.countFields.length===0;for(let o of e.properties)t.arrayFields.includes(o.name)&&o.type.kind==="array"&&(r={name:o.name,elementType:o.type.elementType}),t.countFields.includes(o.name)&&(i=!0);return r&&i?{kind:"generic",name:t.name,typeArgs:[r.elementType]}:null}},h=class{constructor(e=!1){this.strict=e}process(e){if(this.strict)return e;if(e.kind==="union"){let t=e.types.filter(r=>r.kind!=="null");return t.length===0?{kind:"null"}:t.length===1?t[0]:{...e,types:t}}return e.kind==="array"?{...e,elementType:this.process(e.elementType)}:e.kind==="object"?{...e,properties:e.properties.map(t=>({...t,type:this.process(t.type)}))}:e}},N=class{constructor(e=!0){this.markOptional=e}process(e,t){if(!this.markOptional)return t;if(t.kind==="array"&&Array.isArray(e)){let r=t.elementType;if(r.kind==="object"){let i=this.processArrayObjects(e,r);return{...t,elementType:i}}}return t}processArrayObjects(e,t){if(e.length<=1)return t;let r={},i=e.length;for(let o of e)if(o&&typeof o=="object")for(let s of Object.keys(o))r[s]=(r[s]||0)+1;return{...t,properties:t.properties.map(o=>{let a=(r[o.name]||0)<i;return{...o,optional:a}})}}};function b(n,e,t){let r=e;return t.markOptional&&(r=new N(t.markOptional).process(n,r)),t.extractGenerics&&(r=new g().extract(r)),r=new h(t.strictNullChecks).process(r),r}function j(n,e={}){let t={...O,...e},r=l(n);r=b(n,r,t),t.addComments&&r.kind==="object"&&(r=k(r));let i=new m({namingStyle:t.namingStyle,prefix:t.typePrefix,suffix:t.typeSuffix,customNameMap:t.typeNameMap}),s=new f(i).collect(r,t.rootName);return{code:new y(t,i).generateOutput(s,t.rootName),types:s}}function K(n,e={}){let t=JSON.parse(n);return j(t,e)}function E(n,e={}){return j(n,e).code}var ee={generate:j,generateFromString:K,generateType:E};export{y as CodeFormatter,g as GenericExtractor,h as NullHandler,N as OptionalHandler,f as TypeCollector,m as TypeNamer,k as addGuessedComments,b as applyEnhancements,$ as createUnion,ee as default,j as generate,K as generateFromString,E as generateType,w as guessCommentFromFieldName,A as inferArrayType,C as inferObjectType,l as inferType,S as isStructurallyEqual,P as mergeObjects,T as mergeTypes};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "type-flash",
3
- "version": "1.0.5",
3
+ "version": "1.0.6",
4
4
  "description": "JSON 智能生成 TypeScript 类型定义 - 一键从 JSON 数据生成 Interface / Type 定义",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.mjs",