type-flash 1.2.8 → 1.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -8,7 +8,7 @@
8
8
  [![license](https://img.shields.io/badge/license-MIT-blue.svg?style=flat-square)](LICENSE)
9
9
 
10
10
 
11
- > 自动生成 TypeScript 类型定义,支持对象 / JSON / 接口返回,内置 CLI 命令行工具,一行代码搞定,彻底告别手写类型的繁琐。
11
+ > 自动生成 TypeScript 类型定义,支持解析对象 / JSON / 接口返回,内置 CLI 命令行工具,一行代码搞定,彻底告别手写类型的繁琐。
12
12
 
13
13
  [功能特性](#功能特性) • [快速开始](#快速开始) • [使用方式](#使用方式) • [配置选项](#配置选项) • [优势对比](#优势对比) • [常见问题](#常见问题)
14
14
 
@@ -188,13 +188,13 @@ export interface ApiResponseDataListItem {
188
188
  // user.json
189
189
  {
190
190
  "id": 1,
191
- "name": 'Alice',
192
- "email": 'alice@example.com',
191
+ "name": "Alice",
192
+ "email": "alice@example.com",
193
193
  "profile": {
194
- "avatar": 'https://example.com/avatar.jpg',
195
- "bio": 'Hello World',
194
+ "avatar": "https://example.com/avatar.jpg",
195
+ "bio": "Hello World",
196
196
  },
197
- "tags": ['admin', 'user', 88],
197
+ "tags": ["admin", "user", 88],
198
198
  };
199
199
  ```
200
200
 
package/bin/type-flash.js CHANGED
@@ -136,28 +136,27 @@ function showVersion() {
136
136
  }
137
137
  }
138
138
 
139
- // 读取标准输入
139
+ // 读取标准输入(仅在管道模式下等待数据,TTY 下立即返回空)
140
140
  function readStdin() {
141
141
  return new Promise((resolve, reject) => {
142
+ if (process.stdin.isTTY) {
143
+ resolve('');
144
+ return;
145
+ }
146
+
142
147
  let data = '';
143
148
  process.stdin.setEncoding('utf-8');
144
-
149
+ process.stdin.resume();
150
+
145
151
  process.stdin.on('data', chunk => {
146
152
  data += chunk;
147
153
  });
148
-
154
+
149
155
  process.stdin.on('end', () => {
150
156
  resolve(data);
151
157
  });
152
-
158
+
153
159
  process.stdin.on('error', reject);
154
-
155
- // 如果没有输入,超时返回空
156
- setTimeout(() => {
157
- if (!data) {
158
- resolve('');
159
- }
160
- }, 100);
161
160
  });
162
161
  }
163
162
 
package/dist/index.d.mts CHANGED
@@ -6,7 +6,7 @@
6
6
  */
7
7
  interface PrimitiveType {
8
8
  kind: 'primitive';
9
- type: 'string' | 'number' | 'boolean' | 'any' | 'unknown' | 'never' | 'function';
9
+ type: 'string' | 'number' | 'boolean' | 'any' | 'unknown' | 'never' | 'Function';
10
10
  }
11
11
  /**
12
12
  * 数组类型
@@ -199,7 +199,7 @@ declare class TypeNamer {
199
199
  */
200
200
  private getTypeKey;
201
201
  /**
202
- * 获取简单类型 key(用于属性比较)
202
+ * 获取简单类型 key(用于属性比较,与 typeToKey 保持一致)
203
203
  */
204
204
  private getSimpleTypeKey;
205
205
  /**
@@ -259,10 +259,6 @@ declare class TypeCollector {
259
259
  * 获取结构 key(用于去重)
260
260
  */
261
261
  private getStructKey;
262
- /**
263
- * 获取属性类型的简化 key
264
- */
265
- private getPropTypeKey;
266
262
  }
267
263
 
268
264
  /**
@@ -283,6 +279,10 @@ declare class CodeFormatter {
283
279
  /** 所有已命名的类型列表(用于查找引用) */
284
280
  private allNamedTypes;
285
281
  constructor(options: Required<GenerateOptions>, namer: TypeNamer);
282
+ /** 当前行尾换行符 */
283
+ private get eol();
284
+ /** 将多行文本按配置的行尾符连接 */
285
+ private joinLines;
286
286
  /**
287
287
  * 查找类型对应的命名(用于对象类型引用)
288
288
  */
@@ -363,19 +363,19 @@ declare function mergeTypes(a: TSTypeNode, b: TSTypeNode): TSTypeNode;
363
363
  declare function mergeObjects(a: ObjectType, b: ObjectType): ObjectType;
364
364
  /**
365
365
  * 推断单个值的类型
366
- * seen 循环缓存参数,默认新建 WeakSet
366
+ * seen / objectCache 用于循环引用检测与自引用类型占位
367
367
  */
368
- declare function inferType(value: unknown, seen?: WeakSet<object>): TSTypeNode;
368
+ declare function inferType(value: unknown, seen?: WeakSet<object>, objectCache?: WeakMap<object, ObjectType>): TSTypeNode;
369
369
  /**
370
370
  * 推断数组类型
371
371
  * - 统一提取元素类型
372
372
  * - 元素类型不一致时生成联合类型
373
373
  */
374
- declare function inferArrayType(arr: unknown[], seen: WeakSet<object>): ArrayType;
374
+ declare function inferArrayType(arr: unknown[], seen: WeakSet<object>, objectCache?: WeakMap<object, ObjectType>): ArrayType;
375
375
  /**
376
376
  * 推断对象类型
377
377
  */
378
- declare function inferObjectType(obj: Record<string, unknown>, seen: WeakSet<object>): ObjectType;
378
+ declare function inferObjectType(obj: Record<string, unknown>, seen?: WeakSet<object>, objectCache?: WeakMap<object, ObjectType>): ObjectType;
379
379
  /**
380
380
  * 判断两个类型是否结构等价
381
381
  * 用于类型去重与复用
package/dist/index.d.ts CHANGED
@@ -6,7 +6,7 @@
6
6
  */
7
7
  interface PrimitiveType {
8
8
  kind: 'primitive';
9
- type: 'string' | 'number' | 'boolean' | 'any' | 'unknown' | 'never' | 'function';
9
+ type: 'string' | 'number' | 'boolean' | 'any' | 'unknown' | 'never' | 'Function';
10
10
  }
11
11
  /**
12
12
  * 数组类型
@@ -199,7 +199,7 @@ declare class TypeNamer {
199
199
  */
200
200
  private getTypeKey;
201
201
  /**
202
- * 获取简单类型 key(用于属性比较)
202
+ * 获取简单类型 key(用于属性比较,与 typeToKey 保持一致)
203
203
  */
204
204
  private getSimpleTypeKey;
205
205
  /**
@@ -259,10 +259,6 @@ declare class TypeCollector {
259
259
  * 获取结构 key(用于去重)
260
260
  */
261
261
  private getStructKey;
262
- /**
263
- * 获取属性类型的简化 key
264
- */
265
- private getPropTypeKey;
266
262
  }
267
263
 
268
264
  /**
@@ -283,6 +279,10 @@ declare class CodeFormatter {
283
279
  /** 所有已命名的类型列表(用于查找引用) */
284
280
  private allNamedTypes;
285
281
  constructor(options: Required<GenerateOptions>, namer: TypeNamer);
282
+ /** 当前行尾换行符 */
283
+ private get eol();
284
+ /** 将多行文本按配置的行尾符连接 */
285
+ private joinLines;
286
286
  /**
287
287
  * 查找类型对应的命名(用于对象类型引用)
288
288
  */
@@ -363,19 +363,19 @@ declare function mergeTypes(a: TSTypeNode, b: TSTypeNode): TSTypeNode;
363
363
  declare function mergeObjects(a: ObjectType, b: ObjectType): ObjectType;
364
364
  /**
365
365
  * 推断单个值的类型
366
- * seen 循环缓存参数,默认新建 WeakSet
366
+ * seen / objectCache 用于循环引用检测与自引用类型占位
367
367
  */
368
- declare function inferType(value: unknown, seen?: WeakSet<object>): TSTypeNode;
368
+ declare function inferType(value: unknown, seen?: WeakSet<object>, objectCache?: WeakMap<object, ObjectType>): TSTypeNode;
369
369
  /**
370
370
  * 推断数组类型
371
371
  * - 统一提取元素类型
372
372
  * - 元素类型不一致时生成联合类型
373
373
  */
374
- declare function inferArrayType(arr: unknown[], seen: WeakSet<object>): ArrayType;
374
+ declare function inferArrayType(arr: unknown[], seen: WeakSet<object>, objectCache?: WeakMap<object, ObjectType>): ArrayType;
375
375
  /**
376
376
  * 推断对象类型
377
377
  */
378
- declare function inferObjectType(obj: Record<string, unknown>, seen: WeakSet<object>): ObjectType;
378
+ declare function inferObjectType(obj: Record<string, unknown>, seen?: WeakSet<object>, objectCache?: WeakMap<object, ObjectType>): ObjectType;
379
379
  /**
380
380
  * 判断两个类型是否结构等价
381
381
  * 用于类型去重与复用
package/dist/index.js CHANGED
@@ -1,12 +1,2 @@
1
- "use strict";var k=Object.defineProperty;var R=Object.getOwnPropertyDescriptor;var D=Object.getOwnPropertyNames;var U=Object.prototype.hasOwnProperty;var M=(n,e)=>{for(var t in e)k(n,t,{get:e[t],enumerable:!0})},G=(n,e,t,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let i of D(e))!U.call(n,i)&&i!==t&&k(n,i,{get:()=>e[i],enumerable:!(r=R(e,i))||r.enumerable});return n};var K=n=>G(k({},"__esModule",{value:!0}),n);var z={};M(z,{CodeFormatter:()=>y,NullHandler:()=>T,OptionalHandler:()=>g,TypeCollector:()=>f,TypeNamer:()=>c,applyEnhancements:()=>N,createUnion:()=>b,default:()=>q,generate:()=>O,generateFromString:()=>A,inferArrayType:()=>v,inferObjectType:()=>x,inferType:()=>l,isStructurallyEqual:()=>h,mergeObjects:()=>j,mergeTypes:()=>d});module.exports=K(z);var $={rootName:"Root",outputStyle:"interface",namingStyle:"PascalCase",sortProperties:"alpha",addExport:!0,strictNullChecks:!1,markOptional:!0,indentSize:2,lineEnding:`
2
- `,typeNameMap:{},typePrefix:"",typeSuffix:""};function m(n){return{kind:"primitive",type:n}}function E(){return{kind:"null"}}function L(){return{kind:"undefined"}}function _(n){return{kind:"array",elementType:n}}function P(n=[]){return{kind:"object",properties:n}}function b(n){let e=[],t=new Set;for(let r of n)if(r.kind==="union")for(let i of r.types){let o=a(i);t.has(o)||(t.add(o),e.push(i))}else{let i=a(r);t.has(i)||(t.add(i),e.push(r))}return e.length===1?e[0]:{kind:"union",types:e}}function a(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:${a(n.elementType)}`;case"object":return`object:${n.properties.map(e=>`${e.name}:${a(e.type)}:${e.optional}`).join(",")}`;case"union":return`union:${n.types.map(a).sort().join("|")}`;case"generic":return`generic:${n.name}:${n.typeArgs.map(a).join(",")}`;default:return"unknown"}}function d(n,e){return a(n)===a(e)?n:n.kind==="object"&&e.kind==="object"?j(n,e):n.kind==="array"&&e.kind==="array"?_(d(n.elementType,e.elementType)):b([n,e])}function j(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):t.set(r.name,{...r,optional:!0})}for(let[r,i]of t)e.properties.some(s=>s.name===r)||(i.optional=!0);return P(Array.from(t.values()))}function l(n,e=new WeakSet){if(n===null)return E();if(n===void 0)return L();if(typeof n=="function")return m("function");if(typeof n=="string")return m("string");if(typeof n=="number")return m("number");if(typeof n=="boolean")return m("boolean");if(Array.isArray(n))return v(n,e);if(typeof n=="object"&&n!==null){let t=n;if(e.has(t))return{kind:"object",properties:[]};e.add(t);let r=x(t,e);return e.delete(t),r}return m("unknown")}function v(n,e){if(n.length===0)return{kind:"array",elementType:{kind:"primitive",type:"any"}};let t=n.map(i=>l(i,e)),r=t[0];for(let i=1;i<t.length;i++)r=d(r,t[i]);return{kind:"array",elementType:r}}function x(n,e){let t=[];for(let[r,i]of Object.entries(n)){let o=l(i,e);t.push({name:r,type:o,optional:!1})}return P(t)}function h(n,e){return a(n)===a(e)}function u(n,e=new WeakMap){if(e.has(n))return e.get(n);let t;switch(n.kind){case"primitive":return t={kind:"primitive",type:n.type},e.set(n,t),t;case"null":return t={kind:"null"},e.set(n,t),t;case"undefined":return t={kind:"undefined"},e.set(n,t),t;case"literal":return t={kind:"literal",value:n.value},e.set(n,t),t;case"array":return t={kind:"array",elementType:{}},e.set(n,t),t.elementType=u(n.elementType,e),t;case"object":return t={kind:"object",properties:[],isRecord:n.isRecord,valueType:n.valueType},e.set(n,t),t.properties=n.properties.map(r=>({name:r.name,optional:r.optional,type:u(r.type,e)})),n.valueType&&(t.valueType=u(n.valueType,e)),t;case"union":return t={kind:"union",types:[]},e.set(n,t),t.types=n.types.map(r=>u(r,e)),t;case"generic":return t={kind:"generic",name:n.name,typeArgs:[]},e.set(n,t),t.typeArgs=n.typeArgs.map(r=>u(r,e)),t;default:return t={kind:"primitive",type:"unknown"},e.set(n,t),t}}var c=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.formatName(o),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){return e.path||""}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(),this.collectRecursive(e,{fieldName:t,parentName:void 0,path:t,depth:0});let r=this.collected.find(o=>o.name===t),i=this.collected.filter(o=>o.name!==t);return r?[r,...i]: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,path:t.path?`${t.path}.${o.name}`:o.name,depth:t.depth+1})}return}if(e.kind==="array"){this.collectRecursive(e.elementType,{fieldName:t.fieldName?t.fieldName+"Item":void 0,parentName:t.parentName,path:t.path,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(h(t.type,e))return t.name;return null}formatTypeDef(e){let{name:t,type:r}=e,i=this.options.addExport?"export ":"";return this.formatObjectType(t,r,i)}formatObjectType(e,t,r){let i=" ".repeat(this.options.indentSize),o=this.sortProperties(t.properties),s=[];this.options.outputStyle==="interface"?s.push(`${r}interface ${e} {`):s.push(`${r}type ${e} = {`);for(let p of o){let S=this.formatPropertyName(p.name),w=p.optional?"?":"",C=this.formatType(p.type);s.push(`${i}${S}${w}: ${C};`)}return this.options.outputStyle==="interface"?s.push("}"):s.push("};"),s.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),p=o.optional?"?":"",S=this.formatType(o.type);i.push(`${t}${s}${p}: ${S};`)}return i.push("}"),i.join(`
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))}formatAll(e){return this.allNamedTypes=e,e.map(t=>this.formatTypeDef(t)).join(`
5
-
6
- `)}generateOutput(e,t){let r=`/**
7
- * Generated by type-flash
8
- * Root type: ${t}
9
- */`,i=this.formatAll(e);return`${r}
10
-
11
- ${i}
12
- `}};var T=class{constructor(e=!1){this.seen=new WeakSet;this.strict=e}process(e){return this.processRecursive(e)}processRecursive(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.map(r=>this.processRecursive(r))}}if(e.kind==="array")return{...e,elementType:this.processRecursive(e.elementType)};if(e.kind==="object"){if(this.seen.has(e))return e;this.seen.add(e);let t={...e,properties:e.properties.map(r=>({...r,type:this.processRecursive(r.type)}))};return this.seen.delete(e),t}return e}},g=class{constructor(e=!0){this.seen=new WeakSet;this.markOptional=e}process(e,t){return this.markOptional?this.processRecursive(e,t):t}processRecursive(e,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,elementType:this.processRecursive(e,r)}}if(t.kind==="object"&&e&&typeof e=="object"){if(this.seen.has(t))return t;this.seen.add(t);let r=t.properties.map(i=>({...i,type:this.processRecursive(e[i.name],i.type)}));return this.seen.delete(t),{...t,properties:r}}return t.kind==="union"&&Array.isArray(e)?{...t,types:t.types.map(r=>this.processRecursive(e,r))}: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 p=(r[o.name]||0)<i;return{...o,optional:p}})}}};function N(n,e,t){let r=e;return t.markOptional&&(r=new g(t.markOptional).process(n,r)),r=new T(t.strictNullChecks).process(r),r}function O(n,e={}){let t={...$,...e},r=l(n);r=N(n,r,t);let i=new c({namingStyle:t.namingStyle,prefix:t.typePrefix,suffix:t.typeSuffix,customNameMap:t.typeNameMap}),s=new f(i).collect(r,t.rootName);return new y(t,i).generateOutput(s,t.rootName)}function A(n,e={}){let t=JSON.parse(n);return O(t,e)}var q={generate:O,generateFromString:A};0&&(module.exports={CodeFormatter,NullHandler,OptionalHandler,TypeCollector,TypeNamer,applyEnhancements,createUnion,generate,generateFromString,inferArrayType,inferObjectType,inferType,isStructurallyEqual,mergeObjects,mergeTypes});
1
+ "use strict";var S=Object.defineProperty;var C=Object.getOwnPropertyDescriptor;var D=Object.getOwnPropertyNames;var M=Object.prototype.hasOwnProperty;var U=(n,e)=>{for(var t in e)S(n,t,{get:e[t],enumerable:!0})},E=(n,e,t,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let i of D(e))!M.call(n,i)&&i!==t&&S(n,i,{get:()=>e[i],enumerable:!(r=C(e,i))||r.enumerable});return n};var G=n=>E(S({},"__esModule",{value:!0}),n);var z={};U(z,{CodeFormatter:()=>m,NullHandler:()=>g,OptionalHandler:()=>h,TypeCollector:()=>y,TypeNamer:()=>f,applyEnhancements:()=>k,createUnion:()=>b,default:()=>q,generate:()=>v,generateFromString:()=>A,inferArrayType:()=>O,inferObjectType:()=>$,inferType:()=>c,isStructurallyEqual:()=>N,mergeObjects:()=>j,mergeTypes:()=>T});module.exports=G(z);var x={rootName:"Root",outputStyle:"interface",namingStyle:"PascalCase",sortProperties:"alpha",addExport:!0,strictNullChecks:!1,markOptional:!0,indentSize:2,lineEnding:`
2
+ `,typeNameMap:{},typePrefix:"",typeSuffix:""};function u(n){return{kind:"primitive",type:n}}function L(){return{kind:"null"}}function W(){return{kind:"undefined"}}function K(n){return{kind:"array",elementType:n}}function w(n=[]){return{kind:"object",properties:n}}function b(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,e=new Set){if(e.has(n))return"circular";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,e)}`;case"object":{e.add(n);let t=`object:${n.properties.map(r=>`${r.name}:${p(r.type,e)}:${r.optional}`).sort().join(",")}`;return e.delete(n),t}case"union":return`union:${n.types.map(t=>p(t,e)).sort().join("|")}`;case"generic":return`generic:${n.name}:${n.typeArgs.map(t=>p(t,e)).join(",")}`;default:return"unknown"}}function T(n,e){return p(n)===p(e)?n:n.kind==="object"&&e.kind==="object"?j(n,e):n.kind==="array"&&e.kind==="array"?K(T(n.elementType,e.elementType)):b([n,e])}function j(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):t.set(r.name,{...r,optional:!0})}for(let[r,i]of t)e.properties.some(s=>s.name===r)||(i.optional=!0);return w(Array.from(t.values()))}function _(n){if(n instanceof Date||n instanceof RegExp||typeof Buffer!="undefined"&&Buffer.isBuffer(n))return u("string");let e=Object.prototype.toString.call(n);return e==="[object Date]"||e==="[object RegExp]"?u("string"):e==="[object Map]"||e==="[object Set]"||e==="[object WeakMap]"||e==="[object WeakSet]"?u("unknown"):null}function c(n,e=new WeakSet,t=new WeakMap){if(n===null)return L();if(n===void 0)return W();if(typeof n=="function")return u("Function");if(typeof n=="string")return u("string");if(typeof n=="number")return u("number");if(typeof n=="boolean")return u("boolean");if(Array.isArray(n))return O(n,e,t);if(typeof n=="object"&&n!==null){let r=_(n);if(r)return r;let i=n;if(e.has(i)){let a=t.get(i);if(a)return a}e.add(i);let o=w([]);t.set(i,o);let s=[];for(let[a,d]of Object.entries(i))s.push({name:a,type:c(d,e,t),optional:!1});return o.properties=s,e.delete(i),o}return u("unknown")}function O(n,e,t=new WeakMap){if(n.length===0)return{kind:"array",elementType:{kind:"primitive",type:"unknown"}};let r=n.map(o=>c(o,e,t)),i=r[0];for(let o=1;o<r.length;o++)i=T(i,r[o]);return{kind:"array",elementType:i}}function $(n,e=new WeakSet,t=new WeakMap){return c(n,e,t)}function N(n,e){return n===e?!0:p(n)===p(e)}function l(n,e=new WeakMap){if(e.has(n))return e.get(n);let t;switch(n.kind){case"primitive":return t={kind:"primitive",type:n.type},e.set(n,t),t;case"null":return t={kind:"null"},e.set(n,t),t;case"undefined":return t={kind:"undefined"},e.set(n,t),t;case"literal":return t={kind:"literal",value:n.value},e.set(n,t),t;case"array":return t={kind:"array",elementType:{}},e.set(n,t),t.elementType=l(n.elementType,e),t;case"object":return t={kind:"object",properties:[],isRecord:n.isRecord,valueType:n.valueType},e.set(n,t),t.properties=n.properties.map(r=>({name:r.name,optional:r.optional,type:l(r.type,e)})),n.valueType&&(t.valueType=l(n.valueType,e)),t;case"union":return t={kind:"union",types:[]},e.set(n,t),t.types=n.types.map(r=>l(r,e)),t;case"generic":return t={kind:"generic",name:n.name,typeArgs:[]},e.set(n,t),t.typeArgs=n.typeArgs.map(r=>l(r,e)),t;default:return t={kind:"primitive",type:"unknown"},e.set(n,t),t}}var f=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.formatName(o),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){return e.path||""}getTypeKey(e){return p(e)}getSimpleTypeKey(e){return p(e)}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()}},y=class{constructor(e){this.collected=[];this.seenStructs=new Set;this.namer=e}collect(e,t){this.collected=[],this.seenStructs.clear(),this.namer.reset(),this.collectRecursive(e,{fieldName:t,parentName:void 0,path:t,depth:0});let r=this.collected.find(o=>o.name===t),i=this.collected.filter(o=>o.name!==t);return r?[r,...i]: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 o of e.properties)this.collectRecursive(o.type,{fieldName:o.name,parentName:i,path:t.path?`${t.path}.${o.name}`:o.name,depth:t.depth+1})}return}if(e.kind==="array"){this.collectRecursive(e.elementType,{fieldName:t.fieldName?t.fieldName+"Item":void 0,parentName:t.parentName,path:t.path,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 p(e)}};var m=class{constructor(e,t){this.allNamedTypes=[];this.options=e,this.namer=t}get eol(){return this.options.lineEnding}joinLines(e){return e.join(this.eol)}findTypeName(e){if(e.kind!=="object")return null;for(let t of this.allNamedTypes)if(t.type===e||N(t.type,e))return t.name;return null}formatTypeDef(e){let{name:t,type:r}=e,i=this.options.addExport?"export ":"";return this.formatObjectType(t,r,i)}formatObjectType(e,t,r){let i=" ".repeat(this.options.indentSize),o=this.sortProperties(t.properties),s=[];this.options.outputStyle==="interface"?s.push(`${r}interface ${e} {`):s.push(`${r}type ${e} = {`);for(let a of o){let d=this.formatPropertyName(a.name),P=a.optional?"?":"",R=this.formatType(a.type);s.push(`${i}${d}${P}: ${R};`)}return this.options.outputStyle==="interface"?s.push("}"):s.push("};"),this.joinLines(s)}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?"?":"",d=this.formatType(o.type);i.push(`${t}${s}${a}: ${d};`)}return i.push("}"),this.joinLines(i)}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))}formatAll(e){return this.allNamedTypes=e,e.map(t=>this.formatTypeDef(t)).join(`${this.eol}${this.eol}`)}generateOutput(e,t){let r=this.joinLines(["/**"," * Generated by type-flash",` * Root type: ${t}`," */"]),i=this.formatAll(e);return`${r}${this.eol}${this.eol}${i}${this.eol}`}};var g=class{constructor(e=!1){this.seen=new WeakSet;this.strict=e}process(e){return this.processRecursive(e)}processRecursive(e){if(this.strict)return e;if(e.kind==="null")return{kind:"primitive",type:"unknown"};if(e.kind==="union"){let t=e.types.filter(r=>r.kind!=="null");return t.length===0?{kind:"primitive",type:"unknown"}:t.length===1?this.processRecursive(t[0]):{...e,types:t.map(r=>this.processRecursive(r))}}if(e.kind==="array")return{...e,elementType:this.processRecursive(e.elementType)};if(e.kind==="object"){if(this.seen.has(e))return e;this.seen.add(e);let t={...e,properties:e.properties.map(r=>r.type===e?{...r}:{...r,type:this.processRecursive(r.type)})};for(let r of t.properties)r.type===e&&(r.type=t);return this.seen.delete(e),t}return e}},h=class{constructor(e=!0){this.seen=new WeakSet;this.markOptional=e}process(e,t){return this.markOptional?this.processRecursive(e,t):t}processRecursive(e,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,elementType:this.processRecursive(e,r)}}if(t.kind==="object"&&e&&typeof e=="object"){if(this.seen.has(t))return t;this.seen.add(t);let r={...t,properties:t.properties.map(i=>i.type===t?{...i}:{...i,type:this.processRecursive(e[i.name],i.type)})};for(let i of r.properties)i.type===t&&(i.type=r);return this.seen.delete(t),r}return t.kind==="union"&&Array.isArray(e)?{...t,types:t.types.map(r=>this.processRecursive(e,r))}: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 k(n,e,t){let r=e;return t.markOptional&&(r=new h(t.markOptional).process(n,r)),r=new g(t.strictNullChecks).process(r),r}function v(n,e={}){let t={...x,...e},r=c(n);r=k(n,r,t);let i=new f({namingStyle:t.namingStyle,prefix:t.typePrefix,suffix:t.typeSuffix,customNameMap:t.typeNameMap}),s=new y(i).collect(r,t.rootName);return new m(t,i).generateOutput(s,t.rootName)}function A(n,e={}){let t=JSON.parse(n);return v(t,e)}var q={generate:v,generateFromString:A};0&&(module.exports={CodeFormatter,NullHandler,OptionalHandler,TypeCollector,TypeNamer,applyEnhancements,createUnion,generate,generateFromString,inferArrayType,inferObjectType,inferType,isStructurallyEqual,mergeObjects,mergeTypes});
package/dist/index.mjs CHANGED
@@ -1,12 +1,2 @@
1
- var k={rootName:"Root",outputStyle:"interface",namingStyle:"PascalCase",sortProperties:"alpha",addExport:!0,strictNullChecks:!1,markOptional:!0,indentSize:2,lineEnding:`
2
- `,typeNameMap:{},typePrefix:"",typeSuffix:""};function l(n){return{kind:"primitive",type:n}}function w(){return{kind:"null"}}function C(){return{kind:"undefined"}}function R(n){return{kind:"array",elementType:n}}function b(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 o=a(i);t.has(o)||(t.add(o),e.push(i))}else{let i=a(r);t.has(i)||(t.add(i),e.push(r))}return e.length===1?e[0]:{kind:"union",types:e}}function a(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:${a(n.elementType)}`;case"object":return`object:${n.properties.map(e=>`${e.name}:${a(e.type)}:${e.optional}`).join(",")}`;case"union":return`union:${n.types.map(a).sort().join("|")}`;case"generic":return`generic:${n.name}:${n.typeArgs.map(a).join(",")}`;default:return"unknown"}}function d(n,e){return a(n)===a(e)?n:n.kind==="object"&&e.kind==="object"?v(n,e):n.kind==="array"&&e.kind==="array"?R(d(n.elementType,e.elementType)):j([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):t.set(r.name,{...r,optional:!0})}for(let[r,i]of t)e.properties.some(s=>s.name===r)||(i.optional=!0);return b(Array.from(t.values()))}function c(n,e=new WeakSet){if(n===null)return w();if(n===void 0)return C();if(typeof n=="function")return l("function");if(typeof n=="string")return l("string");if(typeof n=="number")return l("number");if(typeof n=="boolean")return l("boolean");if(Array.isArray(n))return x(n,e);if(typeof n=="object"&&n!==null){let t=n;if(e.has(t))return{kind:"object",properties:[]};e.add(t);let r=O(t,e);return e.delete(t),r}return l("unknown")}function x(n,e){if(n.length===0)return{kind:"array",elementType:{kind:"primitive",type:"any"}};let t=n.map(i=>c(i,e)),r=t[0];for(let i=1;i<t.length;i++)r=d(r,t[i]);return{kind:"array",elementType:r}}function O(n,e){let t=[];for(let[r,i]of Object.entries(n)){let o=c(i,e);t.push({name:r,type:o,optional:!1})}return b(t)}function N(n,e){return a(n)===a(e)}function u(n,e=new WeakMap){if(e.has(n))return e.get(n);let t;switch(n.kind){case"primitive":return t={kind:"primitive",type:n.type},e.set(n,t),t;case"null":return t={kind:"null"},e.set(n,t),t;case"undefined":return t={kind:"undefined"},e.set(n,t),t;case"literal":return t={kind:"literal",value:n.value},e.set(n,t),t;case"array":return t={kind:"array",elementType:{}},e.set(n,t),t.elementType=u(n.elementType,e),t;case"object":return t={kind:"object",properties:[],isRecord:n.isRecord,valueType:n.valueType},e.set(n,t),t.properties=n.properties.map(r=>({name:r.name,optional:r.optional,type:u(r.type,e)})),n.valueType&&(t.valueType=u(n.valueType,e)),t;case"union":return t={kind:"union",types:[]},e.set(n,t),t.types=n.types.map(r=>u(r,e)),t;case"generic":return t={kind:"generic",name:n.name,typeArgs:[]},e.set(n,t),t.typeArgs=n.typeArgs.map(r=>u(r,e)),t;default:return t={kind:"primitive",type:"unknown"},e.set(n,t),t}}var f=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.formatName(o),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){return e.path||""}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()}},y=class{constructor(e){this.collected=[];this.seenStructs=new Set;this.namer=e}collect(e,t){this.collected=[],this.seenStructs.clear(),this.namer.reset(),this.collectRecursive(e,{fieldName:t,parentName:void 0,path:t,depth:0});let r=this.collected.find(o=>o.name===t),i=this.collected.filter(o=>o.name!==t);return r?[r,...i]: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,path:t.path?`${t.path}.${o.name}`:o.name,depth:t.depth+1})}return}if(e.kind==="array"){this.collectRecursive(e.elementType,{fieldName:t.fieldName?t.fieldName+"Item":void 0,parentName:t.parentName,path:t.path,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 m=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(N(t.type,e))return t.name;return null}formatTypeDef(e){let{name:t,type:r}=e,i=this.options.addExport?"export ":"";return this.formatObjectType(t,r,i)}formatObjectType(e,t,r){let i=" ".repeat(this.options.indentSize),o=this.sortProperties(t.properties),s=[];this.options.outputStyle==="interface"?s.push(`${r}interface ${e} {`):s.push(`${r}type ${e} = {`);for(let p of o){let h=this.formatPropertyName(p.name),P=p.optional?"?":"",A=this.formatType(p.type);s.push(`${i}${h}${P}: ${A};`)}return this.options.outputStyle==="interface"?s.push("}"):s.push("};"),s.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),p=o.optional?"?":"",h=this.formatType(o.type);i.push(`${t}${s}${p}: ${h};`)}return i.push("}"),i.join(`
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))}formatAll(e){return this.allNamedTypes=e,e.map(t=>this.formatTypeDef(t)).join(`
5
-
6
- `)}generateOutput(e,t){let r=`/**
7
- * Generated by type-flash
8
- * Root type: ${t}
9
- */`,i=this.formatAll(e);return`${r}
10
-
11
- ${i}
12
- `}};var T=class{constructor(e=!1){this.seen=new WeakSet;this.strict=e}process(e){return this.processRecursive(e)}processRecursive(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.map(r=>this.processRecursive(r))}}if(e.kind==="array")return{...e,elementType:this.processRecursive(e.elementType)};if(e.kind==="object"){if(this.seen.has(e))return e;this.seen.add(e);let t={...e,properties:e.properties.map(r=>({...r,type:this.processRecursive(r.type)}))};return this.seen.delete(e),t}return e}},g=class{constructor(e=!0){this.seen=new WeakSet;this.markOptional=e}process(e,t){return this.markOptional?this.processRecursive(e,t):t}processRecursive(e,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,elementType:this.processRecursive(e,r)}}if(t.kind==="object"&&e&&typeof e=="object"){if(this.seen.has(t))return t;this.seen.add(t);let r=t.properties.map(i=>({...i,type:this.processRecursive(e[i.name],i.type)}));return this.seen.delete(t),{...t,properties:r}}return t.kind==="union"&&Array.isArray(e)?{...t,types:t.types.map(r=>this.processRecursive(e,r))}: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 p=(r[o.name]||0)<i;return{...o,optional:p}})}}};function S(n,e,t){let r=e;return t.markOptional&&(r=new g(t.markOptional).process(n,r)),r=new T(t.strictNullChecks).process(r),r}function $(n,e={}){let t={...k,...e},r=c(n);r=S(n,r,t);let i=new f({namingStyle:t.namingStyle,prefix:t.typePrefix,suffix:t.typeSuffix,customNameMap:t.typeNameMap}),s=new y(i).collect(r,t.rootName);return new m(t,i).generateOutput(s,t.rootName)}function D(n,e={}){let t=JSON.parse(n);return $(t,e)}var V={generate:$,generateFromString:D};export{m as CodeFormatter,T as NullHandler,g as OptionalHandler,y as TypeCollector,f as TypeNamer,S as applyEnhancements,j as createUnion,V as default,$ as generate,D as generateFromString,x as inferArrayType,O as inferObjectType,c as inferType,N as isStructurallyEqual,v as mergeObjects,d as mergeTypes};
1
+ var S={rootName:"Root",outputStyle:"interface",namingStyle:"PascalCase",sortProperties:"alpha",addExport:!0,strictNullChecks:!1,markOptional:!0,indentSize:2,lineEnding:`
2
+ `,typeNameMap:{},typePrefix:"",typeSuffix:""};function u(n){return{kind:"primitive",type:n}}function A(){return{kind:"null"}}function P(){return{kind:"undefined"}}function R(n){return{kind:"array",elementType:n}}function b(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 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,e=new Set){if(e.has(n))return"circular";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,e)}`;case"object":{e.add(n);let t=`object:${n.properties.map(r=>`${r.name}:${p(r.type,e)}:${r.optional}`).sort().join(",")}`;return e.delete(n),t}case"union":return`union:${n.types.map(t=>p(t,e)).sort().join("|")}`;case"generic":return`generic:${n.name}:${n.typeArgs.map(t=>p(t,e)).join(",")}`;default:return"unknown"}}function T(n,e){return p(n)===p(e)?n:n.kind==="object"&&e.kind==="object"?O(n,e):n.kind==="array"&&e.kind==="array"?R(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):t.set(r.name,{...r,optional:!0})}for(let[r,i]of t)e.properties.some(s=>s.name===r)||(i.optional=!0);return b(Array.from(t.values()))}function C(n){if(n instanceof Date||n instanceof RegExp||typeof Buffer!="undefined"&&Buffer.isBuffer(n))return u("string");let e=Object.prototype.toString.call(n);return e==="[object Date]"||e==="[object RegExp]"?u("string"):e==="[object Map]"||e==="[object Set]"||e==="[object WeakMap]"||e==="[object WeakSet]"?u("unknown"):null}function c(n,e=new WeakSet,t=new WeakMap){if(n===null)return A();if(n===void 0)return P();if(typeof n=="function")return u("Function");if(typeof n=="string")return u("string");if(typeof n=="number")return u("number");if(typeof n=="boolean")return u("boolean");if(Array.isArray(n))return v(n,e,t);if(typeof n=="object"&&n!==null){let r=C(n);if(r)return r;let i=n;if(e.has(i)){let a=t.get(i);if(a)return a}e.add(i);let o=b([]);t.set(i,o);let s=[];for(let[a,f]of Object.entries(i))s.push({name:a,type:c(f,e,t),optional:!1});return o.properties=s,e.delete(i),o}return u("unknown")}function v(n,e,t=new WeakMap){if(n.length===0)return{kind:"array",elementType:{kind:"primitive",type:"unknown"}};let r=n.map(o=>c(o,e,t)),i=r[0];for(let o=1;o<r.length;o++)i=T(i,r[o]);return{kind:"array",elementType:i}}function D(n,e=new WeakSet,t=new WeakMap){return c(n,e,t)}function N(n,e){return n===e?!0:p(n)===p(e)}function l(n,e=new WeakMap){if(e.has(n))return e.get(n);let t;switch(n.kind){case"primitive":return t={kind:"primitive",type:n.type},e.set(n,t),t;case"null":return t={kind:"null"},e.set(n,t),t;case"undefined":return t={kind:"undefined"},e.set(n,t),t;case"literal":return t={kind:"literal",value:n.value},e.set(n,t),t;case"array":return t={kind:"array",elementType:{}},e.set(n,t),t.elementType=l(n.elementType,e),t;case"object":return t={kind:"object",properties:[],isRecord:n.isRecord,valueType:n.valueType},e.set(n,t),t.properties=n.properties.map(r=>({name:r.name,optional:r.optional,type:l(r.type,e)})),n.valueType&&(t.valueType=l(n.valueType,e)),t;case"union":return t={kind:"union",types:[]},e.set(n,t),t.types=n.types.map(r=>l(r,e)),t;case"generic":return t={kind:"generic",name:n.name,typeArgs:[]},e.set(n,t),t.typeArgs=n.typeArgs.map(r=>l(r,e)),t;default:return t={kind:"primitive",type:"unknown"},e.set(n,t),t}}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")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.formatName(o),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){return e.path||""}getTypeKey(e){return p(e)}getSimpleTypeKey(e){return p(e)}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()}},m=class{constructor(e){this.collected=[];this.seenStructs=new Set;this.namer=e}collect(e,t){this.collected=[],this.seenStructs.clear(),this.namer.reset(),this.collectRecursive(e,{fieldName:t,parentName:void 0,path:t,depth:0});let r=this.collected.find(o=>o.name===t),i=this.collected.filter(o=>o.name!==t);return r?[r,...i]: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 o of e.properties)this.collectRecursive(o.type,{fieldName:o.name,parentName:i,path:t.path?`${t.path}.${o.name}`:o.name,depth:t.depth+1})}return}if(e.kind==="array"){this.collectRecursive(e.elementType,{fieldName:t.fieldName?t.fieldName+"Item":void 0,parentName:t.parentName,path:t.path,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 p(e)}};var d=class{constructor(e,t){this.allNamedTypes=[];this.options=e,this.namer=t}get eol(){return this.options.lineEnding}joinLines(e){return e.join(this.eol)}findTypeName(e){if(e.kind!=="object")return null;for(let t of this.allNamedTypes)if(t.type===e||N(t.type,e))return t.name;return null}formatTypeDef(e){let{name:t,type:r}=e,i=this.options.addExport?"export ":"";return this.formatObjectType(t,r,i)}formatObjectType(e,t,r){let i=" ".repeat(this.options.indentSize),o=this.sortProperties(t.properties),s=[];this.options.outputStyle==="interface"?s.push(`${r}interface ${e} {`):s.push(`${r}type ${e} = {`);for(let a of o){let f=this.formatPropertyName(a.name),w=a.optional?"?":"",$=this.formatType(a.type);s.push(`${i}${f}${w}: ${$};`)}return this.options.outputStyle==="interface"?s.push("}"):s.push("};"),this.joinLines(s)}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?"?":"",f=this.formatType(o.type);i.push(`${t}${s}${a}: ${f};`)}return i.push("}"),this.joinLines(i)}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))}formatAll(e){return this.allNamedTypes=e,e.map(t=>this.formatTypeDef(t)).join(`${this.eol}${this.eol}`)}generateOutput(e,t){let r=this.joinLines(["/**"," * Generated by type-flash",` * Root type: ${t}`," */"]),i=this.formatAll(e);return`${r}${this.eol}${this.eol}${i}${this.eol}`}};var g=class{constructor(e=!1){this.seen=new WeakSet;this.strict=e}process(e){return this.processRecursive(e)}processRecursive(e){if(this.strict)return e;if(e.kind==="null")return{kind:"primitive",type:"unknown"};if(e.kind==="union"){let t=e.types.filter(r=>r.kind!=="null");return t.length===0?{kind:"primitive",type:"unknown"}:t.length===1?this.processRecursive(t[0]):{...e,types:t.map(r=>this.processRecursive(r))}}if(e.kind==="array")return{...e,elementType:this.processRecursive(e.elementType)};if(e.kind==="object"){if(this.seen.has(e))return e;this.seen.add(e);let t={...e,properties:e.properties.map(r=>r.type===e?{...r}:{...r,type:this.processRecursive(r.type)})};for(let r of t.properties)r.type===e&&(r.type=t);return this.seen.delete(e),t}return e}},h=class{constructor(e=!0){this.seen=new WeakSet;this.markOptional=e}process(e,t){return this.markOptional?this.processRecursive(e,t):t}processRecursive(e,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,elementType:this.processRecursive(e,r)}}if(t.kind==="object"&&e&&typeof e=="object"){if(this.seen.has(t))return t;this.seen.add(t);let r={...t,properties:t.properties.map(i=>i.type===t?{...i}:{...i,type:this.processRecursive(e[i.name],i.type)})};for(let i of r.properties)i.type===t&&(i.type=r);return this.seen.delete(t),r}return t.kind==="union"&&Array.isArray(e)?{...t,types:t.types.map(r=>this.processRecursive(e,r))}: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 k(n,e,t){let r=e;return t.markOptional&&(r=new h(t.markOptional).process(n,r)),r=new g(t.strictNullChecks).process(r),r}function x(n,e={}){let t={...S,...e},r=c(n);r=k(n,r,t);let i=new y({namingStyle:t.namingStyle,prefix:t.typePrefix,suffix:t.typeSuffix,customNameMap:t.typeNameMap}),s=new m(i).collect(r,t.rootName);return new d(t,i).generateOutput(s,t.rootName)}function M(n,e={}){let t=JSON.parse(n);return x(t,e)}var V={generate:x,generateFromString:M};export{d as CodeFormatter,g as NullHandler,h as OptionalHandler,m as TypeCollector,y as TypeNamer,k as applyEnhancements,j as createUnion,V as default,x as generate,M as generateFromString,v as inferArrayType,D as inferObjectType,c as inferType,N as isStructurallyEqual,O as mergeObjects,T as mergeTypes};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "type-flash",
3
- "version": "1.2.8",
3
+ "version": "1.3.0",
4
4
  "description": "极速智能的 TypeScript 类型生成器,支持深度解析对象 / JSON / 接口返回,一行代码搞定,让类型定义一键生成,彻底告别手写类型的繁琐。",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.mjs",