type-flash 1.1.3 → 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/bin/type-flash.js +130 -146
- 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/bin/type-flash.js
CHANGED
|
@@ -1,26 +1,20 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
+
|
|
2
3
|
/**
|
|
3
|
-
* type-flash CLI
|
|
4
|
+
* type-flash - CLI 命令行工具
|
|
4
5
|
*
|
|
5
6
|
* 用法:
|
|
6
|
-
* type-flash <input.json> [options]
|
|
7
7
|
* type-flash -i input.json -o output.ts
|
|
8
|
-
* cat data.json | type-flash
|
|
9
|
-
*
|
|
10
|
-
* 示例:
|
|
11
|
-
* type-flash user.json -n User
|
|
12
|
-
* type-flash api.json --style type --no-export
|
|
13
|
-
* curl https://api.example.com/users | type-flash -n UserList
|
|
8
|
+
* cat data.json | type-flash -n User
|
|
14
9
|
*/
|
|
15
10
|
|
|
16
|
-
'use strict';
|
|
17
|
-
|
|
18
11
|
const fs = require('fs');
|
|
19
12
|
const path = require('path');
|
|
20
13
|
|
|
21
14
|
// 解析命令行参数
|
|
22
|
-
function parseArgs(
|
|
23
|
-
const args =
|
|
15
|
+
function parseArgs() {
|
|
16
|
+
const args = process.argv.slice(2);
|
|
17
|
+
const options = {
|
|
24
18
|
input: null,
|
|
25
19
|
output: null,
|
|
26
20
|
rootName: 'Root',
|
|
@@ -34,182 +28,139 @@ function parseArgs(argv) {
|
|
|
34
28
|
indentSize: 2,
|
|
35
29
|
typePrefix: '',
|
|
36
30
|
typeSuffix: '',
|
|
31
|
+
typeNameMap: {},
|
|
37
32
|
help: false,
|
|
38
33
|
version: false,
|
|
39
34
|
};
|
|
40
35
|
|
|
41
|
-
let i =
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
36
|
+
for (let i = 0; i < args.length; i++) {
|
|
37
|
+
const arg = args[i];
|
|
38
|
+
|
|
45
39
|
switch (arg) {
|
|
46
|
-
case '-h':
|
|
47
|
-
case '--help':
|
|
48
|
-
args.help = true;
|
|
49
|
-
break;
|
|
50
|
-
|
|
51
|
-
case '-v':
|
|
52
|
-
case '--version':
|
|
53
|
-
args.version = true;
|
|
54
|
-
break;
|
|
55
|
-
|
|
56
40
|
case '-i':
|
|
57
41
|
case '--input':
|
|
58
|
-
|
|
42
|
+
options.input = args[++i];
|
|
59
43
|
break;
|
|
60
|
-
|
|
61
44
|
case '-o':
|
|
62
45
|
case '--output':
|
|
63
|
-
|
|
46
|
+
options.output = args[++i];
|
|
64
47
|
break;
|
|
65
|
-
|
|
66
48
|
case '-n':
|
|
67
49
|
case '--name':
|
|
68
|
-
|
|
69
|
-
args.rootName = argv[++i];
|
|
50
|
+
options.rootName = args[++i];
|
|
70
51
|
break;
|
|
71
|
-
|
|
72
52
|
case '-s':
|
|
73
53
|
case '--style':
|
|
74
|
-
|
|
54
|
+
options.outputStyle = args[++i];
|
|
75
55
|
break;
|
|
76
|
-
|
|
77
56
|
case '--naming-style':
|
|
78
|
-
|
|
57
|
+
options.namingStyle = args[++i];
|
|
79
58
|
break;
|
|
80
|
-
|
|
81
59
|
case '--sort':
|
|
82
|
-
|
|
60
|
+
options.sortProperties = args[++i];
|
|
83
61
|
break;
|
|
84
|
-
|
|
85
62
|
case '--no-export':
|
|
86
|
-
|
|
63
|
+
options.addExport = false;
|
|
87
64
|
break;
|
|
88
|
-
|
|
89
65
|
case '--strict-null':
|
|
90
|
-
|
|
66
|
+
options.strictNullChecks = true;
|
|
91
67
|
break;
|
|
92
|
-
|
|
93
68
|
case '--no-optional':
|
|
94
|
-
|
|
69
|
+
options.markOptional = false;
|
|
95
70
|
break;
|
|
96
|
-
|
|
97
71
|
case '--no-generics':
|
|
98
|
-
|
|
72
|
+
options.extractGenerics = false;
|
|
99
73
|
break;
|
|
100
|
-
|
|
101
74
|
case '--indent':
|
|
102
|
-
|
|
75
|
+
options.indentSize = parseInt(args[++i], 10);
|
|
103
76
|
break;
|
|
104
|
-
|
|
105
77
|
case '--prefix':
|
|
106
|
-
|
|
78
|
+
options.typePrefix = args[++i];
|
|
107
79
|
break;
|
|
108
|
-
|
|
109
80
|
case '--suffix':
|
|
110
|
-
|
|
81
|
+
options.typeSuffix = args[++i];
|
|
82
|
+
break;
|
|
83
|
+
case '-h':
|
|
84
|
+
case '--help':
|
|
85
|
+
options.help = true;
|
|
86
|
+
break;
|
|
87
|
+
case '-v':
|
|
88
|
+
case '--version':
|
|
89
|
+
options.version = true;
|
|
111
90
|
break;
|
|
112
|
-
|
|
113
91
|
default:
|
|
114
|
-
//
|
|
115
|
-
if (!args.input && !arg.startsWith('-')) {
|
|
116
|
-
args.input = arg;
|
|
117
|
-
}
|
|
92
|
+
// 未知参数,忽略
|
|
118
93
|
break;
|
|
119
94
|
}
|
|
120
|
-
|
|
121
|
-
i++;
|
|
122
95
|
}
|
|
123
96
|
|
|
124
|
-
return
|
|
97
|
+
return options;
|
|
125
98
|
}
|
|
126
99
|
|
|
127
|
-
//
|
|
100
|
+
// 显示帮助
|
|
128
101
|
function showHelp() {
|
|
129
102
|
console.log(`
|
|
130
103
|
type-flash - JSON 智能生成 TypeScript 类型定义
|
|
131
104
|
|
|
132
105
|
用法:
|
|
133
|
-
type-flash <
|
|
134
|
-
|
|
135
|
-
cat data.json | type-flash
|
|
106
|
+
type-flash -i <file> [选项]
|
|
107
|
+
cat data.json | type-flash [选项]
|
|
136
108
|
|
|
137
109
|
选项:
|
|
138
|
-
-i, --input <file>
|
|
139
|
-
-o, --output <file>
|
|
140
|
-
-n, --name <name>
|
|
141
|
-
-s, --style <style>
|
|
142
|
-
--naming-style <s>
|
|
143
|
-
--sort <order>
|
|
144
|
-
--no-export
|
|
145
|
-
--strict-null
|
|
146
|
-
--no-optional
|
|
147
|
-
--no-generics
|
|
148
|
-
--indent <n>
|
|
149
|
-
--prefix <prefix>
|
|
150
|
-
--suffix <suffix>
|
|
151
|
-
-
|
|
152
|
-
-
|
|
110
|
+
-i, --input <file> 输入 JSON 文件路径
|
|
111
|
+
-o, --output <file> 输出 TS 文件路径
|
|
112
|
+
-n, --name <name> 根类型名称 (默认: Root)
|
|
113
|
+
-s, --style <style> 输出风格: interface | type (默认: interface)
|
|
114
|
+
--naming-style <s> 命名风格: PascalCase | camelCase (默认: PascalCase)
|
|
115
|
+
--sort <order> 属性排序: alpha | definition (默认: alpha)
|
|
116
|
+
--no-export 不添加 export 语句
|
|
117
|
+
--strict-null 严格空值模式
|
|
118
|
+
--no-optional 不标记可选属性
|
|
119
|
+
--no-generics 不提取泛型
|
|
120
|
+
--indent <n> 缩进空格数 (默认: 2)
|
|
121
|
+
--prefix <prefix> 类型名前缀
|
|
122
|
+
--suffix <suffix> 类型名后缀
|
|
123
|
+
-v, --version 显示版本号
|
|
124
|
+
-h, --help 显示帮助
|
|
153
125
|
|
|
154
126
|
示例:
|
|
155
|
-
|
|
156
|
-
type-flash
|
|
157
|
-
|
|
158
|
-
# 使用 type 风格输出
|
|
159
|
-
type-flash data.json --style type
|
|
160
|
-
|
|
161
|
-
# 从标准输入读取
|
|
162
|
-
curl https://api.example.com/data | type-flash -n ApiResponse
|
|
163
|
-
|
|
164
|
-
# 带前缀
|
|
165
|
-
type-flash api.json --prefix Api -o api-types.ts
|
|
127
|
+
type-flash -i data.json -o types.ts
|
|
128
|
+
type-flash -i data.json -n User
|
|
129
|
+
cat data.json | type-flash -s type
|
|
166
130
|
`);
|
|
167
131
|
}
|
|
168
132
|
|
|
169
|
-
//
|
|
133
|
+
// 显示版本
|
|
170
134
|
function showVersion() {
|
|
171
135
|
try {
|
|
172
136
|
const pkgPath = path.join(__dirname, '..', 'package.json');
|
|
173
137
|
const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf-8'));
|
|
174
|
-
console.log(
|
|
138
|
+
console.log(pkg.version);
|
|
175
139
|
} catch (e) {
|
|
176
|
-
console.log('
|
|
140
|
+
console.log('unknown');
|
|
177
141
|
}
|
|
178
142
|
}
|
|
179
143
|
|
|
180
|
-
//
|
|
181
|
-
|
|
182
|
-
if (inputPath) {
|
|
183
|
-
// 从文件读取
|
|
184
|
-
const fullPath = path.resolve(inputPath);
|
|
185
|
-
if (!fs.existsSync(fullPath)) {
|
|
186
|
-
console.error(`错误: 文件不存在: ${fullPath}`);
|
|
187
|
-
process.exit(1);
|
|
188
|
-
}
|
|
189
|
-
return fs.readFileSync(fullPath, 'utf-8');
|
|
190
|
-
}
|
|
191
|
-
|
|
192
|
-
// 从标准输入读取
|
|
144
|
+
// 读取标准输入
|
|
145
|
+
function readStdin() {
|
|
193
146
|
return new Promise((resolve, reject) => {
|
|
194
147
|
let data = '';
|
|
195
148
|
process.stdin.setEncoding('utf-8');
|
|
196
|
-
|
|
149
|
+
|
|
197
150
|
process.stdin.on('data', chunk => {
|
|
198
151
|
data += chunk;
|
|
199
152
|
});
|
|
200
|
-
|
|
153
|
+
|
|
201
154
|
process.stdin.on('end', () => {
|
|
202
155
|
resolve(data);
|
|
203
156
|
});
|
|
204
|
-
|
|
157
|
+
|
|
205
158
|
process.stdin.on('error', reject);
|
|
206
|
-
|
|
207
|
-
//
|
|
159
|
+
|
|
160
|
+
// 如果没有输入,超时返回空
|
|
208
161
|
setTimeout(() => {
|
|
209
162
|
if (!data) {
|
|
210
|
-
|
|
211
|
-
console.error('使用 --help 查看帮助信息。');
|
|
212
|
-
process.exit(1);
|
|
163
|
+
resolve('');
|
|
213
164
|
}
|
|
214
165
|
}, 100);
|
|
215
166
|
});
|
|
@@ -217,65 +168,98 @@ async function readInput(inputPath) {
|
|
|
217
168
|
|
|
218
169
|
// 主函数
|
|
219
170
|
async function main() {
|
|
220
|
-
const
|
|
171
|
+
const options = parseArgs();
|
|
221
172
|
|
|
222
|
-
|
|
173
|
+
// 显示帮助
|
|
174
|
+
if (options.help) {
|
|
223
175
|
showHelp();
|
|
224
176
|
return;
|
|
225
177
|
}
|
|
226
178
|
|
|
227
|
-
|
|
179
|
+
// 显示版本
|
|
180
|
+
if (options.version) {
|
|
228
181
|
showVersion();
|
|
229
182
|
return;
|
|
230
183
|
}
|
|
231
184
|
|
|
232
185
|
try {
|
|
233
|
-
//
|
|
234
|
-
|
|
186
|
+
// 1. 获取 JSON 数据
|
|
187
|
+
let jsonString;
|
|
188
|
+
|
|
189
|
+
if (options.input) {
|
|
190
|
+
// 从文件读取
|
|
191
|
+
const inputPath = path.resolve(options.input);
|
|
192
|
+
if (!fs.existsSync(inputPath)) {
|
|
193
|
+
console.error(`错误: 文件不存在 - ${options.input}`);
|
|
194
|
+
process.exit(1);
|
|
195
|
+
}
|
|
196
|
+
jsonString = fs.readFileSync(inputPath, 'utf-8');
|
|
197
|
+
} else {
|
|
198
|
+
// 从标准输入读取
|
|
199
|
+
jsonString = await readStdin();
|
|
200
|
+
if (!jsonString.trim()) {
|
|
201
|
+
console.error('错误: 未提供输入数据。使用 -i 指定文件或通过管道输入');
|
|
202
|
+
console.error('使用 type-flash --help 查看帮助');
|
|
203
|
+
process.exit(1);
|
|
204
|
+
}
|
|
205
|
+
}
|
|
235
206
|
|
|
236
|
-
// 解析 JSON
|
|
207
|
+
// 2. 解析 JSON
|
|
237
208
|
let jsonData;
|
|
238
209
|
try {
|
|
239
|
-
jsonData = JSON.parse(
|
|
210
|
+
jsonData = JSON.parse(jsonString);
|
|
240
211
|
} catch (e) {
|
|
241
212
|
console.error(`错误: JSON 解析失败 - ${e.message}`);
|
|
242
213
|
process.exit(1);
|
|
243
214
|
}
|
|
244
215
|
|
|
245
|
-
//
|
|
246
|
-
|
|
216
|
+
// 3. 生成类型
|
|
217
|
+
// 动态导入生成的模块
|
|
218
|
+
const distPath = path.join(__dirname, '..', 'dist', 'index.js');
|
|
219
|
+
let generate;
|
|
220
|
+
|
|
221
|
+
try {
|
|
222
|
+
const mod = require(distPath);
|
|
223
|
+
generate = mod.generate || mod.default?.generate;
|
|
224
|
+
} catch (e) {
|
|
225
|
+
console.error(`错误: 加载模块失败 - ${e.message}`);
|
|
226
|
+
console.error('请先运行 npm run build 构建项目');
|
|
227
|
+
process.exit(1);
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
if (!generate) {
|
|
231
|
+
console.error('错误: 未找到 generate 函数');
|
|
232
|
+
process.exit(1);
|
|
233
|
+
}
|
|
247
234
|
|
|
248
|
-
//
|
|
235
|
+
// 生成类型(generate 直接返回字符串)
|
|
249
236
|
const result = generate(jsonData, {
|
|
250
|
-
rootName:
|
|
251
|
-
outputStyle:
|
|
252
|
-
namingStyle:
|
|
253
|
-
sortProperties:
|
|
254
|
-
addExport:
|
|
255
|
-
strictNullChecks:
|
|
256
|
-
markOptional:
|
|
257
|
-
extractGenerics:
|
|
258
|
-
indentSize:
|
|
259
|
-
typePrefix:
|
|
260
|
-
typeSuffix:
|
|
237
|
+
rootName: options.rootName,
|
|
238
|
+
outputStyle: options.outputStyle,
|
|
239
|
+
namingStyle: options.namingStyle,
|
|
240
|
+
sortProperties: options.sortProperties,
|
|
241
|
+
addExport: options.addExport,
|
|
242
|
+
strictNullChecks: options.strictNullChecks,
|
|
243
|
+
markOptional: options.markOptional,
|
|
244
|
+
extractGenerics: options.extractGenerics,
|
|
245
|
+
indentSize: options.indentSize,
|
|
246
|
+
typePrefix: options.typePrefix,
|
|
247
|
+
typeSuffix: options.typeSuffix,
|
|
261
248
|
});
|
|
262
249
|
|
|
263
|
-
// 输出结果
|
|
264
|
-
if (
|
|
265
|
-
const outputPath = path.resolve(
|
|
266
|
-
fs.writeFileSync(outputPath, result
|
|
267
|
-
console.log(
|
|
268
|
-
console.log(` 共生成 ${result.types.length} 个类型定义`);
|
|
250
|
+
// 4. 输出结果
|
|
251
|
+
if (options.output) {
|
|
252
|
+
const outputPath = path.resolve(options.output);
|
|
253
|
+
fs.writeFileSync(outputPath, result, 'utf-8');
|
|
254
|
+
console.log(`✅ 已生成: ${options.output}`);
|
|
269
255
|
} else {
|
|
270
|
-
console.log(result
|
|
256
|
+
console.log(result);
|
|
271
257
|
}
|
|
258
|
+
|
|
272
259
|
} catch (e) {
|
|
273
260
|
console.error(`错误: ${e.message}`);
|
|
274
|
-
if (process.env.DEBUG) {
|
|
275
|
-
console.error(e.stack);
|
|
276
|
-
}
|
|
277
261
|
process.exit(1);
|
|
278
262
|
}
|
|
279
263
|
}
|
|
280
264
|
|
|
281
|
-
main();
|
|
265
|
+
main();
|
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};
|