ts-ref-kit 1.0.0 → 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (79) hide show
  1. package/dist/index.js +20 -3
  2. package/dist/parser/reflect-parser.js +1 -611
  3. package/package.json +5 -3
  4. package/dist/index.d.ts +0 -2
  5. package/dist/index.js.map +0 -1
  6. package/dist/parser/index.d.ts +0 -3
  7. package/dist/parser/index.js +0 -4
  8. package/dist/parser/index.js.map +0 -1
  9. package/dist/parser/path-match.d.ts +0 -7
  10. package/dist/parser/path-match.js +0 -37
  11. package/dist/parser/path-match.js.map +0 -1
  12. package/dist/parser/reflect-loader.d.ts +0 -9
  13. package/dist/parser/reflect-loader.js +0 -93
  14. package/dist/parser/reflect-loader.js.map +0 -1
  15. package/dist/parser/reflect-parser-plugin.d.ts +0 -7
  16. package/dist/parser/reflect-parser-plugin.js +0 -27
  17. package/dist/parser/reflect-parser-plugin.js.map +0 -1
  18. package/dist/parser/reflect-parser.d.ts +0 -74
  19. package/dist/parser/reflect-parser.js.map +0 -1
  20. package/dist/reflect-json/Mappable.d.ts +0 -13
  21. package/dist/reflect-json/Mappable.js +0 -48
  22. package/dist/reflect-json/Mappable.js.map +0 -1
  23. package/dist/reflect-json/decorate.d.ts +0 -18
  24. package/dist/reflect-json/decorate.js +0 -62
  25. package/dist/reflect-json/decorate.js.map +0 -1
  26. package/dist/reflect-json/index.d.ts +0 -6
  27. package/dist/reflect-json/index.js +0 -7
  28. package/dist/reflect-json/index.js.map +0 -1
  29. package/dist/reflect-json/json-translation.d.ts +0 -38
  30. package/dist/reflect-json/json-translation.js +0 -243
  31. package/dist/reflect-json/json-translation.js.map +0 -1
  32. package/dist/reflect-json/reflect-extension.d.ts +0 -13
  33. package/dist/reflect-json/reflect-extension.js +0 -30
  34. package/dist/reflect-json/reflect-extension.js.map +0 -1
  35. package/dist/reflect-json/types.d.ts +0 -15
  36. package/dist/reflect-json/types.js +0 -2
  37. package/dist/reflect-json/types.js.map +0 -1
  38. package/dist/reflect-json/utils.d.ts +0 -9
  39. package/dist/reflect-json/utils.js +0 -48
  40. package/dist/reflect-json/utils.js.map +0 -1
  41. package/dist/reflect-types/ClassDefinition.d.ts +0 -26
  42. package/dist/reflect-types/ClassDefinition.js +0 -90
  43. package/dist/reflect-types/ClassDefinition.js.map +0 -1
  44. package/dist/reflect-types/EnumDefinition.d.ts +0 -8
  45. package/dist/reflect-types/EnumDefinition.js +0 -20
  46. package/dist/reflect-types/EnumDefinition.js.map +0 -1
  47. package/dist/reflect-types/InterfaceDefinition.d.ts +0 -16
  48. package/dist/reflect-types/InterfaceDefinition.js +0 -49
  49. package/dist/reflect-types/InterfaceDefinition.js.map +0 -1
  50. package/dist/reflect-types/MethodDefinition.d.ts +0 -15
  51. package/dist/reflect-types/MethodDefinition.js +0 -21
  52. package/dist/reflect-types/MethodDefinition.js.map +0 -1
  53. package/dist/reflect-types/PropertyDefinition.d.ts +0 -18
  54. package/dist/reflect-types/PropertyDefinition.js +0 -15
  55. package/dist/reflect-types/PropertyDefinition.js.map +0 -1
  56. package/dist/reflect-types/assert-type.d.ts +0 -12
  57. package/dist/reflect-types/assert-type.js +0 -35
  58. package/dist/reflect-types/assert-type.js.map +0 -1
  59. package/dist/reflect-types/function-validate.d.ts +0 -10
  60. package/dist/reflect-types/function-validate.js +0 -77
  61. package/dist/reflect-types/function-validate.js.map +0 -1
  62. package/dist/reflect-types/index.d.ts +0 -11
  63. package/dist/reflect-types/index.js +0 -12
  64. package/dist/reflect-types/index.js.map +0 -1
  65. package/dist/reflect-types/package.d.ts +0 -13
  66. package/dist/reflect-types/package.js +0 -25
  67. package/dist/reflect-types/package.js.map +0 -1
  68. package/dist/reflect-types/reflect-context.d.ts +0 -16
  69. package/dist/reflect-types/reflect-context.js +0 -109
  70. package/dist/reflect-types/reflect-context.js.map +0 -1
  71. package/dist/reflect-types/reflect-definitions.d.ts +0 -100
  72. package/dist/reflect-types/reflect-definitions.js +0 -29
  73. package/dist/reflect-types/reflect-definitions.js.map +0 -1
  74. package/dist/reflect-types/reflect-types.d.ts +0 -20
  75. package/dist/reflect-types/reflect-types.js +0 -83
  76. package/dist/reflect-types/reflect-types.js.map +0 -1
  77. package/dist/reflect-types/reflect-validate.d.ts +0 -24
  78. package/dist/reflect-types/reflect-validate.js +0 -313
  79. package/dist/reflect-types/reflect-validate.js.map +0 -1
