@elliots/typical 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +82 -0
- package/bin/ttsc +12 -0
- package/bin/ttsx +3 -0
- package/dist/src/cli.d.ts +2 -0
- package/dist/src/cli.js +89 -0
- package/dist/src/cli.js.map +1 -0
- package/dist/src/config.d.ts +7 -0
- package/dist/src/config.js +26 -0
- package/dist/src/config.js.map +1 -0
- package/dist/src/esm-loader-register.d.ts +1 -0
- package/dist/src/esm-loader-register.js +3 -0
- package/dist/src/esm-loader-register.js.map +1 -0
- package/dist/src/esm-loader.d.ts +4 -0
- package/dist/src/esm-loader.js +25 -0
- package/dist/src/esm-loader.js.map +1 -0
- package/dist/src/file-filter.d.ts +13 -0
- package/dist/src/file-filter.js +38 -0
- package/dist/src/file-filter.js.map +1 -0
- package/dist/src/index.d.ts +2 -0
- package/dist/src/index.js +3 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/setup.d.ts +2 -0
- package/dist/src/setup.js +14 -0
- package/dist/src/setup.js.map +1 -0
- package/dist/src/transformer.d.ts +29 -0
- package/dist/src/transformer.js +472 -0
- package/dist/src/transformer.js.map +1 -0
- package/dist/src/tsc-plugin.d.ts +3 -0
- package/dist/src/tsc-plugin.js +9 -0
- package/dist/src/tsc-plugin.js.map +1 -0
- package/package.json +71 -0
- package/src/cli.ts +111 -0
- package/src/config.ts +35 -0
- package/src/esm-loader-register.ts +2 -0
- package/src/esm-loader.ts +26 -0
- package/src/file-filter.ts +44 -0
- package/src/index.ts +2 -0
- package/src/patch-fs.cjs +25 -0
- package/src/patch-tsconfig.cjs +52 -0
- package/src/setup.ts +29 -0
- package/src/transformer.ts +831 -0
- package/src/tsc-plugin.ts +12 -0
|
@@ -0,0 +1,472 @@
|
|
|
1
|
+
import ts from "typescript";
|
|
2
|
+
import { loadConfig } from "./config.js";
|
|
3
|
+
import { shouldTransformFile } from "./file-filter.js";
|
|
4
|
+
import { transform as typiaTransform } from "typia/lib/transform.js";
|
|
5
|
+
import { setupTsProgram } from "./setup.js";
|
|
6
|
+
export class TypicalTransformer {
|
|
7
|
+
config;
|
|
8
|
+
program;
|
|
9
|
+
ts;
|
|
10
|
+
typeValidators = new Map(); // type -> { validator variable name, type node }
|
|
11
|
+
typeStringifiers = new Map(); // type -> { stringifier variable name, type node }
|
|
12
|
+
typeParsers = new Map(); // type -> { parser variable name, type node }
|
|
13
|
+
constructor(config, program, tsInstance) {
|
|
14
|
+
this.config = config ?? loadConfig();
|
|
15
|
+
this.ts = tsInstance ?? ts;
|
|
16
|
+
this.program = program ?? setupTsProgram(this.ts);
|
|
17
|
+
}
|
|
18
|
+
createSourceFile(fileName, content) {
|
|
19
|
+
return this.ts.createSourceFile(fileName, content, this.ts.ScriptTarget.ES2020, true);
|
|
20
|
+
}
|
|
21
|
+
transform(sourceFile, mode) {
|
|
22
|
+
if (typeof sourceFile === "string") {
|
|
23
|
+
const file = this.program.getSourceFile(sourceFile);
|
|
24
|
+
if (!file) {
|
|
25
|
+
throw new Error(`Source file not found in program: ${sourceFile}`);
|
|
26
|
+
}
|
|
27
|
+
sourceFile = file;
|
|
28
|
+
}
|
|
29
|
+
const transformer = this.getTransformer(mode !== "basic");
|
|
30
|
+
const result = this.ts.transform(sourceFile, [transformer]);
|
|
31
|
+
const printer = this.ts.createPrinter();
|
|
32
|
+
const transformedCode = printer.printFile(result.transformed[0]);
|
|
33
|
+
result.dispose();
|
|
34
|
+
if (mode === "typia" || mode === 'basic') {
|
|
35
|
+
return transformedCode;
|
|
36
|
+
}
|
|
37
|
+
const compileResult = ts.transpileModule(transformedCode, {
|
|
38
|
+
compilerOptions: this.program.getCompilerOptions(),
|
|
39
|
+
});
|
|
40
|
+
return compileResult.outputText;
|
|
41
|
+
}
|
|
42
|
+
getTransformer(withTypia) {
|
|
43
|
+
return (context) => {
|
|
44
|
+
const factory = context.factory;
|
|
45
|
+
const typeChecker = this.program.getTypeChecker();
|
|
46
|
+
const transformContext = {
|
|
47
|
+
ts: this.ts,
|
|
48
|
+
factory,
|
|
49
|
+
context,
|
|
50
|
+
};
|
|
51
|
+
return (sourceFile) => {
|
|
52
|
+
if (process.env.DEBUG) {
|
|
53
|
+
console.log("TYPICAL: processing ", sourceFile.fileName);
|
|
54
|
+
}
|
|
55
|
+
// First apply our transformation
|
|
56
|
+
let transformedSourceFile = this.transformSourceFile(sourceFile, transformContext, typeChecker);
|
|
57
|
+
if (!withTypia) {
|
|
58
|
+
return transformedSourceFile;
|
|
59
|
+
}
|
|
60
|
+
// Then apply typia if we added typia calls
|
|
61
|
+
const printer = this.ts.createPrinter();
|
|
62
|
+
const transformedCode = printer.printFile(transformedSourceFile);
|
|
63
|
+
if (transformedCode.includes("typia.")) {
|
|
64
|
+
try {
|
|
65
|
+
// Apply typia transformation to files with typia calls
|
|
66
|
+
// Create a new source file with the transformed code, preserving original filename
|
|
67
|
+
const newSourceFile = this.ts.createSourceFile(sourceFile.fileName, // Use original filename to maintain source map references
|
|
68
|
+
transformedCode, sourceFile.languageVersion, true);
|
|
69
|
+
// Create a new program with the transformed source file so typia's type checker works
|
|
70
|
+
const compilerOptions = this.program.getCompilerOptions();
|
|
71
|
+
const originalSourceFiles = new Map();
|
|
72
|
+
for (const sf of this.program.getSourceFiles()) {
|
|
73
|
+
originalSourceFiles.set(sf.fileName, sf);
|
|
74
|
+
}
|
|
75
|
+
// Replace the original source file with the transformed one
|
|
76
|
+
originalSourceFiles.set(sourceFile.fileName, newSourceFile);
|
|
77
|
+
const customHost = {
|
|
78
|
+
getSourceFile: (fileName, languageVersion) => {
|
|
79
|
+
if (originalSourceFiles.has(fileName)) {
|
|
80
|
+
return originalSourceFiles.get(fileName);
|
|
81
|
+
}
|
|
82
|
+
return this.ts.createSourceFile(fileName, this.ts.sys.readFile(fileName) || "", languageVersion, true);
|
|
83
|
+
},
|
|
84
|
+
getDefaultLibFileName: () => this.ts.getDefaultLibFilePath(compilerOptions),
|
|
85
|
+
writeFile: () => { },
|
|
86
|
+
getCurrentDirectory: () => this.ts.sys.getCurrentDirectory(),
|
|
87
|
+
getCanonicalFileName: (fileName) => this.ts.sys.useCaseSensitiveFileNames ? fileName : fileName.toLowerCase(),
|
|
88
|
+
useCaseSensitiveFileNames: () => this.ts.sys.useCaseSensitiveFileNames,
|
|
89
|
+
getNewLine: () => this.ts.sys.newLine,
|
|
90
|
+
fileExists: (fileName) => originalSourceFiles.has(fileName) || this.ts.sys.fileExists(fileName),
|
|
91
|
+
readFile: (fileName) => this.ts.sys.readFile(fileName),
|
|
92
|
+
};
|
|
93
|
+
const newProgram = this.ts.createProgram(Array.from(originalSourceFiles.keys()), compilerOptions, customHost);
|
|
94
|
+
// Create typia transformer with the NEW program that has the transformed source
|
|
95
|
+
const typiaTransformer = typiaTransform(newProgram, {}, {
|
|
96
|
+
addDiagnostic(diag) {
|
|
97
|
+
console.warn("Typia diagnostic:", diag);
|
|
98
|
+
return 0;
|
|
99
|
+
},
|
|
100
|
+
});
|
|
101
|
+
// Apply the transformer with source map preservation
|
|
102
|
+
const transformationResult = this.ts.transform(newSourceFile, [typiaTransformer], { ...compilerOptions, sourceMap: true });
|
|
103
|
+
if (transformationResult.transformed.length > 0) {
|
|
104
|
+
const finalTransformed = transformationResult.transformed[0];
|
|
105
|
+
transformedSourceFile = finalTransformed;
|
|
106
|
+
// Typia transformation completed successfully
|
|
107
|
+
}
|
|
108
|
+
transformationResult.dispose();
|
|
109
|
+
}
|
|
110
|
+
catch (error) {
|
|
111
|
+
console.warn("Failed to apply typia transformer:", sourceFile.fileName, error);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
return transformedSourceFile;
|
|
115
|
+
};
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Transform a single source file with TypeScript AST
|
|
120
|
+
*/
|
|
121
|
+
transformSourceFile(sourceFile, ctx, typeChecker) {
|
|
122
|
+
const { ts } = ctx;
|
|
123
|
+
// Check if this file should be transformed
|
|
124
|
+
if (!this.shouldTransformFile(sourceFile.fileName)) {
|
|
125
|
+
return sourceFile; // Return unchanged for excluded files
|
|
126
|
+
}
|
|
127
|
+
// Check if this file has already been transformed by us
|
|
128
|
+
const sourceText = sourceFile.getFullText();
|
|
129
|
+
if (sourceText.includes('__typical_assert_') || sourceText.includes('__typical_stringify_') || sourceText.includes('__typical_parse_')) {
|
|
130
|
+
throw new Error(`File ${sourceFile.fileName} has already been transformed by Typical! Double transformation detected.`);
|
|
131
|
+
}
|
|
132
|
+
// Reset caches for each file
|
|
133
|
+
this.typeValidators.clear();
|
|
134
|
+
this.typeStringifiers.clear();
|
|
135
|
+
this.typeParsers.clear();
|
|
136
|
+
let needsTypiaImport = false;
|
|
137
|
+
const visit = (node) => {
|
|
138
|
+
// Transform JSON calls first (before they get wrapped in functions)
|
|
139
|
+
if (ts.isCallExpression(node) &&
|
|
140
|
+
ts.isPropertyAccessExpression(node.expression)) {
|
|
141
|
+
const propertyAccess = node.expression;
|
|
142
|
+
if (ts.isIdentifier(propertyAccess.expression) &&
|
|
143
|
+
propertyAccess.expression.text === "JSON") {
|
|
144
|
+
needsTypiaImport = true;
|
|
145
|
+
if (propertyAccess.name.text === "stringify") {
|
|
146
|
+
// For stringify, we need to infer the type from the argument
|
|
147
|
+
if (this.config.reusableValidators) {
|
|
148
|
+
// For JSON.stringify, try to infer the type from the argument
|
|
149
|
+
let typeText = "unknown";
|
|
150
|
+
let typeNodeForCache;
|
|
151
|
+
if (node.arguments.length > 0) {
|
|
152
|
+
const arg = node.arguments[0];
|
|
153
|
+
// Check if it's a type assertion
|
|
154
|
+
if (ts.isAsExpression(arg)) {
|
|
155
|
+
// For type assertions, use the asserted type directly
|
|
156
|
+
const assertedType = arg.type;
|
|
157
|
+
const objectType = typeChecker.getTypeFromTypeNode(assertedType);
|
|
158
|
+
const typeNode = assertedType;
|
|
159
|
+
if (typeNode) {
|
|
160
|
+
const typeString = typeChecker.typeToString(objectType);
|
|
161
|
+
typeText = `Asserted_${typeString.replace(/[^a-zA-Z0-9_]/g, "_")}`;
|
|
162
|
+
typeNodeForCache = typeNode;
|
|
163
|
+
}
|
|
164
|
+
else {
|
|
165
|
+
typeText = "unknown";
|
|
166
|
+
typeNodeForCache = ctx.factory.createKeywordTypeNode(ctx.ts.SyntaxKind.UnknownKeyword);
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
else if (ts.isObjectLiteralExpression(arg)) {
|
|
170
|
+
// For object literals, use the type checker to get the actual type
|
|
171
|
+
const objectType = typeChecker.getTypeAtLocation(arg);
|
|
172
|
+
const typeNode = typeChecker.typeToTypeNode(objectType, arg, ts.NodeBuilderFlags.InTypeAlias);
|
|
173
|
+
if (typeNode) {
|
|
174
|
+
const propNames = arg.properties
|
|
175
|
+
.map((prop) => {
|
|
176
|
+
if (ts.isShorthandPropertyAssignment(prop)) {
|
|
177
|
+
return prop.name.text;
|
|
178
|
+
}
|
|
179
|
+
else if (ts.isPropertyAssignment(prop) &&
|
|
180
|
+
ts.isIdentifier(prop.name)) {
|
|
181
|
+
return prop.name.text;
|
|
182
|
+
}
|
|
183
|
+
return "unknown";
|
|
184
|
+
})
|
|
185
|
+
.sort()
|
|
186
|
+
.join("_");
|
|
187
|
+
typeText = `ObjectLiteral_${propNames}`;
|
|
188
|
+
typeNodeForCache = typeNode;
|
|
189
|
+
}
|
|
190
|
+
else {
|
|
191
|
+
// typeText = "unknown";
|
|
192
|
+
// typeNodeForCache = ctx.factory.createKeywordTypeNode(
|
|
193
|
+
// ctx.ts.SyntaxKind.UnknownKeyword
|
|
194
|
+
// );
|
|
195
|
+
throw new Error('unknown type node for object literal: ' + arg.getText());
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
else {
|
|
199
|
+
// For other expressions, try to get the type from the type checker
|
|
200
|
+
const argType = typeChecker.getTypeAtLocation(arg);
|
|
201
|
+
const typeNode = typeChecker.typeToTypeNode(argType, arg, ts.NodeBuilderFlags.InTypeAlias);
|
|
202
|
+
if (typeNode) {
|
|
203
|
+
const typeString = typeChecker.typeToString(argType);
|
|
204
|
+
typeText = `Expression_${typeString.replace(/[^a-zA-Z0-9_]/g, "_")}`;
|
|
205
|
+
typeNodeForCache = typeNode;
|
|
206
|
+
}
|
|
207
|
+
else {
|
|
208
|
+
typeText = "unknown";
|
|
209
|
+
typeNodeForCache = ctx.factory.createKeywordTypeNode(ctx.ts.SyntaxKind.UnknownKeyword);
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
const stringifierName = this.getOrCreateStringifier(typeText, typeNodeForCache);
|
|
214
|
+
const newCall = ctx.factory.createCallExpression(ctx.factory.createIdentifier(stringifierName), undefined, node.arguments);
|
|
215
|
+
return newCall;
|
|
216
|
+
}
|
|
217
|
+
else {
|
|
218
|
+
// Use inline typia.json.stringify
|
|
219
|
+
return ctx.factory.updateCallExpression(node, ctx.factory.createPropertyAccessExpression(ctx.factory.createPropertyAccessExpression(ctx.factory.createIdentifier("typia"), "json"), "stringify"), node.typeArguments, node.arguments);
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
else if (propertyAccess.name.text === "parse") {
|
|
223
|
+
// For JSON.parse, we need to infer the expected type from context
|
|
224
|
+
// Check if this is part of a variable declaration or type assertion
|
|
225
|
+
let targetType;
|
|
226
|
+
// Look for type annotations in parent nodes
|
|
227
|
+
let parent = node.parent;
|
|
228
|
+
while (parent) {
|
|
229
|
+
if (ts.isVariableDeclaration(parent) && parent.type) {
|
|
230
|
+
targetType = parent.type;
|
|
231
|
+
break;
|
|
232
|
+
}
|
|
233
|
+
else if (ts.isAsExpression(parent)) {
|
|
234
|
+
targetType = parent.type;
|
|
235
|
+
break;
|
|
236
|
+
}
|
|
237
|
+
else if (ts.isReturnStatement(parent)) {
|
|
238
|
+
// Look for function return type
|
|
239
|
+
let funcParent = parent.parent;
|
|
240
|
+
while (funcParent) {
|
|
241
|
+
if ((ts.isFunctionDeclaration(funcParent) ||
|
|
242
|
+
ts.isArrowFunction(funcParent) ||
|
|
243
|
+
ts.isMethodDeclaration(funcParent)) &&
|
|
244
|
+
funcParent.type) {
|
|
245
|
+
targetType = funcParent.type;
|
|
246
|
+
break;
|
|
247
|
+
}
|
|
248
|
+
funcParent = funcParent.parent;
|
|
249
|
+
}
|
|
250
|
+
break;
|
|
251
|
+
}
|
|
252
|
+
parent = parent.parent;
|
|
253
|
+
}
|
|
254
|
+
if (this.config.reusableValidators && targetType) {
|
|
255
|
+
// Use reusable parser - use typeToString
|
|
256
|
+
const targetTypeObj = typeChecker.getTypeFromTypeNode(targetType);
|
|
257
|
+
const typeText = typeChecker.typeToString(targetTypeObj);
|
|
258
|
+
const parserName = this.getOrCreateParser(typeText, targetType);
|
|
259
|
+
const newCall = ctx.factory.createCallExpression(ctx.factory.createIdentifier(parserName), undefined, node.arguments);
|
|
260
|
+
return newCall;
|
|
261
|
+
}
|
|
262
|
+
else {
|
|
263
|
+
// Use inline typia.json.assertParse
|
|
264
|
+
const typeArguments = targetType
|
|
265
|
+
? [targetType]
|
|
266
|
+
: node.typeArguments;
|
|
267
|
+
return ctx.factory.updateCallExpression(node, ctx.factory.createPropertyAccessExpression(ctx.factory.createPropertyAccessExpression(ctx.factory.createIdentifier("typia"), "json"), "assertParse"), typeArguments, node.arguments);
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
// Transform function declarations
|
|
273
|
+
if (ts.isFunctionDeclaration(node)) {
|
|
274
|
+
needsTypiaImport = true;
|
|
275
|
+
return transformFunction(node);
|
|
276
|
+
}
|
|
277
|
+
// Transform arrow functions
|
|
278
|
+
if (ts.isArrowFunction(node)) {
|
|
279
|
+
needsTypiaImport = true;
|
|
280
|
+
return transformFunction(node);
|
|
281
|
+
}
|
|
282
|
+
// Transform method declarations
|
|
283
|
+
if (ts.isMethodDeclaration(node)) {
|
|
284
|
+
needsTypiaImport = true;
|
|
285
|
+
return transformFunction(node);
|
|
286
|
+
}
|
|
287
|
+
return ctx.ts.visitEachChild(node, visit, ctx.context);
|
|
288
|
+
};
|
|
289
|
+
const transformFunction = (func) => {
|
|
290
|
+
const body = func.body;
|
|
291
|
+
if (!body || !ts.isBlock(body))
|
|
292
|
+
return func;
|
|
293
|
+
// Add parameter validation
|
|
294
|
+
const validationStatements = [];
|
|
295
|
+
func.parameters.forEach((param) => {
|
|
296
|
+
if (param.type) {
|
|
297
|
+
const paramName = ts.isIdentifier(param.name)
|
|
298
|
+
? param.name.text
|
|
299
|
+
: "param";
|
|
300
|
+
const paramIdentifier = ctx.factory.createIdentifier(paramName);
|
|
301
|
+
if (this.config.reusableValidators) {
|
|
302
|
+
// Use reusable validators - use typeToString
|
|
303
|
+
const paramType = typeChecker.getTypeFromTypeNode(param.type);
|
|
304
|
+
const typeText = typeChecker.typeToString(paramType);
|
|
305
|
+
const validatorName = this.getOrCreateValidator(typeText, param.type);
|
|
306
|
+
const validatorCall = ctx.factory.createCallExpression(ctx.factory.createIdentifier(validatorName), undefined, [paramIdentifier]);
|
|
307
|
+
const assertCall = ctx.factory.createExpressionStatement(validatorCall);
|
|
308
|
+
validationStatements.push(assertCall);
|
|
309
|
+
}
|
|
310
|
+
else {
|
|
311
|
+
// Use inline typia.assert calls
|
|
312
|
+
const typiaIdentifier = ctx.factory.createIdentifier("typia");
|
|
313
|
+
const assertIdentifier = ctx.factory.createIdentifier("assert");
|
|
314
|
+
const propertyAccess = ctx.factory.createPropertyAccessExpression(typiaIdentifier, assertIdentifier);
|
|
315
|
+
const callExpression = ctx.factory.createCallExpression(propertyAccess, [param.type], [paramIdentifier]);
|
|
316
|
+
const assertCall = ctx.factory.createExpressionStatement(callExpression);
|
|
317
|
+
validationStatements.push(assertCall);
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
});
|
|
321
|
+
// First visit all child nodes (including JSON calls) before adding validation
|
|
322
|
+
const visitedBody = ctx.ts.visitNode(body, visit);
|
|
323
|
+
// Transform return statements - use explicit type or infer from type checker
|
|
324
|
+
let transformedStatements = visitedBody.statements;
|
|
325
|
+
let returnType = func.type;
|
|
326
|
+
// If no explicit return type, try to infer it from the type checker
|
|
327
|
+
let returnTypeForString;
|
|
328
|
+
if (!returnType) {
|
|
329
|
+
const signature = typeChecker.getSignatureFromDeclaration(func);
|
|
330
|
+
if (signature) {
|
|
331
|
+
const inferredReturnType = typeChecker.getReturnTypeOfSignature(signature);
|
|
332
|
+
returnType = typeChecker.typeToTypeNode(inferredReturnType, func, ts.NodeBuilderFlags.InTypeAlias);
|
|
333
|
+
returnTypeForString = inferredReturnType;
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
else {
|
|
337
|
+
// For explicit return types, get the Type from the TypeNode
|
|
338
|
+
returnTypeForString = typeChecker.getTypeFromTypeNode(returnType);
|
|
339
|
+
}
|
|
340
|
+
if (returnType && returnTypeForString) {
|
|
341
|
+
const returnTransformer = (node) => {
|
|
342
|
+
if (ts.isReturnStatement(node) && node.expression) {
|
|
343
|
+
if (this.config.reusableValidators) {
|
|
344
|
+
// Use reusable validators - always use typeToString
|
|
345
|
+
const returnTypeText = typeChecker.typeToString(returnTypeForString);
|
|
346
|
+
const validatorName = this.getOrCreateValidator(returnTypeText, returnType);
|
|
347
|
+
const validatorCall = ctx.factory.createCallExpression(ctx.factory.createIdentifier(validatorName), undefined, [node.expression]);
|
|
348
|
+
return ctx.factory.updateReturnStatement(node, validatorCall);
|
|
349
|
+
}
|
|
350
|
+
else {
|
|
351
|
+
// Use inline typia.assert calls
|
|
352
|
+
const typiaIdentifier = ctx.factory.createIdentifier("typia");
|
|
353
|
+
const assertIdentifier = ctx.factory.createIdentifier("assert");
|
|
354
|
+
const propertyAccess = ctx.factory.createPropertyAccessExpression(typiaIdentifier, assertIdentifier);
|
|
355
|
+
const callExpression = ctx.factory.createCallExpression(propertyAccess, [returnType], [node.expression]);
|
|
356
|
+
return ctx.factory.updateReturnStatement(node, callExpression);
|
|
357
|
+
}
|
|
358
|
+
}
|
|
359
|
+
return ctx.ts.visitEachChild(node, returnTransformer, ctx.context);
|
|
360
|
+
};
|
|
361
|
+
transformedStatements = ctx.ts.visitNodes(visitedBody.statements, returnTransformer);
|
|
362
|
+
}
|
|
363
|
+
// Insert validation statements at the beginning
|
|
364
|
+
const newStatements = ctx.factory.createNodeArray([
|
|
365
|
+
...validationStatements,
|
|
366
|
+
...transformedStatements,
|
|
367
|
+
]);
|
|
368
|
+
const newBody = ctx.factory.updateBlock(visitedBody, newStatements);
|
|
369
|
+
if (ts.isFunctionDeclaration(func)) {
|
|
370
|
+
return ctx.factory.updateFunctionDeclaration(func, func.modifiers, func.asteriskToken, func.name, func.typeParameters, func.parameters, func.type, newBody);
|
|
371
|
+
}
|
|
372
|
+
else if (ts.isArrowFunction(func)) {
|
|
373
|
+
return ctx.factory.updateArrowFunction(func, func.modifiers, func.typeParameters, func.parameters, func.type, func.equalsGreaterThanToken, newBody);
|
|
374
|
+
}
|
|
375
|
+
else if (ts.isMethodDeclaration(func)) {
|
|
376
|
+
return ctx.factory.updateMethodDeclaration(func, func.modifiers, func.asteriskToken, func.name, func.questionToken, func.typeParameters, func.parameters, func.type, newBody);
|
|
377
|
+
}
|
|
378
|
+
return func;
|
|
379
|
+
};
|
|
380
|
+
let transformedSourceFile = ctx.ts.visitNode(sourceFile, visit);
|
|
381
|
+
// Add typia import and validator statements if needed
|
|
382
|
+
if (needsTypiaImport) {
|
|
383
|
+
transformedSourceFile = this.addTypiaImport(transformedSourceFile, ctx);
|
|
384
|
+
// Add validator statements after imports (only if using reusable validators)
|
|
385
|
+
if (this.config.reusableValidators) {
|
|
386
|
+
const validatorStmts = this.createValidatorStatements(ctx);
|
|
387
|
+
if (validatorStmts.length > 0) {
|
|
388
|
+
const importStatements = transformedSourceFile.statements.filter(ctx.ts.isImportDeclaration);
|
|
389
|
+
const otherStatements = transformedSourceFile.statements.filter((stmt) => !ctx.ts.isImportDeclaration(stmt));
|
|
390
|
+
const newStatements = ctx.factory.createNodeArray([
|
|
391
|
+
...importStatements,
|
|
392
|
+
...validatorStmts,
|
|
393
|
+
...otherStatements,
|
|
394
|
+
]);
|
|
395
|
+
transformedSourceFile = ctx.factory.updateSourceFile(transformedSourceFile, newStatements);
|
|
396
|
+
}
|
|
397
|
+
}
|
|
398
|
+
}
|
|
399
|
+
return transformedSourceFile;
|
|
400
|
+
}
|
|
401
|
+
shouldTransformFile(fileName) {
|
|
402
|
+
return shouldTransformFile(fileName, this.config);
|
|
403
|
+
}
|
|
404
|
+
addTypiaImport(sourceFile, ctx) {
|
|
405
|
+
const { factory } = ctx;
|
|
406
|
+
const existingImports = sourceFile.statements.filter(ctx.ts.isImportDeclaration);
|
|
407
|
+
const hasTypiaImport = existingImports.some((imp) => imp.moduleSpecifier &&
|
|
408
|
+
ctx.ts.isStringLiteral(imp.moduleSpecifier) &&
|
|
409
|
+
imp.moduleSpecifier.text === "typia");
|
|
410
|
+
if (!hasTypiaImport) {
|
|
411
|
+
const typiaImport = factory.createImportDeclaration(undefined, factory.createImportClause(false, factory.createIdentifier("typia"), undefined), factory.createStringLiteral("typia"));
|
|
412
|
+
const newSourceFile = factory.updateSourceFile(sourceFile, factory.createNodeArray([typiaImport, ...sourceFile.statements]));
|
|
413
|
+
return newSourceFile;
|
|
414
|
+
}
|
|
415
|
+
return sourceFile;
|
|
416
|
+
}
|
|
417
|
+
getOrCreateValidator(typeText, typeNode) {
|
|
418
|
+
if (this.typeValidators.has(typeText)) {
|
|
419
|
+
return this.typeValidators.get(typeText).name;
|
|
420
|
+
}
|
|
421
|
+
const validatorName = `__typical_assert_${this.typeValidators.size}`;
|
|
422
|
+
this.typeValidators.set(typeText, { name: validatorName, typeNode });
|
|
423
|
+
return validatorName;
|
|
424
|
+
}
|
|
425
|
+
getOrCreateStringifier(typeText, typeNode) {
|
|
426
|
+
if (this.typeStringifiers.has(typeText)) {
|
|
427
|
+
return this.typeStringifiers.get(typeText).name;
|
|
428
|
+
}
|
|
429
|
+
const stringifierName = `__typical_stringify_${this.typeStringifiers.size}`;
|
|
430
|
+
this.typeStringifiers.set(typeText, { name: stringifierName, typeNode });
|
|
431
|
+
return stringifierName;
|
|
432
|
+
}
|
|
433
|
+
getOrCreateParser(typeText, typeNode) {
|
|
434
|
+
if (this.typeParsers.has(typeText)) {
|
|
435
|
+
return this.typeParsers.get(typeText).name;
|
|
436
|
+
}
|
|
437
|
+
const parserName = `__typical_parse_${this.typeParsers.size}`;
|
|
438
|
+
this.typeParsers.set(typeText, { name: parserName, typeNode });
|
|
439
|
+
return parserName;
|
|
440
|
+
}
|
|
441
|
+
createValidatorStatements(ctx) {
|
|
442
|
+
const { factory } = ctx;
|
|
443
|
+
const statements = [];
|
|
444
|
+
// Create assert validators
|
|
445
|
+
for (const [, { name: validatorName, typeNode }] of this.typeValidators) {
|
|
446
|
+
const createAssertCall = factory.createCallExpression(factory.createPropertyAccessExpression(factory.createIdentifier("typia"), "createAssert"), [typeNode], []);
|
|
447
|
+
const validatorDeclaration = factory.createVariableStatement(undefined, factory.createVariableDeclarationList([
|
|
448
|
+
factory.createVariableDeclaration(validatorName, undefined, undefined, createAssertCall),
|
|
449
|
+
], ctx.ts.NodeFlags.Const));
|
|
450
|
+
statements.push(validatorDeclaration);
|
|
451
|
+
}
|
|
452
|
+
// Create stringifiers
|
|
453
|
+
for (const [, { name: stringifierName, typeNode }] of this
|
|
454
|
+
.typeStringifiers) {
|
|
455
|
+
const createStringifyCall = factory.createCallExpression(factory.createPropertyAccessExpression(factory.createPropertyAccessExpression(factory.createIdentifier("typia"), "json"), "createStringify"), [typeNode], []);
|
|
456
|
+
const stringifierDeclaration = factory.createVariableStatement(undefined, factory.createVariableDeclarationList([
|
|
457
|
+
factory.createVariableDeclaration(stringifierName, undefined, undefined, createStringifyCall),
|
|
458
|
+
], ctx.ts.NodeFlags.Const));
|
|
459
|
+
statements.push(stringifierDeclaration);
|
|
460
|
+
}
|
|
461
|
+
// Create parsers
|
|
462
|
+
for (const [, { name: parserName, typeNode }] of this.typeParsers) {
|
|
463
|
+
const createParseCall = factory.createCallExpression(factory.createPropertyAccessExpression(factory.createPropertyAccessExpression(factory.createIdentifier("typia"), "json"), "createAssertParse"), [typeNode], []);
|
|
464
|
+
const parserDeclaration = factory.createVariableStatement(undefined, factory.createVariableDeclarationList([
|
|
465
|
+
factory.createVariableDeclaration(parserName, undefined, undefined, createParseCall),
|
|
466
|
+
], ctx.ts.NodeFlags.Const));
|
|
467
|
+
statements.push(parserDeclaration);
|
|
468
|
+
}
|
|
469
|
+
return statements;
|
|
470
|
+
}
|
|
471
|
+
}
|
|
472
|
+
//# sourceMappingURL=transformer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transformer.js","sourceRoot":"","sources":["../../src/transformer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,YAAY,CAAC;AAC5B,OAAO,EAAE,UAAU,EAAiB,MAAM,aAAa,CAAC;AACxD,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAEvD,OAAO,EAAE,SAAS,IAAI,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACrE,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAQ5C,MAAM,OAAO,kBAAkB;IACtB,MAAM,CAAgB;IACrB,OAAO,CAAa;IACpB,EAAE,CAAY;IACd,cAAc,GAAG,IAAI,GAAG,EAG7B,CAAC,CAAC,iDAAiD;IAC9C,gBAAgB,GAAG,IAAI,GAAG,EAG/B,CAAC,CAAC,mDAAmD;IAChD,WAAW,GAAG,IAAI,GAAG,EAG1B,CAAC,CAAC,8CAA8C;IAEnD,YACE,MAAsB,EACtB,OAAoB,EACpB,UAAsB;QAEtB,IAAI,CAAC,MAAM,GAAG,MAAM,IAAI,UAAU,EAAE,CAAC;QACrC,IAAI,CAAC,EAAE,GAAG,UAAU,IAAI,EAAE,CAAC;QAC3B,IAAI,CAAC,OAAO,GAAG,OAAO,IAAI,cAAc,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACpD,CAAC;IAEM,gBAAgB,CAAC,QAAgB,EAAE,OAAe;QACvD,OAAO,IAAI,CAAC,EAAE,CAAC,gBAAgB,CAC7B,QAAQ,EACR,OAAO,EACP,IAAI,CAAC,EAAE,CAAC,YAAY,CAAC,MAAM,EAC3B,IAAI,CACL,CAAC;IACJ,CAAC;IAEM,SAAS,CACd,UAAkC,EAClC,IAA8B;QAE9B,IAAI,OAAO,UAAU,KAAK,QAAQ,EAAE,CAAC;YACnC,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC;YACpD,IAAI,CAAC,IAAI,EAAE,CAAC;gBACV,MAAM,IAAI,KAAK,CAAC,qCAAqC,UAAU,EAAE,CAAC,CAAC;YACrE,CAAC;YACD,UAAU,GAAG,IAAI,CAAC;QACpB,CAAC;QAED,MAAM,WAAW,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC;QAC1D,MAAM,MAAM,GAAG,IAAI,CAAC,EAAE,CAAC,SAAS,CAAC,UAAU,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC;QAC5D,MAAM,OAAO,GAAG,IAAI,CAAC,EAAE,CAAC,aAAa,EAAE,CAAC;QACxC,MAAM,eAAe,GAAG,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;QACjE,MAAM,CAAC,OAAO,EAAE,CAAC;QAEjB,IAAI,IAAI,KAAK,OAAO,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;YACzC,OAAO,eAAe,CAAC;QACzB,CAAC;QAED,MAAM,aAAa,GAAG,EAAE,CAAC,eAAe,CAAC,eAAe,EAAE;YACxD,eAAe,EAAE,IAAI,CAAC,OAAO,CAAC,kBAAkB,EAAE;SACnD,CAAC,CAAC;QAEH,OAAO,aAAa,CAAC,UAAU,CAAC;IAClC,CAAC;IAEM,cAAc,CACnB,SAAkB;QAElB,OAAO,CAAC,OAAiC,EAAE,EAAE;YAC3C,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;YAChC,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,cAAc,EAAE,CAAC;YAClD,MAAM,gBAAgB,GAAqB;gBACzC,EAAE,EAAE,IAAI,CAAC,EAAE;gBACX,OAAO;gBACP,OAAO;aACR,CAAC;YAEF,OAAO,CAAC,UAAyB,EAAE,EAAE;gBAEnC,IAAI,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC;oBACtB,OAAO,CAAC,GAAG,CAAC,sBAAsB,EAAE,UAAU,CAAC,QAAQ,CAAC,CAAC;gBAC3D,CAAC;gBACD,iCAAiC;gBACjC,IAAI,qBAAqB,GAAG,IAAI,CAAC,mBAAmB,CAClD,UAAU,EACV,gBAAgB,EAChB,WAAW,CACZ,CAAC;gBAEF,IAAI,CAAC,SAAS,EAAE,CAAC;oBACf,OAAO,qBAAqB,CAAC;gBAC/B,CAAC;gBAED,2CAA2C;gBAC3C,MAAM,OAAO,GAAG,IAAI,CAAC,EAAE,CAAC,aAAa,EAAE,CAAC;gBACxC,MAAM,eAAe,GAAG,OAAO,CAAC,SAAS,CAAC,qBAAqB,CAAC,CAAC;gBAEjE,IAAI,eAAe,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;oBACvC,IAAI,CAAC;wBACH,uDAAuD;wBAEvD,mFAAmF;wBACnF,MAAM,aAAa,GAAG,IAAI,CAAC,EAAE,CAAC,gBAAgB,CAC5C,UAAU,CAAC,QAAQ,EAAE,0DAA0D;wBAC/E,eAAe,EACf,UAAU,CAAC,eAAe,EAC1B,IAAI,CACL,CAAC;wBAEF,sFAAsF;wBACtF,MAAM,eAAe,GAAG,IAAI,CAAC,OAAO,CAAC,kBAAkB,EAAE,CAAC;wBAC1D,MAAM,mBAAmB,GAAG,IAAI,GAAG,EAAyB,CAAC;wBAC7D,KAAK,MAAM,EAAE,IAAI,IAAI,CAAC,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC;4BAC/C,mBAAmB,CAAC,GAAG,CAAC,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;wBAC3C,CAAC;wBACD,4DAA4D;wBAC5D,mBAAmB,CAAC,GAAG,CAAC,UAAU,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;wBAE5D,MAAM,UAAU,GAAoB;4BAClC,aAAa,EAAE,CAAC,QAAQ,EAAE,eAAe,EAAE,EAAE;gCAC3C,IAAI,mBAAmB,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;oCACtC,OAAO,mBAAmB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;gCAC3C,CAAC;gCACD,OAAO,IAAI,CAAC,EAAE,CAAC,gBAAgB,CAC7B,QAAQ,EACR,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,EAAE,EACpC,eAAe,EACf,IAAI,CACL,CAAC;4BACJ,CAAC;4BACD,qBAAqB,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,qBAAqB,CAAC,eAAe,CAAC;4BAC3E,SAAS,EAAE,GAAG,EAAE,GAAE,CAAC;4BACnB,mBAAmB,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,mBAAmB,EAAE;4BAC5D,oBAAoB,EAAE,CAAC,QAAQ,EAAE,EAAE,CACjC,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,WAAW,EAAE;4BAC3E,yBAAyB,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,yBAAyB;4BACtE,UAAU,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,OAAO;4BACrC,UAAU,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC,mBAAmB,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,UAAU,CAAC,QAAQ,CAAC;4BAC/F,QAAQ,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC;yBACvD,CAAC;wBAEF,MAAM,UAAU,GAAG,IAAI,CAAC,EAAE,CAAC,aAAa,CACtC,KAAK,CAAC,IAAI,CAAC,mBAAmB,CAAC,IAAI,EAAE,CAAC,EACtC,eAAe,EACf,UAAU,CACX,CAAC;wBAEF,gFAAgF;wBAChF,MAAM,gBAAgB,GAAG,cAAc,CACrC,UAAU,EACV,EAAE,EACF;4BACE,aAAa,CAAC,IAAmB;gCAC/B,OAAO,CAAC,IAAI,CAAC,mBAAmB,EAAE,IAAI,CAAC,CAAC;gCACxC,OAAO,CAAC,CAAC;4BACX,CAAC;yBACF,CACF,CAAC;wBAEF,qDAAqD;wBACrD,MAAM,oBAAoB,GAAG,IAAI,CAAC,EAAE,CAAC,SAAS,CAC5C,aAAa,EACb,CAAC,gBAAgB,CAAC,EAClB,EAAE,GAAG,eAAe,EAAE,SAAS,EAAE,IAAI,EAAE,CACxC,CAAC;wBAEF,IAAI,oBAAoB,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;4BAChD,MAAM,gBAAgB,GAAG,oBAAoB,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;4BAC7D,qBAAqB,GAAG,gBAAgB,CAAC;4BAEzC,8CAA8C;wBAChD,CAAC;wBAED,oBAAoB,CAAC,OAAO,EAAE,CAAC;oBACjC,CAAC;oBAAC,OAAO,KAAK,EAAE,CAAC;wBACf,OAAO,CAAC,IAAI,CAAC,oCAAoC,EAAE,UAAU,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;oBACjF,CAAC;gBACH,CAAC;gBAED,OAAO,qBAAqB,CAAC;YAC/B,CAAC,CAAC;QACJ,CAAC,CAAC;IACJ,CAAC;IAED;;OAEG;IACK,mBAAmB,CACzB,UAAyB,EACzB,GAAqB,EACrB,WAA2B;QAE3B,MAAM,EAAE,EAAE,EAAE,GAAG,GAAG,CAAC;QAEnB,2CAA2C;QAC3C,IAAI,CAAC,IAAI,CAAC,mBAAmB,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YACnD,OAAO,UAAU,CAAC,CAAC,sCAAsC;QAC3D,CAAC;QAED,wDAAwD;QACxD,MAAM,UAAU,GAAG,UAAU,CAAC,WAAW,EAAE,CAAC;QAC5C,IAAI,UAAU,CAAC,QAAQ,CAAC,mBAAmB,CAAC,IAAI,UAAU,CAAC,QAAQ,CAAC,sBAAsB,CAAC,IAAI,UAAU,CAAC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,CAAC;YACvI,MAAM,IAAI,KAAK,CAAC,QAAQ,UAAU,CAAC,QAAQ,2EAA2E,CAAC,CAAC;QAC1H,CAAC;QAED,6BAA6B;QAC7B,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,CAAC;QAC5B,IAAI,CAAC,gBAAgB,CAAC,KAAK,EAAE,CAAC;QAC9B,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC;QAEzB,IAAI,gBAAgB,GAAG,KAAK,CAAC;QAE7B,MAAM,KAAK,GAAG,CAAC,IAAa,EAAW,EAAE;YACvC,oEAAoE;YACpE,IACE,EAAE,CAAC,gBAAgB,CAAC,IAAI,CAAC;gBACzB,EAAE,CAAC,0BAA0B,CAAC,IAAI,CAAC,UAAU,CAAC,EAC9C,CAAC;gBACD,MAAM,cAAc,GAAG,IAAI,CAAC,UAAU,CAAC;gBACvC,IACE,EAAE,CAAC,YAAY,CAAC,cAAc,CAAC,UAAU,CAAC;oBAC1C,cAAc,CAAC,UAAU,CAAC,IAAI,KAAK,MAAM,EACzC,CAAC;oBACD,gBAAgB,GAAG,IAAI,CAAC;oBAExB,IAAI,cAAc,CAAC,IAAI,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;wBAC7C,6DAA6D;wBAC7D,IAAI,IAAI,CAAC,MAAM,CAAC,kBAAkB,EAAE,CAAC;4BACnC,8DAA8D;4BAC9D,IAAI,QAAQ,GAAG,SAAS,CAAC;4BACzB,IAAI,gBAAyC,CAAC;4BAE9C,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gCAC9B,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;gCAE9B,iCAAiC;gCACjC,IAAI,EAAE,CAAC,cAAc,CAAC,GAAG,CAAC,EAAE,CAAC;oCAC3B,sDAAsD;oCACtD,MAAM,YAAY,GAAG,GAAG,CAAC,IAAI,CAAC;oCAC9B,MAAM,UAAU,GACd,WAAW,CAAC,mBAAmB,CAAC,YAAY,CAAC,CAAC;oCAEhD,MAAM,QAAQ,GAAG,YAAY,CAAC;oCAE9B,IAAI,QAAQ,EAAE,CAAC;wCACb,MAAM,UAAU,GAAG,WAAW,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC;wCACxD,QAAQ,GAAG,YAAY,UAAU,CAAC,OAAO,CACvC,gBAAgB,EAChB,GAAG,CACJ,EAAE,CAAC;wCACJ,gBAAgB,GAAG,QAAQ,CAAC;oCAC9B,CAAC;yCAAM,CAAC;wCACN,QAAQ,GAAG,SAAS,CAAC;wCACrB,gBAAgB,GAAG,GAAG,CAAC,OAAO,CAAC,qBAAqB,CAClD,GAAG,CAAC,EAAE,CAAC,UAAU,CAAC,cAAc,CACjC,CAAC;oCACJ,CAAC;gCACH,CAAC;qCAAM,IAAI,EAAE,CAAC,yBAAyB,CAAC,GAAG,CAAC,EAAE,CAAC;oCAC7C,mEAAmE;oCACnE,MAAM,UAAU,GAAG,WAAW,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC;oCAEtD,MAAM,QAAQ,GAAG,WAAW,CAAC,cAAc,CACzC,UAAU,EACV,GAAG,EACH,EAAE,CAAC,gBAAgB,CAAC,WAAW,CAChC,CAAC;oCAEF,IAAI,QAAQ,EAAE,CAAC;wCACb,MAAM,SAAS,GAAG,GAAG,CAAC,UAAU;6CAC7B,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;4CACZ,IAAI,EAAE,CAAC,6BAA6B,CAAC,IAAI,CAAC,EAAE,CAAC;gDAC3C,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;4CACxB,CAAC;iDAAM,IACL,EAAE,CAAC,oBAAoB,CAAC,IAAI,CAAC;gDAC7B,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,EAC1B,CAAC;gDACD,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;4CACxB,CAAC;4CACD,OAAO,SAAS,CAAC;wCACnB,CAAC,CAAC;6CACD,IAAI,EAAE;6CACN,IAAI,CAAC,GAAG,CAAC,CAAC;wCAEb,QAAQ,GAAG,iBAAiB,SAAS,EAAE,CAAC;wCACxC,gBAAgB,GAAG,QAAQ,CAAC;oCAC9B,CAAC;yCAAM,CAAC;wCACN,wBAAwB;wCACxB,wDAAwD;wCACxD,qCAAqC;wCACrC,KAAK;wCACL,MAAM,IAAI,KAAK,CAAC,wCAAwC,GAAG,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;oCAC5E,CAAC;gCACH,CAAC;qCAAM,CAAC;oCACN,mEAAmE;oCACnE,MAAM,OAAO,GAAG,WAAW,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC;oCAEnD,MAAM,QAAQ,GAAG,WAAW,CAAC,cAAc,CACzC,OAAO,EACP,GAAG,EACH,EAAE,CAAC,gBAAgB,CAAC,WAAW,CAChC,CAAC;oCACF,IAAI,QAAQ,EAAE,CAAC;wCACb,MAAM,UAAU,GAAG,WAAW,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;wCACrD,QAAQ,GAAG,cAAc,UAAU,CAAC,OAAO,CACzC,gBAAgB,EAChB,GAAG,CACJ,EAAE,CAAC;wCACJ,gBAAgB,GAAG,QAAQ,CAAC;oCAC9B,CAAC;yCAAM,CAAC;wCACN,QAAQ,GAAG,SAAS,CAAC;wCACrB,gBAAgB,GAAG,GAAG,CAAC,OAAO,CAAC,qBAAqB,CAClD,GAAG,CAAC,EAAE,CAAC,UAAU,CAAC,cAAc,CACjC,CAAA;oCACH,CAAC;gCACH,CAAC;4BACH,CAAC;4BAED,MAAM,eAAe,GAAG,IAAI,CAAC,sBAAsB,CACjD,QAAQ,EACR,gBAAiB,CAClB,CAAC;4BAEF,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC,oBAAoB,CAC9C,GAAG,CAAC,OAAO,CAAC,gBAAgB,CAAC,eAAe,CAAC,EAC7C,SAAS,EACT,IAAI,CAAC,SAAS,CACf,CAAC;4BAEF,OAAO,OAAO,CAAC;wBACjB,CAAC;6BAAM,CAAC;4BACN,kCAAkC;4BAClC,OAAO,GAAG,CAAC,OAAO,CAAC,oBAAoB,CACrC,IAAI,EACJ,GAAG,CAAC,OAAO,CAAC,8BAA8B,CACxC,GAAG,CAAC,OAAO,CAAC,8BAA8B,CACxC,GAAG,CAAC,OAAO,CAAC,gBAAgB,CAAC,OAAO,CAAC,EACrC,MAAM,CACP,EACD,WAAW,CACZ,EACD,IAAI,CAAC,aAAa,EAClB,IAAI,CAAC,SAAS,CACf,CAAC;wBACJ,CAAC;oBACH,CAAC;yBAAM,IAAI,cAAc,CAAC,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;wBAChD,kEAAkE;wBAClE,oEAAoE;wBACpE,IAAI,UAAmC,CAAC;wBAExC,4CAA4C;wBAC5C,IAAI,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;wBACzB,OAAO,MAAM,EAAE,CAAC;4BACd,IAAI,EAAE,CAAC,qBAAqB,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;gCACpD,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC;gCACzB,MAAM;4BACR,CAAC;iCAAM,IAAI,EAAE,CAAC,cAAc,CAAC,MAAM,CAAC,EAAE,CAAC;gCACrC,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC;gCACzB,MAAM;4BACR,CAAC;iCAAM,IAAI,EAAE,CAAC,iBAAiB,CAAC,MAAM,CAAC,EAAE,CAAC;gCACxC,gCAAgC;gCAChC,IAAI,UAAU,GAAG,MAAM,CAAC,MAAM,CAAC;gCAC/B,OAAO,UAAU,EAAE,CAAC;oCAClB,IACE,CAAC,EAAE,CAAC,qBAAqB,CAAC,UAAU,CAAC;wCACnC,EAAE,CAAC,eAAe,CAAC,UAAU,CAAC;wCAC9B,EAAE,CAAC,mBAAmB,CAAC,UAAU,CAAC,CAAC;wCACrC,UAAU,CAAC,IAAI,EACf,CAAC;wCACD,UAAU,GAAG,UAAU,CAAC,IAAI,CAAC;wCAC7B,MAAM;oCACR,CAAC;oCACD,UAAU,GAAG,UAAU,CAAC,MAAM,CAAC;gCACjC,CAAC;gCACD,MAAM;4BACR,CAAC;4BACD,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;wBACzB,CAAC;wBAED,IAAI,IAAI,CAAC,MAAM,CAAC,kBAAkB,IAAI,UAAU,EAAE,CAAC;4BACjD,yCAAyC;4BACzC,MAAM,aAAa,GAAG,WAAW,CAAC,mBAAmB,CAAC,UAAU,CAAC,CAAC;4BAClE,MAAM,QAAQ,GAAG,WAAW,CAAC,YAAY,CAAC,aAAa,CAAC,CAAC;4BACzD,MAAM,UAAU,GAAG,IAAI,CAAC,iBAAiB,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;4BAEhE,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC,oBAAoB,CAC9C,GAAG,CAAC,OAAO,CAAC,gBAAgB,CAAC,UAAU,CAAC,EACxC,SAAS,EACT,IAAI,CAAC,SAAS,CACf,CAAC;4BAEF,OAAO,OAAO,CAAC;wBACjB,CAAC;6BAAM,CAAC;4BACN,oCAAoC;4BACpC,MAAM,aAAa,GAAG,UAAU;gCAC9B,CAAC,CAAC,CAAC,UAAU,CAAC;gCACd,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC;4BAEvB,OAAO,GAAG,CAAC,OAAO,CAAC,oBAAoB,CACrC,IAAI,EACJ,GAAG,CAAC,OAAO,CAAC,8BAA8B,CACxC,GAAG,CAAC,OAAO,CAAC,8BAA8B,CACxC,GAAG,CAAC,OAAO,CAAC,gBAAgB,CAAC,OAAO,CAAC,EACrC,MAAM,CACP,EACD,aAAa,CACd,EACD,aAAa,EACb,IAAI,CAAC,SAAS,CACf,CAAC;wBACJ,CAAC;oBACH,CAAC;gBACH,CAAC;YACH,CAAC;YAED,kCAAkC;YAClC,IAAI,EAAE,CAAC,qBAAqB,CAAC,IAAI,CAAC,EAAE,CAAC;gBACnC,gBAAgB,GAAG,IAAI,CAAC;gBACxB,OAAO,iBAAiB,CAAC,IAAI,CAAC,CAAC;YACjC,CAAC;YAED,4BAA4B;YAC5B,IAAI,EAAE,CAAC,eAAe,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC7B,gBAAgB,GAAG,IAAI,CAAC;gBACxB,OAAO,iBAAiB,CAAC,IAAI,CAAC,CAAC;YACjC,CAAC;YAED,gCAAgC;YAChC,IAAI,EAAE,CAAC,mBAAmB,CAAC,IAAI,CAAC,EAAE,CAAC;gBACjC,gBAAgB,GAAG,IAAI,CAAC;gBACxB,OAAO,iBAAiB,CAAC,IAAI,CAAC,CAAC;YACjC,CAAC;YAED,OAAO,GAAG,CAAC,EAAE,CAAC,cAAc,CAAC,IAAI,EAAE,KAAK,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;QACzD,CAAC,CAAC;QAEF,MAAM,iBAAiB,GAAG,CACxB,IAAsE,EAC7D,EAAE;YACX,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;YACvB,IAAI,CAAC,IAAI,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC;gBAAE,OAAO,IAAI,CAAC;YAE5C,2BAA2B;YAC3B,MAAM,oBAAoB,GAAmB,EAAE,CAAC;YAEhD,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;gBAChC,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;oBACf,MAAM,SAAS,GAAG,EAAE,CAAC,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC;wBAC3C,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI;wBACjB,CAAC,CAAC,OAAO,CAAC;oBACZ,MAAM,eAAe,GAAG,GAAG,CAAC,OAAO,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC;oBAEhE,IAAI,IAAI,CAAC,MAAM,CAAC,kBAAkB,EAAE,CAAC;wBACnC,6CAA6C;wBAC7C,MAAM,SAAS,GAAG,WAAW,CAAC,mBAAmB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;wBAC9D,MAAM,QAAQ,GAAG,WAAW,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;wBACrD,MAAM,aAAa,GAAG,IAAI,CAAC,oBAAoB,CAC7C,QAAQ,EACR,KAAK,CAAC,IAAI,CACX,CAAC;wBAEF,MAAM,aAAa,GAAG,GAAG,CAAC,OAAO,CAAC,oBAAoB,CACpD,GAAG,CAAC,OAAO,CAAC,gBAAgB,CAAC,aAAa,CAAC,EAC3C,SAAS,EACT,CAAC,eAAe,CAAC,CAClB,CAAC;wBACF,MAAM,UAAU,GACd,GAAG,CAAC,OAAO,CAAC,yBAAyB,CAAC,aAAa,CAAC,CAAC;wBAEvD,oBAAoB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;oBACxC,CAAC;yBAAM,CAAC;wBACN,gCAAgC;wBAChC,MAAM,eAAe,GAAG,GAAG,CAAC,OAAO,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC;wBAC9D,MAAM,gBAAgB,GAAG,GAAG,CAAC,OAAO,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC;wBAChE,MAAM,cAAc,GAAG,GAAG,CAAC,OAAO,CAAC,8BAA8B,CAC/D,eAAe,EACf,gBAAgB,CACjB,CAAC;wBACF,MAAM,cAAc,GAAG,GAAG,CAAC,OAAO,CAAC,oBAAoB,CACrD,cAAc,EACd,CAAC,KAAK,CAAC,IAAI,CAAC,EACZ,CAAC,eAAe,CAAC,CAClB,CAAC;wBACF,MAAM,UAAU,GACd,GAAG,CAAC,OAAO,CAAC,yBAAyB,CAAC,cAAc,CAAC,CAAC;wBAExD,oBAAoB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;oBACxC,CAAC;gBACH,CAAC;YACH,CAAC,CAAC,CAAC;YAEH,8EAA8E;YAC9E,MAAM,WAAW,GAAG,GAAG,CAAC,EAAE,CAAC,SAAS,CAAC,IAAI,EAAE,KAAK,CAAa,CAAC;YAE9D,6EAA6E;YAC7E,IAAI,qBAAqB,GAAG,WAAW,CAAC,UAAU,CAAC;YACnD,IAAI,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC;YAE3B,oEAAoE;YACpE,IAAI,mBAAwC,CAAC;YAC7C,IAAI,CAAC,UAAU,EAAE,CAAC;gBAChB,MAAM,SAAS,GAAG,WAAW,CAAC,2BAA2B,CAAC,IAAI,CAAC,CAAC;gBAChE,IAAI,SAAS,EAAE,CAAC;oBACd,MAAM,kBAAkB,GAAG,WAAW,CAAC,wBAAwB,CAAC,SAAS,CAAC,CAAC;oBAC3E,UAAU,GAAG,WAAW,CAAC,cAAc,CACrC,kBAAkB,EAClB,IAAI,EACJ,EAAE,CAAC,gBAAgB,CAAC,WAAW,CAChC,CAAC;oBACF,mBAAmB,GAAG,kBAAkB,CAAC;gBAC3C,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,4DAA4D;gBAC5D,mBAAmB,GAAG,WAAW,CAAC,mBAAmB,CAAC,UAAU,CAAC,CAAC;YACpE,CAAC;YAED,IAAI,UAAU,IAAI,mBAAmB,EAAE,CAAC;gBACtC,MAAM,iBAAiB,GAAG,CAAC,IAAa,EAAW,EAAE;oBACnD,IAAI,EAAE,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;wBAClD,IAAI,IAAI,CAAC,MAAM,CAAC,kBAAkB,EAAE,CAAC;4BACnC,oDAAoD;4BACpD,MAAM,cAAc,GAAG,WAAW,CAAC,YAAY,CAAC,mBAAoB,CAAC,CAAC;4BACtE,MAAM,aAAa,GAAG,IAAI,CAAC,oBAAoB,CAC7C,cAAc,EACd,UAAU,CACX,CAAC;4BAEF,MAAM,aAAa,GAAG,GAAG,CAAC,OAAO,CAAC,oBAAoB,CACpD,GAAG,CAAC,OAAO,CAAC,gBAAgB,CAAC,aAAa,CAAC,EAC3C,SAAS,EACT,CAAC,IAAI,CAAC,UAAU,CAAC,CAClB,CAAC;4BAEF,OAAO,GAAG,CAAC,OAAO,CAAC,qBAAqB,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;wBAChE,CAAC;6BAAM,CAAC;4BACN,gCAAgC;4BAChC,MAAM,eAAe,GAAG,GAAG,CAAC,OAAO,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC;4BAC9D,MAAM,gBAAgB,GAAG,GAAG,CAAC,OAAO,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC;4BAChE,MAAM,cAAc,GAAG,GAAG,CAAC,OAAO,CAAC,8BAA8B,CAC/D,eAAe,EACf,gBAAgB,CACjB,CAAC;4BACF,MAAM,cAAc,GAAG,GAAG,CAAC,OAAO,CAAC,oBAAoB,CACrD,cAAc,EACd,CAAC,UAAU,CAAC,EACZ,CAAC,IAAI,CAAC,UAAU,CAAC,CAClB,CAAC;4BAEF,OAAO,GAAG,CAAC,OAAO,CAAC,qBAAqB,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC;wBACjE,CAAC;oBACH,CAAC;oBACD,OAAO,GAAG,CAAC,EAAE,CAAC,cAAc,CAAC,IAAI,EAAE,iBAAiB,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;gBACrE,CAAC,CAAC;gBAEF,qBAAqB,GAAG,GAAG,CAAC,EAAE,CAAC,UAAU,CACvC,WAAW,CAAC,UAAU,EACtB,iBAAiB,CACY,CAAC;YAClC,CAAC;YAED,gDAAgD;YAChD,MAAM,aAAa,GAAG,GAAG,CAAC,OAAO,CAAC,eAAe,CAAC;gBAChD,GAAG,oBAAoB;gBACvB,GAAG,qBAAqB;aACzB,CAAC,CAAC;YACH,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC,WAAW,CAAC,WAAW,EAAE,aAAa,CAAC,CAAC;YAEpE,IAAI,EAAE,CAAC,qBAAqB,CAAC,IAAI,CAAC,EAAE,CAAC;gBACnC,OAAO,GAAG,CAAC,OAAO,CAAC,yBAAyB,CAC1C,IAAI,EACJ,IAAI,CAAC,SAAS,EACd,IAAI,CAAC,aAAa,EAClB,IAAI,CAAC,IAAI,EACT,IAAI,CAAC,cAAc,EACnB,IAAI,CAAC,UAAU,EACf,IAAI,CAAC,IAAI,EACT,OAAO,CACR,CAAC;YACJ,CAAC;iBAAM,IAAI,EAAE,CAAC,eAAe,CAAC,IAAI,CAAC,EAAE,CAAC;gBACpC,OAAO,GAAG,CAAC,OAAO,CAAC,mBAAmB,CACpC,IAAI,EACJ,IAAI,CAAC,SAAS,EACd,IAAI,CAAC,cAAc,EACnB,IAAI,CAAC,UAAU,EACf,IAAI,CAAC,IAAI,EACT,IAAI,CAAC,sBAAsB,EAC3B,OAAO,CACR,CAAC;YACJ,CAAC;iBAAM,IAAI,EAAE,CAAC,mBAAmB,CAAC,IAAI,CAAC,EAAE,CAAC;gBACxC,OAAO,GAAG,CAAC,OAAO,CAAC,uBAAuB,CACxC,IAAI,EACJ,IAAI,CAAC,SAAS,EACd,IAAI,CAAC,aAAa,EAClB,IAAI,CAAC,IAAI,EACT,IAAI,CAAC,aAAa,EAClB,IAAI,CAAC,cAAc,EACnB,IAAI,CAAC,UAAU,EACf,IAAI,CAAC,IAAI,EACT,OAAO,CACR,CAAC;YACJ,CAAC;YAED,OAAO,IAAI,CAAC;QACd,CAAC,CAAC;QAEF,IAAI,qBAAqB,GAAG,GAAG,CAAC,EAAE,CAAC,SAAS,CAC1C,UAAU,EACV,KAAK,CACW,CAAC;QAEnB,sDAAsD;QACtD,IAAI,gBAAgB,EAAE,CAAC;YACrB,qBAAqB,GAAG,IAAI,CAAC,cAAc,CAAC,qBAAqB,EAAE,GAAG,CAAC,CAAC;YAExE,6EAA6E;YAC7E,IAAI,IAAI,CAAC,MAAM,CAAC,kBAAkB,EAAE,CAAC;gBACnC,MAAM,cAAc,GAAG,IAAI,CAAC,yBAAyB,CAAC,GAAG,CAAC,CAAC;gBAE3D,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBAC9B,MAAM,gBAAgB,GAAG,qBAAqB,CAAC,UAAU,CAAC,MAAM,CAC9D,GAAG,CAAC,EAAE,CAAC,mBAAmB,CAC3B,CAAC;oBACF,MAAM,eAAe,GAAG,qBAAqB,CAAC,UAAU,CAAC,MAAM,CAC7D,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAC5C,CAAC;oBAEF,MAAM,aAAa,GAAG,GAAG,CAAC,OAAO,CAAC,eAAe,CAAC;wBAChD,GAAG,gBAAgB;wBACnB,GAAG,cAAc;wBACjB,GAAG,eAAe;qBACnB,CAAC,CAAC;oBAEH,qBAAqB,GAAG,GAAG,CAAC,OAAO,CAAC,gBAAgB,CAClD,qBAAqB,EACrB,aAAa,CACd,CAAC;gBACJ,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO,qBAAqB,CAAC;IAC/B,CAAC;IAEM,mBAAmB,CAAC,QAAgB;QACzC,OAAO,mBAAmB,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IACpD,CAAC;IAEO,cAAc,CACpB,UAAyB,EACzB,GAAqB;QAErB,MAAM,EAAE,OAAO,EAAE,GAAG,GAAG,CAAC;QAExB,MAAM,eAAe,GAAG,UAAU,CAAC,UAAU,CAAC,MAAM,CAClD,GAAG,CAAC,EAAE,CAAC,mBAAmB,CAC3B,CAAC;QACF,MAAM,cAAc,GAAG,eAAe,CAAC,IAAI,CACzC,CAAC,GAAG,EAAE,EAAE,CACN,GAAG,CAAC,eAAe;YACnB,GAAG,CAAC,EAAE,CAAC,eAAe,CAAC,GAAG,CAAC,eAAe,CAAC;YAC3C,GAAG,CAAC,eAAe,CAAC,IAAI,KAAK,OAAO,CACvC,CAAC;QAEF,IAAI,CAAC,cAAc,EAAE,CAAC;YACpB,MAAM,WAAW,GAAG,OAAO,CAAC,uBAAuB,CACjD,SAAS,EACT,OAAO,CAAC,kBAAkB,CACxB,KAAK,EACL,OAAO,CAAC,gBAAgB,CAAC,OAAO,CAAC,EACjC,SAAS,CACV,EACD,OAAO,CAAC,mBAAmB,CAAC,OAAO,CAAC,CACrC,CAAC;YAEF,MAAM,aAAa,GAAG,OAAO,CAAC,gBAAgB,CAC5C,UAAU,EACV,OAAO,CAAC,eAAe,CAAC,CAAC,WAAW,EAAE,GAAG,UAAU,CAAC,UAAU,CAAC,CAAC,CACjE,CAAC;YAEF,OAAO,aAAa,CAAC;QACvB,CAAC;QAED,OAAO,UAAU,CAAC;IACpB,CAAC;IAEO,oBAAoB,CAC1B,QAAgB,EAChB,QAAqB;QAErB,IAAI,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;YACtC,OAAO,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,QAAQ,CAAE,CAAC,IAAI,CAAC;QACjD,CAAC;QAED,MAAM,aAAa,GAAG,oBAAoB,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC;QACrE,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE,QAAQ,EAAE,CAAC,CAAC;QACrE,OAAO,aAAa,CAAC;IACvB,CAAC;IAEO,sBAAsB,CAC5B,QAAgB,EAChB,QAAqB;QAErB,IAAI,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;YACxC,OAAO,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,QAAQ,CAAE,CAAC,IAAI,CAAC;QACnD,CAAC;QAED,MAAM,eAAe,GAAG,uBAAuB,IAAI,CAAC,gBAAgB,CAAC,IAAI,EAAE,CAAC;QAC5E,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,IAAI,EAAE,eAAe,EAAE,QAAQ,EAAE,CAAC,CAAC;QACzE,OAAO,eAAe,CAAC;IACzB,CAAC;IAEO,iBAAiB,CAAC,QAAgB,EAAE,QAAqB;QAC/D,IAAI,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;YACnC,OAAO,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,QAAQ,CAAE,CAAC,IAAI,CAAC;QAC9C,CAAC;QAED,MAAM,UAAU,GAAG,mBAAmB,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC;QAC9D,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAC,CAAC;QAC/D,OAAO,UAAU,CAAC;IACpB,CAAC;IAEO,yBAAyB,CAAC,GAAqB;QACrD,MAAM,EAAE,OAAO,EAAE,GAAG,GAAG,CAAC;QACxB,MAAM,UAAU,GAAmB,EAAE,CAAC;QAEtC,2BAA2B;QAC3B,KAAK,MAAM,CAAC,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE,QAAQ,EAAE,CAAC,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YACxE,MAAM,gBAAgB,GAAG,OAAO,CAAC,oBAAoB,CACnD,OAAO,CAAC,8BAA8B,CACpC,OAAO,CAAC,gBAAgB,CAAC,OAAO,CAAC,EACjC,cAAc,CACf,EACD,CAAC,QAAQ,CAAC,EACV,EAAE,CACH,CAAC;YAEF,MAAM,oBAAoB,GAAG,OAAO,CAAC,uBAAuB,CAC1D,SAAS,EACT,OAAO,CAAC,6BAA6B,CACnC;gBACE,OAAO,CAAC,yBAAyB,CAC/B,aAAa,EACb,SAAS,EACT,SAAS,EACT,gBAAgB,CACjB;aACF,EACD,GAAG,CAAC,EAAE,CAAC,SAAS,CAAC,KAAK,CACvB,CACF,CAAC;YACF,UAAU,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;QACxC,CAAC;QAED,sBAAsB;QACtB,KAAK,MAAM,CAAC,EAAE,EAAE,IAAI,EAAE,eAAe,EAAE,QAAQ,EAAE,CAAC,IAAI,IAAI;aACvD,gBAAgB,EAAE,CAAC;YACpB,MAAM,mBAAmB,GAAG,OAAO,CAAC,oBAAoB,CACtD,OAAO,CAAC,8BAA8B,CACpC,OAAO,CAAC,8BAA8B,CACpC,OAAO,CAAC,gBAAgB,CAAC,OAAO,CAAC,EACjC,MAAM,CACP,EACD,iBAAiB,CAClB,EACD,CAAC,QAAQ,CAAC,EACV,EAAE,CACH,CAAC;YAEF,MAAM,sBAAsB,GAAG,OAAO,CAAC,uBAAuB,CAC5D,SAAS,EACT,OAAO,CAAC,6BAA6B,CACnC;gBACE,OAAO,CAAC,yBAAyB,CAC/B,eAAe,EACf,SAAS,EACT,SAAS,EACT,mBAAmB,CACpB;aACF,EACD,GAAG,CAAC,EAAE,CAAC,SAAS,CAAC,KAAK,CACvB,CACF,CAAC;YACF,UAAU,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;QAC1C,CAAC;QAED,iBAAiB;QACjB,KAAK,MAAM,CAAC,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAC,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YAClE,MAAM,eAAe,GAAG,OAAO,CAAC,oBAAoB,CAClD,OAAO,CAAC,8BAA8B,CACpC,OAAO,CAAC,8BAA8B,CACpC,OAAO,CAAC,gBAAgB,CAAC,OAAO,CAAC,EACjC,MAAM,CACP,EACD,mBAAmB,CACpB,EACD,CAAC,QAAQ,CAAC,EACV,EAAE,CACH,CAAC;YAEF,MAAM,iBAAiB,GAAG,OAAO,CAAC,uBAAuB,CACvD,SAAS,EACT,OAAO,CAAC,6BAA6B,CACnC;gBACE,OAAO,CAAC,yBAAyB,CAC/B,UAAU,EACV,SAAS,EACT,SAAS,EACT,eAAe,CAChB;aACF,EACD,GAAG,CAAC,EAAE,CAAC,SAAS,CAAC,KAAK,CACvB,CACF,CAAC;YACF,UAAU,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;QACrC,CAAC;QAED,OAAO,UAAU,CAAC;IACpB,CAAC;CACF"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { TypicalTransformer } from './transformer.js';
|
|
2
|
+
import { loadConfig } from './config.js';
|
|
3
|
+
export default function (program, pluginConfig, { ts: tsInstance }) {
|
|
4
|
+
const config = loadConfig();
|
|
5
|
+
const transformer = new TypicalTransformer(config, program, tsInstance);
|
|
6
|
+
// Create the typical transformer with typia integration
|
|
7
|
+
return transformer.getTransformer(true);
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=tsc-plugin.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tsc-plugin.js","sourceRoot":"","sources":["../../src/tsc-plugin.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,MAAM,CAAC,OAAO,WAAW,OAAmB,EAAE,YAA0B,EAAE,EAAE,EAAE,EAAE,UAAU,EAAqB;IAC7G,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;IAC5B,MAAM,WAAW,GAAG,IAAI,kBAAkB,CAAC,MAAM,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC;IAExE,wDAAwD;IACxD,OAAO,WAAW,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;AAC1C,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@elliots/typical",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Runtime safe TypeScript transformer using typia",
|
|
5
|
+
"main": "dist/index.js",
|
|
6
|
+
"type": "module",
|
|
7
|
+
"bin": {
|
|
8
|
+
"typical": "dist/cli.js",
|
|
9
|
+
"ttsx": "bin/ttsx",
|
|
10
|
+
"ttsc": "bin/ttsc"
|
|
11
|
+
},
|
|
12
|
+
"exports": {
|
|
13
|
+
".": "./dist/index.js",
|
|
14
|
+
"./tsc-plugin": "./dist/src/tsc-plugin.js",
|
|
15
|
+
"./esm": "./dist/src/esm-loader-register.js",
|
|
16
|
+
"./loader": "./dist/src/esm-loader.js"
|
|
17
|
+
},
|
|
18
|
+
"files": [
|
|
19
|
+
"dist/src",
|
|
20
|
+
"bin",
|
|
21
|
+
"src"
|
|
22
|
+
],
|
|
23
|
+
"scripts": {
|
|
24
|
+
"build": "tsc",
|
|
25
|
+
"dev": "tsc --watch",
|
|
26
|
+
"test": "rm -f test/test.temp.ts && tsc && node --import ./dist/src/esm-loader-register.js --test dist/test/*.test.js",
|
|
27
|
+
"prepublishOnly": "npm run build && npm test",
|
|
28
|
+
"sample:esm": "cd samples/esm && npm install && npm run start",
|
|
29
|
+
"sample:ttsx": "cd samples/ttsx && npm install && npm run start",
|
|
30
|
+
"sample:tsc": "cd samples/tsc && npm install && npm run build && npm run start",
|
|
31
|
+
"sample:ttsc": "cd samples/ttsc && npm install && npm run build && npm run start",
|
|
32
|
+
"samples": "npm run sample:esm && npm run sample:ttsx && npm run sample:tsc && npm run sample:ttsc"
|
|
33
|
+
},
|
|
34
|
+
"repository": {
|
|
35
|
+
"type": "git",
|
|
36
|
+
"url": "git+https://github.com/elliots/typical.git"
|
|
37
|
+
},
|
|
38
|
+
"bugs": {
|
|
39
|
+
"url": "https://github.com/elliots/typical/issues"
|
|
40
|
+
},
|
|
41
|
+
"homepage": "https://github.com/elliots/typical#readme",
|
|
42
|
+
"keywords": [
|
|
43
|
+
"typescript",
|
|
44
|
+
"runtime",
|
|
45
|
+
"validation",
|
|
46
|
+
"typia",
|
|
47
|
+
"transformer"
|
|
48
|
+
],
|
|
49
|
+
"author": "Elliot Shepherd <elliot@jarofworms.com>",
|
|
50
|
+
"license": "MIT",
|
|
51
|
+
"publishConfig": {
|
|
52
|
+
"access": "public"
|
|
53
|
+
},
|
|
54
|
+
"dependencies": {
|
|
55
|
+
"commander": "14.0.2",
|
|
56
|
+
"glob": "13.0.0",
|
|
57
|
+
"minimatch": "10.0.1",
|
|
58
|
+
"strip-json-comments": "5.0.3",
|
|
59
|
+
"ts-patch": "3.3.0",
|
|
60
|
+
"tsx": "4.21.0",
|
|
61
|
+
"typia": "11.0.0",
|
|
62
|
+
"unplugin": "2.3.11",
|
|
63
|
+
"typescript": "^5.0.0"
|
|
64
|
+
},
|
|
65
|
+
"devDependencies": {
|
|
66
|
+
"@types/node": "22"
|
|
67
|
+
},
|
|
68
|
+
"peerDependencies": {
|
|
69
|
+
"typescript": "^5.0.0"
|
|
70
|
+
}
|
|
71
|
+
}
|