type-flash 1.1.4 → 1.1.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 +6 -3
- package/dist/index.d.ts +6 -3
- package/dist/index.js +7 -7
- package/dist/index.mjs +2 -2
- package/package.json +1 -1
package/dist/index.d.mts
CHANGED
|
@@ -365,18 +365,19 @@ declare function mergeTypes(a: TSTypeNode, b: TSTypeNode): TSTypeNode;
|
|
|
365
365
|
declare function mergeObjects(a: ObjectType, b: ObjectType): ObjectType;
|
|
366
366
|
/**
|
|
367
367
|
* 推断单个值的类型
|
|
368
|
+
* seen 循环缓存参数,默认新建 WeakSet
|
|
368
369
|
*/
|
|
369
|
-
declare function inferType(value: unknown): TSTypeNode;
|
|
370
|
+
declare function inferType(value: unknown, seen?: WeakSet<object>): TSTypeNode;
|
|
370
371
|
/**
|
|
371
372
|
* 推断数组类型
|
|
372
373
|
* - 统一提取元素类型
|
|
373
374
|
* - 元素类型不一致时生成联合类型
|
|
374
375
|
*/
|
|
375
|
-
declare function inferArrayType(arr: unknown[]): ArrayType;
|
|
376
|
+
declare function inferArrayType(arr: unknown[], seen: WeakSet<object>): ArrayType;
|
|
376
377
|
/**
|
|
377
378
|
* 推断对象类型
|
|
378
379
|
*/
|
|
379
|
-
declare function inferObjectType(obj: Record<string, unknown>): ObjectType;
|
|
380
|
+
declare function inferObjectType(obj: Record<string, unknown>, seen: WeakSet<object>): ObjectType;
|
|
380
381
|
/**
|
|
381
382
|
* 判断两个类型是否结构等价
|
|
382
383
|
* 用于类型去重与复用
|
|
@@ -398,7 +399,9 @@ declare function isStructurallyEqual(a: TSTypeNode, b: TSTypeNode): boolean;
|
|
|
398
399
|
*/
|
|
399
400
|
declare class GenericExtractor {
|
|
400
401
|
private patterns;
|
|
402
|
+
private seen;
|
|
401
403
|
extract(type: TSTypeNode): TSTypeNode;
|
|
404
|
+
private extractRecursive;
|
|
402
405
|
private tryMatchPattern;
|
|
403
406
|
}
|
|
404
407
|
/**
|
package/dist/index.d.ts
CHANGED
|
@@ -365,18 +365,19 @@ declare function mergeTypes(a: TSTypeNode, b: TSTypeNode): TSTypeNode;
|
|
|
365
365
|
declare function mergeObjects(a: ObjectType, b: ObjectType): ObjectType;
|
|
366
366
|
/**
|
|
367
367
|
* 推断单个值的类型
|
|
368
|
+
* seen 循环缓存参数,默认新建 WeakSet
|
|
368
369
|
*/
|
|
369
|
-
declare function inferType(value: unknown): TSTypeNode;
|
|
370
|
+
declare function inferType(value: unknown, seen?: WeakSet<object>): TSTypeNode;
|
|
370
371
|
/**
|
|
371
372
|
* 推断数组类型
|
|
372
373
|
* - 统一提取元素类型
|
|
373
374
|
* - 元素类型不一致时生成联合类型
|
|
374
375
|
*/
|
|
375
|
-
declare function inferArrayType(arr: unknown[]): ArrayType;
|
|
376
|
+
declare function inferArrayType(arr: unknown[], seen: WeakSet<object>): ArrayType;
|
|
376
377
|
/**
|
|
377
378
|
* 推断对象类型
|
|
378
379
|
*/
|
|
379
|
-
declare function inferObjectType(obj: Record<string, unknown>): ObjectType;
|
|
380
|
+
declare function inferObjectType(obj: Record<string, unknown>, seen: WeakSet<object>): ObjectType;
|
|
380
381
|
/**
|
|
381
382
|
* 判断两个类型是否结构等价
|
|
382
383
|
* 用于类型去重与复用
|
|
@@ -398,7 +399,9 @@ declare function isStructurallyEqual(a: TSTypeNode, b: TSTypeNode): boolean;
|
|
|
398
399
|
*/
|
|
399
400
|
declare class GenericExtractor {
|
|
400
401
|
private patterns;
|
|
402
|
+
private seen;
|
|
401
403
|
extract(type: TSTypeNode): TSTypeNode;
|
|
404
|
+
private extractRecursive;
|
|
402
405
|
private tryMatchPattern;
|
|
403
406
|
}
|
|
404
407
|
/**
|
package/dist/index.js
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
"use strict";var b=Object.defineProperty;var
|
|
2
|
-
`,typeNameMap:{},typePrefix:"",typeSuffix:""};function m(
|
|
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),
|
|
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,
|
|
1
|
+
"use strict";var b=Object.defineProperty;var D=Object.getOwnPropertyDescriptor;var G=Object.getOwnPropertyNames;var U=Object.prototype.hasOwnProperty;var M=(r,e)=>{for(var t in e)b(r,t,{get:e[t],enumerable:!0})},E=(r,e,t,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let i of G(e))!U.call(r,i)&&i!==t&&b(r,i,{get:()=>e[i],enumerable:!(n=D(e,i))||n.enumerable});return r};var F=r=>E(b({},"__esModule",{value:!0}),r);var z={};M(z,{CodeFormatter:()=>y,GenericExtractor:()=>T,NullHandler:()=>g,OptionalHandler:()=>h,TypeCollector:()=>f,TypeNamer:()=>c,applyEnhancements:()=>k,createUnion:()=>j,default:()=>q,generate:()=>$,generateFromString:()=>w,inferArrayType:()=>v,inferObjectType:()=>O,inferType:()=>l,isStructurallyEqual:()=>N,mergeObjects:()=>x,mergeTypes:()=>d});module.exports=F(z);var P={rootName:"Root",outputStyle:"interface",namingStyle:"PascalCase",sortProperties:"alpha",addExport:!0,strictNullChecks:!1,markOptional:!0,extractGenerics:!0,indentSize:2,lineEnding:`
|
|
2
|
+
`,typeNameMap:{},typePrefix:"",typeSuffix:""};function m(r){return{kind:"primitive",type:r}}function K(){return{kind:"null"}}function L(){return{kind:"undefined"}}function _(r){return{kind:"array",elementType:r}}function A(r=[]){return{kind:"object",properties:r}}function j(r){let e=[],t=new Set;for(let n of r)if(n.kind==="union")for(let i of n.types){let o=a(i);t.has(o)||(t.add(o),e.push(i))}else{let i=a(n);t.has(i)||(t.add(i),e.push(n))}return e.length===1?e[0]:{kind:"union",types:e}}function a(r){switch(r.kind){case"primitive":return`primitive:${r.type}`;case"null":return"null";case"undefined":return"undefined";case"literal":return`literal:${typeof r.value}:${String(r.value)}`;case"array":return`array:${a(r.elementType)}`;case"object":return`object:${r.properties.map(e=>`${e.name}:${a(e.type)}:${e.optional}`).join(",")}`;case"union":return`union:${r.types.map(a).sort().join("|")}`;case"generic":return`generic:${r.name}:${r.typeArgs.map(a).join(",")}`;default:return"unknown"}}function d(r,e){return a(r)===a(e)?r:r.kind==="object"&&e.kind==="object"?x(r,e):r.kind==="array"&&e.kind==="array"?_(d(r.elementType,e.elementType)):j([r,e])}function x(r,e){let t=new Map;for(let n of r.properties)t.set(n.name,{...n});for(let n of e.properties){let i=t.get(n.name);i?(i.type=d(i.type,n.type),i.optional=i.optional||n.optional):t.set(n.name,{...n,optional:!0})}for(let[n,i]of t)e.properties.some(s=>s.name===n)||(i.optional=!0);return A(Array.from(t.values()))}function l(r,e=new WeakSet){if(r===null)return K();if(r===void 0)return L();if(typeof r=="function")return m("function");if(typeof r=="string")return m("string");if(typeof r=="number")return m("number");if(typeof r=="boolean")return m("boolean");if(Array.isArray(r))return v(r,e);if(typeof r=="object"&&r!==null){let t=r;if(e.has(t))return{kind:"object",properties:[]};e.add(t);let n=O(t,e);return e.delete(t),n}return m("unknown")}function v(r,e){if(r.length===0)return{kind:"array",elementType:{kind:"primitive",type:"any"}};let t=r.map(i=>l(i,e)),n=t[0];for(let i=1;i<t.length;i++)n=d(n,t[i]);return{kind:"array",elementType:n}}function O(r,e){let t=[];for(let[n,i]of Object.entries(r)){let o=l(i,e);t.push({name:n,type:o,optional:!1})}return A(t)}function N(r,e){return a(r)===a(e)}function u(r,e=new WeakMap){if(e.has(r))return e.get(r);let t;switch(r.kind){case"primitive":return t={kind:"primitive",type:r.type},e.set(r,t),t;case"null":return t={kind:"null"},e.set(r,t),t;case"undefined":return t={kind:"undefined"},e.set(r,t),t;case"literal":return t={kind:"literal",value:r.value},e.set(r,t),t;case"array":return t={kind:"array",elementType:{}},e.set(r,t),t.elementType=u(r.elementType,e),t;case"object":return t={kind:"object",properties:[],isRecord:r.isRecord,valueType:r.valueType},e.set(r,t),t.properties=r.properties.map(n=>({name:n.name,optional:n.optional,type:u(n.type,e)})),r.valueType&&(t.valueType=u(r.valueType,e)),t;case"union":return t={kind:"union",types:[]},e.set(r,t),t.types=r.types.map(n=>u(n,e)),t;case"generic":return t={kind:"generic",name:r.name,typeArgs:[]},e.set(r,t),t.typeArgs=r.typeArgs.map(n=>u(n,e)),t;default:return t={kind:"primitive",type:"unknown"},e.set(r,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 n=this.buildPathKey(t);if(this.customNameMap[n])return this.applyAffixes(this.customNameMap[n]);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 n=this.toPascalCase(t.fieldName);return t.parentName?`${t.parentName}${n}`:n}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 n=`${e}${t+1}`;return this.nameCounter.set(e,t+1),n}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(n=>n.charAt(0).toUpperCase()+n.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 n=this.collected.find(o=>o.name===t),i=this.collected.filter(o=>o.name!==t);return n?[n,...i]:this.collected}collectRecursive(e,t){let n=this.getStructKey(e);if(e.kind==="object"){let i=this.namer.nameType(e,t);if(i&&!this.seenStructs.has(n)){this.seenStructs.add(n),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(N(t.type,e))return t.name;return null}formatTypeDef(e){let{name:t,type:n}=e,i=this.options.addExport?"export ":"";return this.formatObjectType(t,n,i)}formatObjectType(e,t,n){let i=" ".repeat(this.options.indentSize),o=this.sortProperties(t.properties),s=[];this.options.outputStyle==="interface"?s.push(`${n}interface ${e} {`):s.push(`${n}type ${e} = {`);for(let p of o){let S=this.formatPropertyName(p.name),C=p.optional?"?":"",R=this.formatType(p.type);s.push(`${i}${S}${C}: ${R};`)}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),n=this.sortProperties(e.properties);if(n.length===0)return"{}";let i=["{"];for(let o of n){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,n)=>t.name.localeCompare(n.name))}formatAll(e){return this.allNamedTypes=e,e.map(t=>this.formatTypeDef(t)).join(`
|
|
5
5
|
|
|
6
|
-
`)}generateOutput(e,t){let
|
|
6
|
+
`)}generateOutput(e,t){let n=`/**
|
|
7
7
|
* Generated by type-flash
|
|
8
8
|
* Root type: ${t}
|
|
9
|
-
*/`,i=this.formatAll(e);return`${
|
|
9
|
+
*/`,i=this.formatAll(e);return`${n}
|
|
10
10
|
|
|
11
11
|
${i}
|
|
12
|
-
`}};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;
|
|
12
|
+
`}};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:[]}];this.seen=new WeakSet}extract(e){return this.extractRecursive(e)}extractRecursive(e){if(e.kind!=="object")return e.kind==="array"?{...e,elementType:this.extractRecursive(e.elementType)}:e.kind==="union"?{...e,types:e.types.map(o=>this.extractRecursive(o))}:e.kind==="generic"?{...e,typeArgs:e.typeArgs.map(o=>this.extractRecursive(o))}:e;if(this.seen.has(e))return e;this.seen.add(e);let t=e.properties.map(o=>({...o,type:this.extractRecursive(o.type)})),n={...e,properties:t},i=null;for(let o of this.patterns){let s=this.tryMatchPattern(n,o);if(s){i=s;break}}return this.seen.delete(e),n}tryMatchPattern(e,t){let n=null,i=t.countFields.length===0;for(let o of e.properties)t.arrayFields.includes(o.name)&&o.type.kind==="array"&&(n={name:o.name,elementType:o.type.elementType}),t.countFields.includes(o.name)&&(i=!0);return n&&i?{kind:"generic",name:t.name,typeArgs:[n.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(n=>n.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 n=t.elementType;if(n.kind==="object"){let i=this.processArrayObjects(e,n);return{...t,elementType:i}}}return t}processArrayObjects(e,t){if(e.length<=1)return t;let n={},i=e.length;for(let o of e)if(o&&typeof o=="object")for(let s of Object.keys(o))n[s]=(n[s]||0)+1;return{...t,properties:t.properties.map(o=>{let p=(n[o.name]||0)<i;return{...o,optional:p}})}}};function k(r,e,t){let n=e;return t.markOptional&&(n=new h(t.markOptional).process(r,n)),t.extractGenerics&&(n=new T().extract(n)),n=new g(t.strictNullChecks).process(n),n}function $(r,e={}){let t={...P,...e},n=l(r);n=k(r,n,t);let i=new c({namingStyle:t.namingStyle,prefix:t.typePrefix,suffix:t.typeSuffix,customNameMap:t.typeNameMap}),s=new f(i).collect(n,t.rootName);return new y(t,i).generateOutput(s,t.rootName)}function w(r,e={}){let t=JSON.parse(r);return $(t,e)}var q={generate:$,generateFromString:w};0&&(module.exports={CodeFormatter,GenericExtractor,NullHandler,OptionalHandler,TypeCollector,TypeNamer,applyEnhancements,createUnion,generate,generateFromString,inferArrayType,inferObjectType,inferType,isStructurallyEqual,mergeObjects,mergeTypes});
|
package/dist/index.mjs
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
var b={rootName:"Root",outputStyle:"interface",namingStyle:"PascalCase",sortProperties:"alpha",addExport:!0,strictNullChecks:!1,markOptional:!0,extractGenerics:!0,indentSize:2,lineEnding:`
|
|
2
|
-
`,typeNameMap:{},typePrefix:"",typeSuffix:""};function
|
|
2
|
+
`,typeNameMap:{},typePrefix:"",typeSuffix:""};function l(n){return{kind:"primitive",type:n}}function C(){return{kind:"null"}}function R(){return{kind:"undefined"}}function D(n){return{kind:"array",elementType:n}}function j(n=[]){return{kind:"object",properties:n}}function x(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"?D(d(n.elementType,e.elementType)):x([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 j(Array.from(t.values()))}function c(n,e=new WeakSet){if(n===null)return C();if(n===void 0)return R();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 O(n,e);if(typeof n=="object"&&n!==null){let t=n;if(e.has(t))return{kind:"object",properties:[]};e.add(t);let r=$(t,e);return e.delete(t),r}return l("unknown")}function O(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 $(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 j(t)}function k(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(k(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 N=this.formatPropertyName(p.name),A=p.optional?"?":"",w=this.formatType(p.type);s.push(`${i}${N}${A}: ${w};`)}return this.options.outputStyle==="interface"?s.push("}"):s.push("};"),s.join(`
|
|
3
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?"?":"",N=this.formatType(o.type);i.push(`${t}${s}${p}: ${N};`)}return i.push("}"),i.join(`
|
|
4
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
5
|
|
|
@@ -9,4 +9,4 @@ var b={rootName:"Root",outputStyle:"interface",namingStyle:"PascalCase",sortProp
|
|
|
9
9
|
*/`,i=this.formatAll(e);return`${r}
|
|
10
10
|
|
|
11
11
|
${i}
|
|
12
|
-
`}};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;
|
|
12
|
+
`}};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:[]}];this.seen=new WeakSet}extract(e){return this.extractRecursive(e)}extractRecursive(e){if(e.kind!=="object")return e.kind==="array"?{...e,elementType:this.extractRecursive(e.elementType)}:e.kind==="union"?{...e,types:e.types.map(o=>this.extractRecursive(o))}:e.kind==="generic"?{...e,typeArgs:e.typeArgs.map(o=>this.extractRecursive(o))}:e;if(this.seen.has(e))return e;this.seen.add(e);let t=e.properties.map(o=>({...o,type:this.extractRecursive(o.type)})),r={...e,properties:t},i=null;for(let o of this.patterns){let s=this.tryMatchPattern(r,o);if(s){i=s;break}}return this.seen.delete(e),r}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 p=(r[o.name]||0)<i;return{...o,optional:p}})}}};function S(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 P(n,e={}){let t={...b,...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 G(n,e={}){let t=JSON.parse(n);return P(t,e)}var H={generate:P,generateFromString:G};export{m as CodeFormatter,T as GenericExtractor,g as NullHandler,h as OptionalHandler,y as TypeCollector,f as TypeNamer,S as applyEnhancements,x as createUnion,H as default,P as generate,G as generateFromString,O as inferArrayType,$ as inferObjectType,c as inferType,k as isStructurallyEqual,v as mergeObjects,d as mergeTypes};
|