@@ -1,611 +1 @@
1
- import { __awaiter } from "tslib";
2
- /* eslint-disable */
3
- import * as ts from 'typescript';
4
- import * as fs from 'fs';
5
- import * as process from 'process';
6
- import * as Path from 'path';
7
- const OUTPUT_LOG = true;
8
- const classDefinitions = new Map();
9
- const interfaceDefinitions = new Map();
10
- const enumDefinitions = new Map();
11
- const typeAliasDefinitions = new Map();
12
- const constTypeDefinitions = new Map();
13
- const types = new Set();
14
- const primitiveKinds = {
15
- [ts.SyntaxKind.BooleanKeyword]: 'boolean',
16
- [ts.SyntaxKind.StringKeyword]: 'string',
17
- [ts.SyntaxKind.BigIntKeyword]: 'bigint',
18
- [ts.SyntaxKind.NumberKeyword]: 'number',
19
- [ts.SyntaxKind.SymbolKeyword]: 'symbol',
20
- [ts.SyntaxKind.VoidKeyword]: 'void',
21
- [ts.SyntaxKind.UndefinedKeyword]: 'undefined',
22
- [ts.SyntaxKind.UnknownKeyword]: 'unknown',
23
- [ts.SyntaxKind.AnyKeyword]: 'any',
24
- [ts.SyntaxKind.ObjectKeyword]: 'object'
25
- };
26
- const anyType = 'any';
27
- const primitiveTypes = ['string', 'number', 'boolean', 'bigint', 'symbol'];
28
- const preservedTypes = [
29
- 'any',
30
- 'Promise',
31
- 'Date',
32
- 'Error',
33
- 'undefined',
34
- 'unknown',
35
- 'object',
36
- 'Map',
37
- 'Set'
38
- ];
39
- const specialTypes = ['Mappable', 'EnableReflect'];
40
- [...primitiveTypes, ...preservedTypes, ...specialTypes].forEach(registerType);
41
- specialTypes.forEach(type => interfaceDefinitions.set(type, { name: type }));
42
- let typeChecker;
43
- let parsed = false;
44
- const reflect = Reflect;
45
- // For Nodejs usage
46
- export function setupReflectTypes(filePaths_1, exclude_1) {
47
- return __awaiter(this, arguments, void 0, function* (filePaths, exclude, distFolder = process.cwd()) {
48
- distFolder = Path.resolve(distFolder);
49
- if (reflect.__classes !== undefined)
50
- return;
51
- filePaths = asArray(filePaths);
52
- parseSource(filePaths, exclude);
53
- reflect.__classes = {};
54
- for (const [className, classMeta] of classDefinitions) {
55
- reflect.__classes[className] = classMeta;
56
- }
57
- reflect.__interfaces = {};
58
- for (const [interfaceName, interfaceMeta] of interfaceDefinitions) {
59
- reflect.__interfaces[interfaceName] = interfaceMeta;
60
- }
61
- reflect.__typeAliases = {};
62
- for (const [typeAliasName, typeAliasDef] of typeAliasDefinitions) {
63
- reflect.__typeAliases[typeAliasName] = typeAliasDef;
64
- }
65
- reflect.__constTypes = {};
66
- for (const [constTypeName, constTypeDef] of constTypeDefinitions) {
67
- reflect.__constTypes[constTypeName] = constTypeDef;
68
- }
69
- yield Promise.all(filePaths.map(f => updateReflectModules(f, distFolder)));
70
- });
71
- }
72
- // For Nodejs usage
73
- // executed after setupReflectTypes
74
- export function updateReflectModules(filePath, distFolder) {
75
- return __awaiter(this, void 0, void 0, function* () {
76
- if (!fs.existsSync(filePath))
77
- return;
78
- const stat = fs.statSync(filePath);
79
- if (stat.isDirectory()) {
80
- const files = fs.readdirSync(filePath);
81
- files.forEach(file => {
82
- updateReflectModules(Path.join(filePath, file), distFolder);
83
- });
84
- return;
85
- }
86
- // && !fs.existsSync(Path.join(filePath, 'index.ts'))) return
87
- const module = yield import(Path.join(distFolder, filePath).replace(/\.ts$/, '.js'));
88
- reflect.__classDef = {};
89
- Object.values(module).forEach(exportedMember => {
90
- if (typeof exportedMember !== 'function')
91
- return;
92
- reflect.__classDef[exportedMember.name] = exportedMember;
93
- });
94
- });
95
- }
96
- // For webpack loader usage
97
- export function parseSource(filePaths, exclude) {
98
- if (!filePaths)
99
- filePaths = [process.cwd()];
100
- filePaths = asArray(filePaths);
101
- if (!parsed) {
102
- let sourceFiles = getSourceFiles(filePaths, exclude);
103
- const program = ts.createProgram(sourceFiles, {});
104
- typeChecker = program.getTypeChecker();
105
- sourceFiles = sourceFiles.map(f => getRelatedPath(f));
106
- const sourceFilesToParse = program
107
- .getSourceFiles()
108
- .filter(tsSourceFile => sourceFiles.includes(getRelatedPath(tsSourceFile.fileName)));
109
- sourceFilesToParse.forEach(file => {
110
- log(`parse file: ${file.fileName}`);
111
- parse(file);
112
- });
113
- for (const typeName of types.keys()) {
114
- if (!classDefinitions.has(typeName) &&
115
- !interfaceDefinitions.has(typeName) &&
116
- !enumDefinitions.has(typeName) &&
117
- !typeAliasDefinitions.has(typeName) &&
118
- !primitiveTypes.includes(typeName) &&
119
- !preservedTypes.includes(typeName)) {
120
- log(`remove unknown typeName: ${typeName}`);
121
- types.delete(typeName);
122
- }
123
- }
124
- Array.from(classDefinitions.values()).forEach(replaceTypeForClassDef);
125
- Array.from(interfaceDefinitions.values()).forEach(replaceTypeForInterfaceDef);
126
- [classDefinitions, interfaceDefinitions, typeAliasDefinitions].forEach(compactMapValues);
127
- parsed = true;
128
- }
129
- return {
130
- classDefinitions,
131
- interfaceDefinitions,
132
- enumDefinitions,
133
- typeAliasDefinitions,
134
- constTypeDefinitions
135
- };
136
- }
137
- function getSourceFiles(filePaths, exclude) {
138
- const tsFiles = [];
139
- filePaths.forEach(filePath => {
140
- filePath = Path.resolve(filePath);
141
- if (checkExclude(filePath, exclude)) {
142
- log(`ignore excluded ${filePath}`);
143
- return;
144
- }
145
- if (!fs.existsSync(filePath)) {
146
- console.error(`Path ${filePath} does not exist.`);
147
- return;
148
- }
149
- const stat = fs.statSync(filePath);
150
- if (stat.isFile()) {
151
- tsFiles.push(filePath);
152
- return;
153
- }
154
- const files = fs.readdirSync(filePath);
155
- files.forEach(file => tsFiles.push(...getSourceFiles([Path.join(filePath, file)], exclude)));
156
- });
157
- return tsFiles;
158
- }
159
- function parse(node) {
160
- if (ts.isClassDeclaration(node)) {
161
- // kind: 263
162
- parseClassNode(node);
163
- }
164
- else if (ts.isInterfaceDeclaration(node)) {
165
- // kind: 264
166
- parseInterfaceNode(node);
167
- }
168
- else if (ts.isEnumDeclaration(node)) {
169
- // kind: 266
170
- parseEnumNode(node);
171
- }
172
- else if (ts.isTypeAliasDeclaration(node)) {
173
- // kind: 265
174
- parseTypeAliasNode(node);
175
- }
176
- else if (ts.isConstTypeReference(node)) {
177
- // kind: 183
178
- parseConstTypeReference(node);
179
- }
180
- else {
181
- node.forEachChild(parse);
182
- }
183
- }
184
- function parseClassNode(node) {
185
- var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m;
186
- const className = textOf(node.name);
187
- if (!className)
188
- return;
189
- const superClass = textOf((_c = (_b = (_a = node.heritageClauses) === null || _a === void 0 ? void 0 : _a.find(it => it.token === ts.SyntaxKind.ExtendsKeyword)) === null || _b === void 0 ? void 0 : _b.types) === null || _c === void 0 ? void 0 : _c[0].expression);
190
- const implementations = (_e = (_d = node.heritageClauses) === null || _d === void 0 ? void 0 : _d.find(it => it.token === ts.SyntaxKind.ImplementsKeyword)) === null || _e === void 0 ? void 0 : _e.types.map(it => textOf(it.expression));
191
- const propMetas = [];
192
- const methodMetas = [];
193
- for (const member of node.members) {
194
- if (ts.isPropertyDeclaration(member)) {
195
- propMetas.push({
196
- name: textOf(member.name),
197
- isOptional: member.questionToken !== undefined,
198
- type: getCheckedType(member),
199
- isPrivate: (_f = member.modifiers) === null || _f === void 0 ? void 0 : _f.some(it => it.kind === ts.SyntaxKind.PrivateKeyword),
200
- isStatic: (_g = member.modifiers) === null || _g === void 0 ? void 0 : _g.some(it => it.kind === ts.SyntaxKind.StaticKeyword)
201
- });
202
- }
203
- else if (ts.isMethodDeclaration(member)) {
204
- methodMetas.push({
205
- name: textOf(member.name),
206
- returnType: getCheckedType(member),
207
- isPrivate: (_h = member.modifiers) === null || _h === void 0 ? void 0 : _h.some(it => it.kind === ts.SyntaxKind.PrivateKeyword),
208
- isStatic: (_j = member.modifiers) === null || _j === void 0 ? void 0 : _j.some(it => it.kind === ts.SyntaxKind.StaticKeyword),
209
- isAsync: (_k = member.modifiers) === null || _k === void 0 ? void 0 : _k.some(it => it.kind === ts.SyntaxKind.AsyncKeyword),
210
- args: member.parameters.map(p => ({
211
- name: textOf(p.name),
212
- type: getCheckedType(p),
213
- isOptional: p.questionToken !== undefined
214
- }))
215
- });
216
- }
217
- else if (ts.isGetAccessorDeclaration(member)) {
218
- let prop = propMetas.find(p => p.name === textOf(member.name));
219
- if (!prop) {
220
- prop = {
221
- name: textOf(member.name),
222
- isOptional: member.questionToken === undefined,
223
- type: getCheckedType(member)
224
- };
225
- propMetas.push(prop);
226
- }
227
- prop.accessor = prop.accessor || {};
228
- prop.accessor.getter = {
229
- isPrivate: ((_l = member.modifiers) === null || _l === void 0 ? void 0 : _l.some(it => it.kind === ts.SyntaxKind.PrivateKeyword)) || false
230
- };
231
- prop.isPrivate = prop.accessor.getter.isPrivate;
232
- }
233
- else if (ts.isSetAccessorDeclaration(member)) {
234
- let prop = propMetas.find(p => p.name === textOf(member.name));
235
- if (!prop) {
236
- prop = {
237
- name: textOf(member.name),
238
- isOptional: member.questionToken === undefined,
239
- type: getCheckedType(member)
240
- };
241
- propMetas.push(prop);
242
- }
243
- prop.accessor = prop.accessor || {};
244
- prop.accessor.setter = {
245
- isPrivate: ((_m = member.modifiers) === null || _m === void 0 ? void 0 : _m.some(it => it.kind === ts.SyntaxKind.PrivateKeyword)) || false
246
- };
247
- }
248
- }
249
- const classMeta = {
250
- name: className,
251
- superClassName: superClass,
252
- implementations,
253
- properties: propMetas,
254
- methods: methodMetas
255
- };
256
- log(`Define class: ${textOf(node.name)}`);
257
- classDefinitions.set(className, classMeta);
258
- }
259
- function parseInterfaceNode(node) {
260
- var _a, _b, _c, _d;
261
- const interfaceName = textOf(node.name);
262
- if (!interfaceName)
263
- return;
264
- const implementations = ((_b = (_a = node.heritageClauses) === null || _a === void 0 ? void 0 : _a.find(it => it.token === ts.SyntaxKind.ExtendsKeyword)) === null || _b === void 0 ? void 0 : _b.types.map(it => textOf(it.expression))) || [];
265
- const propMetas = [];
266
- const methodMetas = [];
267
- let indexElementType = undefined;
268
- for (const member of node.members) {
269
- if (ts.isPropertySignature(member)) {
270
- propMetas.push({
271
- name: textOf(member.name),
272
- isOptional: member.questionToken !== undefined,
273
- type: getCheckedType(member),
274
- isPrivate: ((_c = member.modifiers) === null || _c === void 0 ? void 0 : _c.some(it => it.kind === ts.SyntaxKind.PrivateKeyword)) || false
275
- });
276
- }
277
- else if (ts.isMethodSignature(member)) {
278
- methodMetas.push({
279
- name: member.name.text,
280
- returnType: getCheckedType(member),
281
- isPrivate: ((_d = member.modifiers) === null || _d === void 0 ? void 0 : _d.some(it => it.kind === ts.SyntaxKind.PrivateKeyword)) || false,
282
- args: member.parameters.map(p => ({
283
- name: textOf(p.name),
284
- type: getCheckedType(p),
285
- isOptional: p.questionToken !== undefined
286
- }))
287
- });
288
- }
289
- else if (ts.isIndexSignatureDeclaration(member)) {
290
- indexElementType = getCheckedType(member);
291
- }
292
- }
293
- let interfaceMeta = interfaceDefinitions.get(interfaceName);
294
- if (!interfaceMeta) {
295
- interfaceMeta = {
296
- name: interfaceName,
297
- implementations,
298
- methods: methodMetas,
299
- properties: propMetas,
300
- indexElementType
301
- };
302
- interfaceDefinitions.set(interfaceName, interfaceMeta);
303
- log(`Define interface ${textOf(node.name)}`);
304
- }
305
- else {
306
- interfaceMeta.implementations = mergeUnique(interfaceMeta.implementations || [], implementations);
307
- interfaceMeta.methods = mergeUnique(interfaceMeta.methods || [], methodMetas, (m1, m2) => m1.name === m2.name);
308
- interfaceMeta.properties = mergeUnique(interfaceMeta.properties || [], propMetas, (p1, p2) => p1.name === p2.name);
309
- interfaceMeta.indexElementType = indexElementType;
310
- log(`Merge interface ${textOf(node.name)}`);
311
- }
312
- }
313
- function parseEnumNode(node) {
314
- const enumName = textOf(node.name);
315
- if (!enumName)
316
- return;
317
- enumDefinitions.set(enumName, {
318
- name: enumName,
319
- members: node.members.map(it => {
320
- return { name: textOf(it.name), initializer: textOf(it.initializer) };
321
- })
322
- });
323
- log(`Define enum: ${textOf(node.name)}`);
324
- }
325
- function parseTypeAliasNode(node) {
326
- log(`Define typeAlias: ${textOf(node.name)}`);
327
- typeAliasDefinitions.set(textOf(node.name), getCheckedType(node));
328
- }
329
- function parseConstTypeReference(node) {
330
- const declareNode = node.parent.parent;
331
- if (ts.isVariableDeclaration(declareNode) &&
332
- declareNode.initializer &&
333
- ts.isAsExpression(declareNode.initializer)) {
334
- constTypeDefinitions.set(textOf(declareNode.name), parseExpression(declareNode.initializer.expression));
335
- }
336
- }
337
- function parseExpression(expression) {
338
- if (ts.isArrayLiteralExpression(expression)) {
339
- return parseArrayLiteralExpression(expression);
340
- }
341
- else if (ts.isObjectLiteralExpression(expression)) {
342
- return parseObjectLiteralExpression(expression);
343
- }
344
- else if (ts.isNumericLiteral(expression)) {
345
- return 'number';
346
- }
347
- else if (ts.isStringLiteral(expression)) {
348
- return 'string';
349
- }
350
- else if (ts.isBigIntLiteral(expression)) {
351
- return 'bigint';
352
- }
353
- else if ([ts.SyntaxKind.TrueKeyword, ts.SyntaxKind.FalseKeyword].includes(expression.kind)) {
354
- return 'boolean';
355
- }
356
- else {
357
- return anyType;
358
- }
359
- }
360
- function parseArrayLiteralExpression(expressions) {
361
- const unionMembers = [];
362
- expressions.elements.forEach(expression => {
363
- if (ts.isStringLiteral(expression))
364
- return unionMembers.push(textOf(expression));
365
- });
366
- if (unionMembers.length === 0)
367
- return anyType;
368
- else if (unionMembers.length === 1)
369
- return unionMembers[0];
370
- else
371
- return { unionMembers };
372
- }
373
- function parseObjectLiteralExpression(expressions) {
374
- const typeLiteralMembers = [];
375
- expressions.properties.map(property => {
376
- if (ts.isPropertyAssignment(property)) {
377
- typeLiteralMembers.push({
378
- name: textOf(property.name),
379
- type: parseExpression(property.initializer)
380
- });
381
- }
382
- else {
383
- log(`unsupported property: ${property.name}`);
384
- }
385
- });
386
- return { typeLiteralMembers };
387
- }
388
- function registerType(typeName) {
389
- types.add(typeName);
390
- }
391
- function getCheckedType(node, ignoreDeclaredType = false) {
392
- if (node.type && !ignoreDeclaredType) {
393
- return buildTypeMeta(node.type);
394
- }
395
- if (!typeChecker) {
396
- console.error(`TypeChecker not initialized!`);
397
- return anyType;
398
- }
399
- const type = typeChecker.getTypeAtLocation(node);
400
- const checkedNode = typeChecker.typeToTypeNode(type, undefined, undefined);
401
- const typeDef = buildTypeMeta(checkedNode);
402
- return typeDef;
403
- }
404
- function buildTypeMeta(type) {
405
- const result = {};
406
- if (type === undefined)
407
- return anyType;
408
- if (ts.isUnionTypeNode(type)) {
409
- //kind: 192
410
- result.unionMembers = type.types.map(buildTypeMeta);
411
- }
412
- else if (ts.isIntersectionTypeNode(type)) {
413
- // kind 193
414
- result.intersectionMembers = type.types.map(buildTypeMeta);
415
- }
416
- else if (ts.isLiteralTypeNode(type)) {
417
- // kind: 201
418
- result.literalValue = textOf(type.literal);
419
- }
420
- else if (ts.isTypeLiteralNode(type)) {
421
- // kind: 187
422
- const typeLiteralMembers = [];
423
- type.members.forEach(m => {
424
- if (ts.isPropertySignature(m)) {
425
- // kind 171
426
- typeLiteralMembers.push({
427
- name: textOf(m.name),
428
- isOptional: m.questionToken !== undefined,
429
- type: getCheckedType(m)
430
- });
431
- }
432
- else if (ts.isIndexSignatureDeclaration(m)) {
433
- // kind 181
434
- result.indexElementType = getCheckedType(m);
435
- }
436
- else {
437
- typeLiteralMembers.push({
438
- name: textOf(m.name) || '',
439
- isOptional: m.questionToken !== undefined,
440
- type: buildTypeMeta()
441
- });
442
- }
443
- });
444
- result.typeLiteralMembers = typeLiteralMembers;
445
- }
446
- else if (ts.isArrayTypeNode(type)) {
447
- // kind: 188
448
- result.arrayElementType = buildTypeMeta(type.elementType);
449
- }
450
- else if (ts.isFunctionTypeNode(type)) {
451
- // kind: 184
452
- result.isFunction = true;
453
- }
454
- else if (ts.isTypeReferenceNode(type)) {
455
- // kind: 183
456
- registerType(textOf(type.typeName));
457
- if (type.typeArguments) {
458
- result.generics = [
459
- textOf(type.typeName),
460
- ...type.typeArguments.map(arg => buildTypeMeta(arg))
461
- ];
462
- }
463
- else {
464
- return textOf(type.typeName);
465
- }
466
- }
467
- else if (ts.isIndexedAccessTypeNode(type)) {
468
- // kind: 199
469
- return getCheckedType(type, true);
470
- }
471
- else if (ts.isThisTypeNode(type)) {
472
- // kind: 197
473
- return getCheckedType(type);
474
- }
475
- else if (ts.isParenthesizedTypeNode(type)) {
476
- // kind: 196
477
- return getCheckedType(type);
478
- }
479
- else if (ts.isConditionalTypeNode(type)) {
480
- // kind: 194
481
- return getCheckedType(type);
482
- }
483
- else if (ts.isTypeQueryNode(type)) {
484
- return getCheckedType(type);
485
- // kind: 186
486
- }
487
- else if (ts.isConstructorTypeNode(type)) {
488
- // kind: 185
489
- result.isConstructor = true;
490
- }
491
- else if (ts.isTupleTypeNode(type)) {
492
- // kind: 189
493
- result.tupleMembers = type.elements.map(buildTypeMeta);
494
- }
495
- else if (Object.keys(primitiveKinds).includes(String(type.kind))) {
496
- return primitiveKinds[type.kind] || anyType;
497
- }
498
- else if (ts.isOptionalTypeNode(type)) {
499
- // kind: 190
500
- Object.assign(result, getCheckedType(type));
501
- result.isOptionalInTuple = true;
502
- }
503
- else if (ts.isNamedTupleMember(type)) {
504
- // kind: 202
505
- Object.assign(result, getCheckedType(type));
506
- }
507
- else if (ts.isTypeOperatorNode(type) && type.operator === ts.SyntaxKind.KeyOfKeyword) {
508
- // kind: 198
509
- return getCheckedType(type, true);
510
- }
511
- else {
512
- return getCheckedType(type, true);
513
- }
514
- return result;
515
- }
516
- const mergeUnique = (array1, array2, comparator) => [
517
- ...((array1 === null || array1 === void 0 ? void 0 : array1.filter(e1 => !(array2 === null || array2 === void 0 ? void 0 : array2.some(e2 => (comparator || (() => e2 === e1))(e2, e1))))) || []),
518
- ...(array2 || [])
519
- ];
520
- function replaceType(type) {
521
- if (type === undefined)
522
- return undefined;
523
- if (type === anyType)
524
- return undefined;
525
- if (typeof type === 'string')
526
- return types.has(type) ? type : undefined;
527
- return type;
528
- }
529
- function replaceTypeForClassDef(classDef) {
530
- var _a, _b;
531
- (_a = classDef.methods) === null || _a === void 0 ? void 0 : _a.forEach(replaceTypeForMethodDef);
532
- (_b = classDef.properties) === null || _b === void 0 ? void 0 : _b.forEach(replaceTypeForPropDef);
533
- }
534
- function replaceTypeForInterfaceDef(interfaceDef) {
535
- var _a, _b;
536
- (_a = interfaceDef.methods) === null || _a === void 0 ? void 0 : _a.forEach(replaceTypeForMethodDef);
537
- (_b = interfaceDef.properties) === null || _b === void 0 ? void 0 : _b.forEach(replaceTypeForPropDef);
538
- }
539
- function replaceTypeForPropDef(propDef) {
540
- propDef.type = replaceType(propDef.type);
541
- }
542
- function replaceTypeForMethodDef(methodDef) {
543
- var _a;
544
- (_a = methodDef.args) === null || _a === void 0 ? void 0 : _a.forEach(it => (it.type = replaceType(it.type)));
545
- methodDef.returnType = replaceType(methodDef.returnType);
546
- }
547
- function textOf(obj) {
548
- if (!obj)
549
- return obj;
550
- if (obj.end < 0)
551
- return obj.text;
552
- try {
553
- return ts.isQualifiedName(obj)
554
- ? textOf(obj.right)
555
- : obj.getText();
556
- }
557
- catch (_a) {
558
- return obj.text;
559
- }
560
- }
561
- function compactValue(obj) {
562
- if (!obj)
563
- return;
564
- Object.entries(obj).forEach(it => {
565
- const [prop, value] = it;
566
- if (value instanceof Array && value.length === 0) {
567
- delete obj[prop];
568
- }
569
- else if (value === false || value === undefined) {
570
- delete obj[prop];
571
- }
572
- else if (value.constructor === Array) {
573
- value.forEach(compactValue);
574
- }
575
- else if (value.constructor === Object) {
576
- compactValue(value);
577
- }
578
- });
579
- }
580
- function compactMapValues(m) {
581
- for (const v of m.values()) {
582
- compactValue(v);
583
- }
584
- }
585
- function checkExclude(filePath, exclude) {
586
- if (!exclude)
587
- return false;
588
- exclude = exclude instanceof Array ? exclude : [exclude];
589
- return exclude.some(exp => {
590
- if (!(exp instanceof RegExp)) {
591
- exp = new RegExp(exp.replace(/\./g, '\\.').replace(/\*/g, '.*'));
592
- }
593
- return filePath.match(exp);
594
- });
595
- }
596
- function getRelatedPath(filePath, baseFolder = process.cwd()) {
597
- return normalizePath(filePath).replace(normalizePath(baseFolder) + '/', '');
598
- }
599
- function normalizePath(filePath) {
600
- const sep = Path.sep;
601
- return filePath.split(sep).join('/');
602
- }
603
- function asArray(v) {
604
- return v instanceof Array ? v : [v];
605
- }
606
- function log(msg) {
607
- if (OUTPUT_LOG) {
608
- console.log(msg);
609
- }
610
- }
611
- //# sourceMappingURL=reflect-parser.js.map
1
+ var fe=Object.create;var A=Object.defineProperty;var ce=Object.getOwnPropertyDescriptor;var pe=Object.getOwnPropertyNames;var le=Object.getPrototypeOf,ue=Object.prototype.hasOwnProperty;var ye=(e,t)=>{for(var i in t)A(e,i,{get:t[i],enumerable:!0})},G=(e,t,i,s)=>{if(t&&typeof t=="object"||typeof t=="function")for(let f of pe(t))!ue.call(e,f)&&f!==i&&A(e,f,{get:()=>t[f],enumerable:!(s=ce(t,f))||s.enumerable});return e};var k=(e,t,i)=>(i=e!=null?fe(le(e)):{},G(t||!e||!e.__esModule?A(i,"default",{value:e,enumerable:!0}):i,e)),me=e=>G(A({},"__esModule",{value:!0}),e);var _=(e,t,i)=>new Promise((s,f)=>{var r=m=>{try{T(i.next(m))}catch(g){f(g)}},p=m=>{try{T(i.throw(m))}catch(g){f(g)}},T=m=>m.done?s(m.value):Promise.resolve(m.value).then(r,p);T((i=i.apply(e,t)).next())});var Ae={};ye(Ae,{parseSource:()=>ee,setupReflectTypes:()=>Te,updateReflectModules:()=>j});module.exports=me(Ae);var n=k(require("typescript"),1),R=k(require("fs"),1),v=k(require("process"),1),w=k(require("path"),1);var de=!0,K=new Map,x=new Map,C=new Map,N=new Map,I=new Map,P=new Set,Q={[n.SyntaxKind.BooleanKeyword]:"boolean",[n.SyntaxKind.StringKeyword]:"string",[n.SyntaxKind.BigIntKeyword]:"bigint",[n.SyntaxKind.NumberKeyword]:"number",[n.SyntaxKind.SymbolKeyword]:"symbol",[n.SyntaxKind.VoidKeyword]:"void",[n.SyntaxKind.UndefinedKeyword]:"undefined",[n.SyntaxKind.UnknownKeyword]:"unknown",[n.SyntaxKind.AnyKeyword]:"any",[n.SyntaxKind.ObjectKeyword]:"object"},S="any",X=["string","number","boolean","bigint","symbol"],Y=["any","Promise","Date","Error","undefined","unknown","object","Map","Set"],Z=["Mappable","EnableReflect"];[...X,...Y,...Z].forEach(se);Z.forEach(e=>x.set(e,{name:e}));var M,H=!1,d=Reflect;function Te(s,f){return _(this,arguments,function*(e,t,i=v.cwd()){if(i=w.resolve(i),d.__classes===void 0){e=oe(e),ee(e,t),d.__classes={};for(let[r,p]of K)d.__classes[r]=p;d.__interfaces={};for(let[r,p]of x)d.__interfaces[r]=p;d.__typeAliases={};for(let[r,p]of N)d.__typeAliases[r]=p;d.__constTypes={};for(let[r,p]of I)d.__constTypes[r]=p;yield Promise.all(e.map(r=>j(r,i)))}})}function j(e,t){return _(this,null,function*(){if(!R.existsSync(e))return;if(R.statSync(e).isDirectory()){R.readdirSync(e).forEach(r=>{j(w.join(e,r),t)});return}let s=yield import(w.join(t,e).replace(/\.ts$/,".js"));d.__classDef={},Object.values(s).forEach(f=>{typeof f=="function"&&(d.__classDef[f.name]=f)})})}function ee(e,t){if(e||(e=[v.cwd()]),e=oe(e),!H){let i=ne(e,t),s=n.createProgram(i,{});M=s.getTypeChecker(),i=i.map(r=>J(r)),s.getSourceFiles().filter(r=>i.includes(J(r.fileName))).forEach(r=>{D(`parse file: ${r.fileName}`),te(r)});for(let r of P.keys())!K.has(r)&&!x.has(r)&&!C.has(r)&&!N.has(r)&&!X.includes(r)&&!Y.includes(r)&&(D(`remove unknown typeName: ${r}`),P.delete(r));Array.from(K.values()).forEach(Se),Array.from(x.values()).forEach(Ke),[K,x,N].forEach(Ee),H=!0}return{classDefinitions:K,interfaceDefinitions:x,enumDefinitions:C,typeAliasDefinitions:N,constTypeDefinitions:I}}function ne(e,t){let i=[];return e.forEach(s=>{if(s=w.resolve(s),Ne(s,t)){D(`ignore excluded ${s}`);return}if(!R.existsSync(s)){console.error(`Path ${s} does not exist.`);return}if(R.statSync(s).isFile()){i.push(s);return}R.readdirSync(s).forEach(p=>i.push(...ne([w.join(s,p)],t)))}),i}function te(e){n.isClassDeclaration(e)?ge(e):n.isInterfaceDeclaration(e)?we(e):n.isEnumDeclaration(e)?De(e):n.isTypeAliasDeclaration(e)?Re(e):n.isConstTypeReference(e)?he(e):e.forEachChild(te)}function ge(e){var T,m,g,E,l,y,$,z,q,U,V,B;let t=a(e.name);if(!t)return;let i=a((g=(m=(T=e.heritageClauses)==null?void 0:T.find(o=>o.token===n.SyntaxKind.ExtendsKeyword))==null?void 0:m.types)==null?void 0:g[0].expression),s=(l=(E=e.heritageClauses)==null?void 0:E.find(o=>o.token===n.SyntaxKind.ImplementsKeyword))==null?void 0:l.types.map(o=>a(o.expression)),f=[],r=[];for(let o of e.members)if(n.isPropertyDeclaration(o))f.push({name:a(o.name),isOptional:o.questionToken!==void 0,type:u(o),isPrivate:(y=o.modifiers)==null?void 0:y.some(c=>c.kind===n.SyntaxKind.PrivateKeyword),isStatic:($=o.modifiers)==null?void 0:$.some(c=>c.kind===n.SyntaxKind.StaticKeyword)});else if(n.isMethodDeclaration(o))r.push({name:a(o.name),returnType:u(o),isPrivate:(z=o.modifiers)==null?void 0:z.some(c=>c.kind===n.SyntaxKind.PrivateKeyword),isStatic:(q=o.modifiers)==null?void 0:q.some(c=>c.kind===n.SyntaxKind.StaticKeyword),isAsync:(U=o.modifiers)==null?void 0:U.some(c=>c.kind===n.SyntaxKind.AsyncKeyword),args:o.parameters.map(c=>({name:a(c.name),type:u(c),isOptional:c.questionToken!==void 0}))});else if(n.isGetAccessorDeclaration(o)){let c=f.find(b=>b.name===a(o.name));c||(c={name:a(o.name),isOptional:o.questionToken===void 0,type:u(o)},f.push(c)),c.accessor=c.accessor||{},c.accessor.getter={isPrivate:((V=o.modifiers)==null?void 0:V.some(b=>b.kind===n.SyntaxKind.PrivateKeyword))||!1},c.isPrivate=c.accessor.getter.isPrivate}else if(n.isSetAccessorDeclaration(o)){let c=f.find(b=>b.name===a(o.name));c||(c={name:a(o.name),isOptional:o.questionToken===void 0,type:u(o)},f.push(c)),c.accessor=c.accessor||{},c.accessor.setter={isPrivate:((B=o.modifiers)==null?void 0:B.some(b=>b.kind===n.SyntaxKind.PrivateKeyword))||!1}}let p={name:t,superClassName:i,implementations:s,properties:f,methods:r};D(`Define class: ${a(e.name)}`),K.set(t,p)}function we(e){var T,m,g,E;let t=a(e.name);if(!t)return;let i=((m=(T=e.heritageClauses)==null?void 0:T.find(l=>l.token===n.SyntaxKind.ExtendsKeyword))==null?void 0:m.types.map(l=>a(l.expression)))||[],s=[],f=[],r;for(let l of e.members)n.isPropertySignature(l)?s.push({name:a(l.name),isOptional:l.questionToken!==void 0,type:u(l),isPrivate:((g=l.modifiers)==null?void 0:g.some(y=>y.kind===n.SyntaxKind.PrivateKeyword))||!1}):n.isMethodSignature(l)?f.push({name:l.name.text,returnType:u(l),isPrivate:((E=l.modifiers)==null?void 0:E.some(y=>y.kind===n.SyntaxKind.PrivateKeyword))||!1,args:l.parameters.map(y=>({name:a(y.name),type:u(y),isOptional:y.questionToken!==void 0}))}):n.isIndexSignatureDeclaration(l)&&(r=u(l));let p=x.get(t);p?(p.implementations=O(p.implementations||[],i),p.methods=O(p.methods||[],f,(l,y)=>l.name===y.name),p.properties=O(p.properties||[],s,(l,y)=>l.name===y.name),p.indexElementType=r,D(`Merge interface ${a(e.name)}`)):(p={name:t,implementations:i,methods:f,properties:s,indexElementType:r},x.set(t,p),D(`Define interface ${a(e.name)}`))}function De(e){let t=a(e.name);t&&(C.set(t,{name:t,members:e.members.map(i=>({name:a(i.name),initializer:a(i.initializer)}))}),D(`Define enum: ${a(e.name)}`))}function Re(e){D(`Define typeAlias: ${a(e.name)}`),N.set(a(e.name),u(e))}function he(e){let t=e.parent.parent;n.isVariableDeclaration(t)&&t.initializer&&n.isAsExpression(t.initializer)&&I.set(a(t.name),ie(t.initializer.expression))}function ie(e){return n.isArrayLiteralExpression(e)?xe(e):n.isObjectLiteralExpression(e)?be(e):n.isNumericLiteral(e)?"number":n.isStringLiteral(e)?"string":n.isBigIntLiteral(e)?"bigint":[n.SyntaxKind.TrueKeyword,n.SyntaxKind.FalseKeyword].includes(e.kind)?"boolean":S}function xe(e){let t=[];return e.elements.forEach(i=>{if(n.isStringLiteral(i))return t.push(a(i))}),t.length===0?S:t.length===1?t[0]:{unionMembers:t}}function be(e){let t=[];return e.properties.map(i=>{n.isPropertyAssignment(i)?t.push({name:a(i.name),type:ie(i.initializer)}):D(`unsupported property: ${i.name}`)}),{typeLiteralMembers:t}}function se(e){P.add(e)}function u(e,t=!1){if(e.type&&!t)return h(e.type);if(!M)return console.error("TypeChecker not initialized!"),S;let i=M.getTypeAtLocation(e),s=M.typeToTypeNode(i,void 0,void 0);return s?h("type"in s?s.type:s):S}function h(e){let t={};if(e===void 0)return S;if(n.isUnionTypeNode(e))t.unionMembers=e.types.map(h);else if(n.isIntersectionTypeNode(e))t.intersectionMembers=e.types.map(h);else if(n.isLiteralTypeNode(e))t.literalValue=a(e.literal);else if(n.isTypeLiteralNode(e)){let i=[];e.members.forEach(s=>{n.isPropertySignature(s)?i.push({name:a(s.name),isOptional:s.questionToken!==void 0,type:u(s)}):n.isIndexSignatureDeclaration(s)?t.indexElementType=u(s):i.push({name:a(s.name)||"",isOptional:s.questionToken!==void 0,type:h()})}),t.typeLiteralMembers=i}else if(n.isArrayTypeNode(e))t.arrayElementType=h(e.elementType);else if(n.isFunctionTypeNode(e))t.isFunction=!0;else if(n.isTypeReferenceNode(e))if(se(a(e.typeName)),e.typeArguments)t.generics=[a(e.typeName),...e.typeArguments.map(i=>h(i))];else return a(e.typeName);else{if(n.isIndexedAccessTypeNode(e))return u(e,!0);if(n.isThisTypeNode(e))return u(e);if(n.isParenthesizedTypeNode(e))return u(e);if(n.isConditionalTypeNode(e))return u(e);if(n.isTypeQueryNode(e))return u(e);if(n.isConstructorTypeNode(e))t.isConstructor=!0;else if(n.isTupleTypeNode(e))t.tupleMembers=e.elements.map(h);else{if(Object.keys(Q).includes(String(e.kind)))return Q[e.kind]||S;if(n.isOptionalTypeNode(e))Object.assign(t,u(e)),t.isOptionalInTuple=!0;else if(n.isNamedTupleMember(e))Object.assign(t,u(e));else return n.isTypeOperatorNode(e)&&e.operator===n.SyntaxKind.KeyOfKeyword,u(e,!0)}}return t}var O=(e,t,i)=>[...(e==null?void 0:e.filter(s=>!(t!=null&&t.some(f=>(i||(()=>f===s))(f,s)))))||[],...t||[]];function F(e){if(e!==void 0&&e!==S)return typeof e=="string"?P.has(e)?e:void 0:e}function Se(e){var t,i;(t=e.methods)==null||t.forEach(ae),(i=e.properties)==null||i.forEach(re)}function Ke(e){var t,i;(t=e.methods)==null||t.forEach(ae),(i=e.properties)==null||i.forEach(re)}function re(e){e.type=F(e.type)}function ae(e){var t;(t=e.args)==null||t.forEach(i=>i.type=F(i.type)),e.returnType=F(e.returnType)}function a(e){if(!e)return e;if(e.end<0)return e.text;try{return n.isQualifiedName(e)?a(e.right):e.getText()}catch(t){return e.text}}function L(e){e&&Object.entries(e).forEach(t=>{let[i,s]=t;s instanceof Array&&s.length===0||s===!1||s===void 0?delete e[i]:s.constructor===Array?s.forEach(L):s.constructor===Object&&L(s)})}function Ee(e){for(let t of e.values())L(t)}function Ne(e,t){return t?(t=t instanceof Array?t:[t],t.some(i=>(i instanceof RegExp||(i=new RegExp(i.replace(/\./g,"\\.").replace(/\*/g,".*"))),e.match(i)))):!1}function J(e,t=v.cwd()){return W(e).replace(W(t)+"/","")}function W(e){let t=w.sep;return e.split(t).join("/")}function oe(e){return e instanceof Array?e:[e]}function D(e){de&&console.log(e)}0&&(module.exports={parseSource,setupReflectTypes,updateReflectModules});
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ts-ref-kit",
3
- "version": "1.0.0",
3
+ "version": "1.0.1",
4
4
  "description": "Type reflection and validation library for TypeScript",
5
5
  "main": "dist/index.js",
6
6
  "type": "module",
@@ -20,8 +20,9 @@
20
20
  }
21
21
  },
22
22
  "scripts": {
23
- "build": "tsc",
24
- "build-parser": "tsc src/parser/reflect-parser.ts --target es2015 --module commonjs --moduleResolution node"
23
+ "gen-dts": "tsc --emitDeclarationOnly --outDir types",
24
+ "build": "node esbuild.config.js",
25
+ "build-parser": "node esbuild.parser.config.js"
25
26
  },
26
27
  "dependencies": {
27
28
  "reflect-metadata": "^0.2.2",
@@ -29,6 +30,7 @@
29
30
  },
30
31
  "devDependencies": {
31
32
  "@types/node": "^24.2.0",
33
+ "esbuild": "^0.25.9",
32
34
  "typescript": "^5.9.2",
33
35
  "vite": "^7.1.4"
34
36
  },
package/dist/index.d.ts DELETED
@@ -1,2 +0,0 @@
1
- export * from './reflect-types';
2
- export * from './reflect-json';
package/dist/index.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAA;AAC/B,cAAc,gBAAgB,CAAA"}
@@ -1,3 +0,0 @@
1
- export * from './reflect-loader';
2
- export * from './reflect-parser-plugin';
3
- export * from './reflect-parser';
@@ -1,4 +0,0 @@
1
- export * from './reflect-loader';
2
- export * from './reflect-parser-plugin';
3
- export * from './reflect-parser';
4
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/parser/index.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAC;AACjC,cAAc,yBAAyB,CAAC;AACxC,cAAc,kBAAkB,CAAC"}
@@ -1,7 +0,0 @@
1
- /**
2
- * 检查文件路径是否匹配 glob 规则
3
- * @param filePath 要检查的文件路径(绝对或相对路径)
4
- * @param pattern glob 规则,如 `/src/**\/.ts`
5
- * @returns 是否匹配
6
- */
7
- export default function isPathMatch(filePath: string, pattern: string | string[]): boolean;