@elliots/typical 0.1.3 → 0.1.4
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 +3 -0
- package/dist/src/transformer.d.ts +6 -0
- package/dist/src/transformer.js +310 -32
- package/dist/src/transformer.js.map +1 -1
- package/package.json +5 -3
- package/src/transformer.ts +385 -40
- package/src/tsc-plugin.ts +1 -1
package/README.md
CHANGED
|
@@ -87,3 +87,6 @@ But basically you shouldn't need to care about how it works internally, it makes
|
|
|
87
87
|
|
|
88
88
|
## Credits
|
|
89
89
|
The actual validation work is done by [typia](https://github.com/samchon/typia). This package just generates the necessary code to call typia's functions based on your TypeScript types.
|
|
90
|
+
|
|
91
|
+
> NOTE: The whole package was all mostly LLM. Feel free to improve it without care for the author's feelings.
|
|
92
|
+
|
|
@@ -16,6 +16,12 @@ export declare class TypicalTransformer {
|
|
|
16
16
|
createSourceFile(fileName: string, content: string): ts.SourceFile;
|
|
17
17
|
transform(sourceFile: ts.SourceFile | string, mode: "basic" | "typia" | "js"): string;
|
|
18
18
|
getTransformer(withTypia: boolean): ts.TransformerFactory<ts.SourceFile>;
|
|
19
|
+
/**
|
|
20
|
+
* Re-create an import declaration as a fully synthetic node.
|
|
21
|
+
* This prevents TypeScript from trying to look up symbol bindings
|
|
22
|
+
* and eliding the import as "unused".
|
|
23
|
+
*/
|
|
24
|
+
private recreateImportDeclaration;
|
|
19
25
|
/**
|
|
20
26
|
* Transform a single source file with TypeScript AST
|
|
21
27
|
*/
|
package/dist/src/transformer.js
CHANGED
|
@@ -57,22 +57,23 @@ export class TypicalTransformer {
|
|
|
57
57
|
if (!withTypia) {
|
|
58
58
|
return transformedSourceFile;
|
|
59
59
|
}
|
|
60
|
-
//
|
|
60
|
+
// Apply typia transformation
|
|
61
61
|
const printer = this.ts.createPrinter();
|
|
62
62
|
const transformedCode = printer.printFile(transformedSourceFile);
|
|
63
|
+
if (process.env.DEBUG) {
|
|
64
|
+
console.log("TYPICAL: Before typia transform (first 500 chars):", transformedCode.substring(0, 500));
|
|
65
|
+
}
|
|
63
66
|
if (transformedCode.includes("typia.")) {
|
|
64
67
|
try {
|
|
65
|
-
//
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
transformedCode, sourceFile.languageVersion, true);
|
|
69
|
-
// Create a new program with the transformed source file so typia's type checker works
|
|
68
|
+
// Create a new source file from our transformed code
|
|
69
|
+
const newSourceFile = this.ts.createSourceFile(sourceFile.fileName, transformedCode, sourceFile.languageVersion, true);
|
|
70
|
+
// Create a new program with the transformed source file so typia can resolve types
|
|
70
71
|
const compilerOptions = this.program.getCompilerOptions();
|
|
71
72
|
const originalSourceFiles = new Map();
|
|
72
73
|
for (const sf of this.program.getSourceFiles()) {
|
|
73
74
|
originalSourceFiles.set(sf.fileName, sf);
|
|
74
75
|
}
|
|
75
|
-
// Replace the original source file with
|
|
76
|
+
// Replace the original source file with our transformed one
|
|
76
77
|
originalSourceFiles.set(sourceFile.fileName, newSourceFile);
|
|
77
78
|
const customHost = {
|
|
78
79
|
getSourceFile: (fileName, languageVersion) => {
|
|
@@ -81,7 +82,7 @@ export class TypicalTransformer {
|
|
|
81
82
|
}
|
|
82
83
|
return this.ts.createSourceFile(fileName, this.ts.sys.readFile(fileName) || "", languageVersion, true);
|
|
83
84
|
},
|
|
84
|
-
getDefaultLibFileName: () => this.ts.getDefaultLibFilePath(
|
|
85
|
+
getDefaultLibFileName: (opts) => this.ts.getDefaultLibFilePath(opts),
|
|
85
86
|
writeFile: () => { },
|
|
86
87
|
getCurrentDirectory: () => this.ts.sys.getCurrentDirectory(),
|
|
87
88
|
getCanonicalFileName: (fileName) => this.ts.sys.useCaseSensitiveFileNames ? fileName : fileName.toLowerCase(),
|
|
@@ -91,21 +92,46 @@ export class TypicalTransformer {
|
|
|
91
92
|
readFile: (fileName) => this.ts.sys.readFile(fileName),
|
|
92
93
|
};
|
|
93
94
|
const newProgram = this.ts.createProgram(Array.from(originalSourceFiles.keys()), compilerOptions, customHost);
|
|
94
|
-
//
|
|
95
|
-
const
|
|
95
|
+
// Get the bound source file from the new program (has proper symbol tables)
|
|
96
|
+
const boundSourceFile = newProgram.getSourceFile(sourceFile.fileName);
|
|
97
|
+
if (!boundSourceFile) {
|
|
98
|
+
throw new Error(`Failed to get bound source file: ${sourceFile.fileName}`);
|
|
99
|
+
}
|
|
100
|
+
// Create typia transformer with the NEW program that has our transformed source
|
|
101
|
+
const typiaTransformerFactory = typiaTransform(newProgram, {}, {
|
|
96
102
|
addDiagnostic(diag) {
|
|
97
|
-
|
|
103
|
+
if (process.env.DEBUG) {
|
|
104
|
+
console.warn("Typia diagnostic:", diag);
|
|
105
|
+
}
|
|
98
106
|
return 0;
|
|
99
107
|
},
|
|
100
108
|
});
|
|
101
|
-
// Apply
|
|
102
|
-
const
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
109
|
+
// Apply typia's transformer to the bound source file
|
|
110
|
+
const typiaNodeTransformer = typiaTransformerFactory(context);
|
|
111
|
+
const typiaTransformed = typiaNodeTransformer(boundSourceFile);
|
|
112
|
+
if (process.env.DEBUG) {
|
|
113
|
+
const afterTypia = printer.printFile(typiaTransformed);
|
|
114
|
+
console.log("TYPICAL: After typia transform (first 500 chars):", afterTypia.substring(0, 500));
|
|
107
115
|
}
|
|
108
|
-
|
|
116
|
+
// Return the typia-transformed source file.
|
|
117
|
+
// We need to recreate imports as synthetic nodes to prevent import elision,
|
|
118
|
+
// since the imports come from a different program context.
|
|
119
|
+
// Skip type-only imports as they shouldn't appear in JS output.
|
|
120
|
+
const syntheticStatements = [];
|
|
121
|
+
for (const stmt of typiaTransformed.statements) {
|
|
122
|
+
if (this.ts.isImportDeclaration(stmt)) {
|
|
123
|
+
// Skip type-only imports (import type X from "y")
|
|
124
|
+
if (stmt.importClause?.isTypeOnly) {
|
|
125
|
+
continue;
|
|
126
|
+
}
|
|
127
|
+
syntheticStatements.push(this.recreateImportDeclaration(stmt, factory));
|
|
128
|
+
}
|
|
129
|
+
else {
|
|
130
|
+
syntheticStatements.push(stmt);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
// Update the source file with synthetic imports
|
|
134
|
+
transformedSourceFile = factory.updateSourceFile(typiaTransformed, syntheticStatements, typiaTransformed.isDeclarationFile, typiaTransformed.referencedFiles, typiaTransformed.typeReferenceDirectives, typiaTransformed.hasNoDefaultLib, typiaTransformed.libReferenceDirectives);
|
|
109
135
|
}
|
|
110
136
|
catch (error) {
|
|
111
137
|
console.warn("Failed to apply typia transformer:", sourceFile.fileName, error);
|
|
@@ -115,6 +141,34 @@ export class TypicalTransformer {
|
|
|
115
141
|
};
|
|
116
142
|
};
|
|
117
143
|
}
|
|
144
|
+
/**
|
|
145
|
+
* Re-create an import declaration as a fully synthetic node.
|
|
146
|
+
* This prevents TypeScript from trying to look up symbol bindings
|
|
147
|
+
* and eliding the import as "unused".
|
|
148
|
+
*/
|
|
149
|
+
recreateImportDeclaration(importDecl, factory) {
|
|
150
|
+
let importClause;
|
|
151
|
+
if (importDecl.importClause) {
|
|
152
|
+
const clause = importDecl.importClause;
|
|
153
|
+
let namedBindings;
|
|
154
|
+
if (clause.namedBindings) {
|
|
155
|
+
if (this.ts.isNamespaceImport(clause.namedBindings)) {
|
|
156
|
+
// import * as foo from "bar"
|
|
157
|
+
namedBindings = factory.createNamespaceImport(factory.createIdentifier(clause.namedBindings.name.text));
|
|
158
|
+
}
|
|
159
|
+
else if (this.ts.isNamedImports(clause.namedBindings)) {
|
|
160
|
+
// import { foo, bar } from "baz"
|
|
161
|
+
const elements = clause.namedBindings.elements.map((el) => factory.createImportSpecifier(el.isTypeOnly, el.propertyName ? factory.createIdentifier(el.propertyName.text) : undefined, factory.createIdentifier(el.name.text)));
|
|
162
|
+
namedBindings = factory.createNamedImports(elements);
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
importClause = factory.createImportClause(clause.isTypeOnly, clause.name ? factory.createIdentifier(clause.name.text) : undefined, namedBindings);
|
|
166
|
+
}
|
|
167
|
+
const moduleSpecifier = this.ts.isStringLiteral(importDecl.moduleSpecifier)
|
|
168
|
+
? factory.createStringLiteral(importDecl.moduleSpecifier.text)
|
|
169
|
+
: importDecl.moduleSpecifier;
|
|
170
|
+
return factory.createImportDeclaration(importDecl.modifiers, importClause, moduleSpecifier, importDecl.attributes);
|
|
171
|
+
}
|
|
118
172
|
/**
|
|
119
173
|
* Transform a single source file with TypeScript AST
|
|
120
174
|
*/
|
|
@@ -124,10 +178,12 @@ export class TypicalTransformer {
|
|
|
124
178
|
if (!this.shouldTransformFile(sourceFile.fileName)) {
|
|
125
179
|
return sourceFile; // Return unchanged for excluded files
|
|
126
180
|
}
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
181
|
+
if (!sourceFile.fileName.includes('transformer.test.ts')) {
|
|
182
|
+
// Check if this file has already been transformed by us
|
|
183
|
+
const sourceText = sourceFile.getFullText();
|
|
184
|
+
if (sourceText.includes('__typical_' + 'assert_') || sourceText.includes('__typical_' + 'stringify_') || sourceText.includes('__typical_' + 'parse_')) {
|
|
185
|
+
throw new Error(`File ${sourceFile.fileName} has already been transformed by Typical! Double transformation detected.`);
|
|
186
|
+
}
|
|
131
187
|
}
|
|
132
188
|
// Reset caches for each file
|
|
133
189
|
this.typeValidators.clear();
|
|
@@ -144,6 +200,16 @@ export class TypicalTransformer {
|
|
|
144
200
|
needsTypiaImport = true;
|
|
145
201
|
if (propertyAccess.name.text === "stringify") {
|
|
146
202
|
// For stringify, we need to infer the type from the argument
|
|
203
|
+
// First check if the argument type is 'any' - if so, skip transformation
|
|
204
|
+
if (node.arguments.length > 0) {
|
|
205
|
+
const arg = node.arguments[0];
|
|
206
|
+
const argType = typeChecker.getTypeAtLocation(arg);
|
|
207
|
+
const typeFlags = argType.flags;
|
|
208
|
+
// Skip if type is any (1) or unknown (2)
|
|
209
|
+
if (typeFlags & ts.TypeFlags.Any || typeFlags & ts.TypeFlags.Unknown) {
|
|
210
|
+
return node; // Don't transform JSON.stringify for any/unknown types
|
|
211
|
+
}
|
|
212
|
+
}
|
|
147
213
|
if (this.config.reusableValidators) {
|
|
148
214
|
// For JSON.stringify, try to infer the type from the argument
|
|
149
215
|
let typeText = "unknown";
|
|
@@ -249,8 +315,26 @@ export class TypicalTransformer {
|
|
|
249
315
|
}
|
|
250
316
|
break;
|
|
251
317
|
}
|
|
318
|
+
else if (ts.isArrowFunction(parent) && parent.type) {
|
|
319
|
+
// Arrow function with expression body (not block)
|
|
320
|
+
// e.g., (s: string): User => JSON.parse(s)
|
|
321
|
+
targetType = parent.type;
|
|
322
|
+
break;
|
|
323
|
+
}
|
|
252
324
|
parent = parent.parent;
|
|
253
325
|
}
|
|
326
|
+
// Skip transformation if target type is any or unknown
|
|
327
|
+
const isAnyOrUnknown = targetType && (targetType.kind === ts.SyntaxKind.AnyKeyword ||
|
|
328
|
+
targetType.kind === ts.SyntaxKind.UnknownKeyword);
|
|
329
|
+
if (isAnyOrUnknown) {
|
|
330
|
+
// Don't transform JSON.parse for any/unknown types
|
|
331
|
+
return node;
|
|
332
|
+
}
|
|
333
|
+
// If we can't determine the target type and there's no explicit type argument,
|
|
334
|
+
// don't transform - we can't validate against an unknown type
|
|
335
|
+
if (!targetType && !node.typeArguments) {
|
|
336
|
+
return node;
|
|
337
|
+
}
|
|
254
338
|
if (this.config.reusableValidators && targetType) {
|
|
255
339
|
// Use reusable parser - use typeToString
|
|
256
340
|
const targetTypeObj = typeChecker.getTypeFromTypeNode(targetType);
|
|
@@ -286,21 +370,158 @@ export class TypicalTransformer {
|
|
|
286
370
|
}
|
|
287
371
|
return ctx.ts.visitEachChild(node, visit, ctx.context);
|
|
288
372
|
};
|
|
373
|
+
// Helper functions for flow analysis
|
|
374
|
+
const getRootIdentifier = (expr) => {
|
|
375
|
+
if (ts.isIdentifier(expr)) {
|
|
376
|
+
return expr.text;
|
|
377
|
+
}
|
|
378
|
+
if (ts.isPropertyAccessExpression(expr)) {
|
|
379
|
+
return getRootIdentifier(expr.expression);
|
|
380
|
+
}
|
|
381
|
+
return undefined;
|
|
382
|
+
};
|
|
383
|
+
const containsReference = (expr, name) => {
|
|
384
|
+
if (ts.isIdentifier(expr) && expr.text === name) {
|
|
385
|
+
return true;
|
|
386
|
+
}
|
|
387
|
+
if (ts.isPropertyAccessExpression(expr)) {
|
|
388
|
+
return containsReference(expr.expression, name);
|
|
389
|
+
}
|
|
390
|
+
if (ts.isElementAccessExpression(expr)) {
|
|
391
|
+
return containsReference(expr.expression, name) ||
|
|
392
|
+
containsReference(expr.argumentExpression, name);
|
|
393
|
+
}
|
|
394
|
+
// Check all children
|
|
395
|
+
let found = false;
|
|
396
|
+
ts.forEachChild(expr, (child) => {
|
|
397
|
+
if (ts.isExpression(child) && containsReference(child, name)) {
|
|
398
|
+
found = true;
|
|
399
|
+
}
|
|
400
|
+
});
|
|
401
|
+
return found;
|
|
402
|
+
};
|
|
403
|
+
// Check if a validated variable has been tainted in the function body
|
|
404
|
+
const isTainted = (varName, body) => {
|
|
405
|
+
let tainted = false;
|
|
406
|
+
// First pass: collect aliases (variables that reference properties of varName)
|
|
407
|
+
// e.g., const addr = user.address; -> addr is an alias
|
|
408
|
+
const aliases = new Set([varName]);
|
|
409
|
+
const collectAliases = (node) => {
|
|
410
|
+
// Look for: const/let x = varName.property or const/let x = varName
|
|
411
|
+
if (ts.isVariableStatement(node)) {
|
|
412
|
+
for (const decl of node.declarationList.declarations) {
|
|
413
|
+
if (ts.isIdentifier(decl.name) && decl.initializer) {
|
|
414
|
+
// Check if initializer is rooted at our tracked variable or any existing alias
|
|
415
|
+
const initRoot = getRootIdentifier(decl.initializer);
|
|
416
|
+
if (initRoot && aliases.has(initRoot)) {
|
|
417
|
+
aliases.add(decl.name.text);
|
|
418
|
+
}
|
|
419
|
+
}
|
|
420
|
+
}
|
|
421
|
+
}
|
|
422
|
+
ts.forEachChild(node, collectAliases);
|
|
423
|
+
};
|
|
424
|
+
collectAliases(body);
|
|
425
|
+
// Helper to check if any alias is involved
|
|
426
|
+
const involvesTrackedVar = (expr) => {
|
|
427
|
+
const root = getRootIdentifier(expr);
|
|
428
|
+
return root !== undefined && aliases.has(root);
|
|
429
|
+
};
|
|
430
|
+
const checkTainting = (node) => {
|
|
431
|
+
if (tainted)
|
|
432
|
+
return; // Early exit if already tainted
|
|
433
|
+
// Reassignment: trackedVar = ...
|
|
434
|
+
if (ts.isBinaryExpression(node) &&
|
|
435
|
+
node.operatorToken.kind === ts.SyntaxKind.EqualsToken &&
|
|
436
|
+
ts.isIdentifier(node.left) &&
|
|
437
|
+
aliases.has(node.left.text)) {
|
|
438
|
+
tainted = true;
|
|
439
|
+
return;
|
|
440
|
+
}
|
|
441
|
+
// Property assignment: trackedVar.x = ... or alias.x = ...
|
|
442
|
+
if (ts.isBinaryExpression(node) &&
|
|
443
|
+
node.operatorToken.kind === ts.SyntaxKind.EqualsToken &&
|
|
444
|
+
ts.isPropertyAccessExpression(node.left) &&
|
|
445
|
+
involvesTrackedVar(node.left)) {
|
|
446
|
+
tainted = true;
|
|
447
|
+
return;
|
|
448
|
+
}
|
|
449
|
+
// Element assignment: trackedVar[x] = ... or alias[x] = ...
|
|
450
|
+
if (ts.isBinaryExpression(node) &&
|
|
451
|
+
node.operatorToken.kind === ts.SyntaxKind.EqualsToken &&
|
|
452
|
+
ts.isElementAccessExpression(node.left) &&
|
|
453
|
+
involvesTrackedVar(node.left.expression)) {
|
|
454
|
+
tainted = true;
|
|
455
|
+
return;
|
|
456
|
+
}
|
|
457
|
+
// Passed as argument to a function: fn(trackedVar) or fn(alias)
|
|
458
|
+
if (ts.isCallExpression(node)) {
|
|
459
|
+
for (const arg of node.arguments) {
|
|
460
|
+
// Check if any tracked variable or alias appears in the argument
|
|
461
|
+
let hasTrackedRef = false;
|
|
462
|
+
const checkRef = (n) => {
|
|
463
|
+
if (ts.isIdentifier(n) && aliases.has(n.text)) {
|
|
464
|
+
hasTrackedRef = true;
|
|
465
|
+
}
|
|
466
|
+
ts.forEachChild(n, checkRef);
|
|
467
|
+
};
|
|
468
|
+
checkRef(arg);
|
|
469
|
+
if (hasTrackedRef) {
|
|
470
|
+
tainted = true;
|
|
471
|
+
return;
|
|
472
|
+
}
|
|
473
|
+
}
|
|
474
|
+
}
|
|
475
|
+
// Method call on the variable: trackedVar.method() or alias.method()
|
|
476
|
+
if (ts.isCallExpression(node) &&
|
|
477
|
+
ts.isPropertyAccessExpression(node.expression) &&
|
|
478
|
+
involvesTrackedVar(node.expression.expression)) {
|
|
479
|
+
tainted = true;
|
|
480
|
+
return;
|
|
481
|
+
}
|
|
482
|
+
// Await expression (async boundary - external code could run)
|
|
483
|
+
if (ts.isAwaitExpression(node)) {
|
|
484
|
+
tainted = true;
|
|
485
|
+
return;
|
|
486
|
+
}
|
|
487
|
+
ts.forEachChild(node, checkTainting);
|
|
488
|
+
};
|
|
489
|
+
checkTainting(body);
|
|
490
|
+
return tainted;
|
|
491
|
+
};
|
|
289
492
|
const transformFunction = (func) => {
|
|
290
493
|
const body = func.body;
|
|
494
|
+
// For arrow functions with expression bodies (not blocks),
|
|
495
|
+
// still visit the expression to transform JSON calls etc.
|
|
496
|
+
if (body && !ts.isBlock(body) && ts.isArrowFunction(func)) {
|
|
497
|
+
const visitedBody = ctx.ts.visitNode(body, visit);
|
|
498
|
+
if (visitedBody !== body) {
|
|
499
|
+
return ctx.factory.updateArrowFunction(func, func.modifiers, func.typeParameters, func.parameters, func.type, func.equalsGreaterThanToken, visitedBody);
|
|
500
|
+
}
|
|
501
|
+
return func;
|
|
502
|
+
}
|
|
291
503
|
if (!body || !ts.isBlock(body))
|
|
292
504
|
return func;
|
|
505
|
+
// Track validated variables (params and consts with type annotations)
|
|
506
|
+
const validatedVariables = new Map();
|
|
293
507
|
// Add parameter validation
|
|
294
508
|
const validationStatements = [];
|
|
295
509
|
func.parameters.forEach((param) => {
|
|
296
510
|
if (param.type) {
|
|
511
|
+
// Skip 'any' and 'unknown' types - no point validating them
|
|
512
|
+
if (param.type.kind === ts.SyntaxKind.AnyKeyword ||
|
|
513
|
+
param.type.kind === ts.SyntaxKind.UnknownKeyword) {
|
|
514
|
+
return;
|
|
515
|
+
}
|
|
297
516
|
const paramName = ts.isIdentifier(param.name)
|
|
298
517
|
? param.name.text
|
|
299
518
|
: "param";
|
|
300
519
|
const paramIdentifier = ctx.factory.createIdentifier(paramName);
|
|
520
|
+
// Track this parameter as validated for flow analysis
|
|
521
|
+
const paramType = typeChecker.getTypeFromTypeNode(param.type);
|
|
522
|
+
validatedVariables.set(paramName, paramType);
|
|
301
523
|
if (this.config.reusableValidators) {
|
|
302
524
|
// Use reusable validators - use typeToString
|
|
303
|
-
const paramType = typeChecker.getTypeFromTypeNode(param.type);
|
|
304
525
|
const typeText = typeChecker.typeToString(paramType);
|
|
305
526
|
const validatorName = this.getOrCreateValidator(typeText, param.type);
|
|
306
527
|
const validatorCall = ctx.factory.createCallExpression(ctx.factory.createIdentifier(validatorName), undefined, [paramIdentifier]);
|
|
@@ -320,6 +541,27 @@ export class TypicalTransformer {
|
|
|
320
541
|
});
|
|
321
542
|
// First visit all child nodes (including JSON calls) before adding validation
|
|
322
543
|
const visitedBody = ctx.ts.visitNode(body, visit);
|
|
544
|
+
// Also track const declarations with type annotations as validated
|
|
545
|
+
// (the assignment will be validated, and const can't be reassigned)
|
|
546
|
+
const collectConstDeclarations = (node) => {
|
|
547
|
+
if (ts.isVariableStatement(node)) {
|
|
548
|
+
const isConst = (node.declarationList.flags & ts.NodeFlags.Const) !== 0;
|
|
549
|
+
if (isConst) {
|
|
550
|
+
for (const decl of node.declarationList.declarations) {
|
|
551
|
+
if (decl.type && ts.isIdentifier(decl.name)) {
|
|
552
|
+
// Skip any/unknown types
|
|
553
|
+
if (decl.type.kind !== ts.SyntaxKind.AnyKeyword &&
|
|
554
|
+
decl.type.kind !== ts.SyntaxKind.UnknownKeyword) {
|
|
555
|
+
const constType = typeChecker.getTypeFromTypeNode(decl.type);
|
|
556
|
+
validatedVariables.set(decl.name.text, constType);
|
|
557
|
+
}
|
|
558
|
+
}
|
|
559
|
+
}
|
|
560
|
+
}
|
|
561
|
+
}
|
|
562
|
+
ts.forEachChild(node, collectConstDeclarations);
|
|
563
|
+
};
|
|
564
|
+
collectConstDeclarations(visitedBody);
|
|
323
565
|
// Transform return statements - use explicit type or infer from type checker
|
|
324
566
|
let transformedStatements = visitedBody.statements;
|
|
325
567
|
let returnType = func.type;
|
|
@@ -328,11 +570,17 @@ export class TypicalTransformer {
|
|
|
328
570
|
// If no explicit return type, try to infer it from the type checker
|
|
329
571
|
let returnTypeForString;
|
|
330
572
|
if (!returnType) {
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
573
|
+
try {
|
|
574
|
+
const signature = typeChecker.getSignatureFromDeclaration(func);
|
|
575
|
+
if (signature) {
|
|
576
|
+
const inferredReturnType = typeChecker.getReturnTypeOfSignature(signature);
|
|
577
|
+
returnType = typeChecker.typeToTypeNode(inferredReturnType, func, ts.NodeBuilderFlags.InTypeAlias);
|
|
578
|
+
returnTypeForString = inferredReturnType;
|
|
579
|
+
}
|
|
580
|
+
}
|
|
581
|
+
catch {
|
|
582
|
+
// Could not infer signature (e.g., untyped arrow function callback)
|
|
583
|
+
// Skip return type validation for this function
|
|
336
584
|
}
|
|
337
585
|
}
|
|
338
586
|
else {
|
|
@@ -359,9 +607,39 @@ export class TypicalTransformer {
|
|
|
359
607
|
}
|
|
360
608
|
}
|
|
361
609
|
}
|
|
362
|
-
|
|
610
|
+
// Skip 'any' and 'unknown' return types - no point validating them
|
|
611
|
+
const isAnyOrUnknownReturn = returnType && (returnType.kind === ts.SyntaxKind.AnyKeyword ||
|
|
612
|
+
returnType.kind === ts.SyntaxKind.UnknownKeyword);
|
|
613
|
+
if (returnType && returnTypeForString && !isAnyOrUnknownReturn) {
|
|
363
614
|
const returnTransformer = (node) => {
|
|
364
615
|
if (ts.isReturnStatement(node) && node.expression) {
|
|
616
|
+
// Skip return validation if the expression already contains a __typical _parse_* call
|
|
617
|
+
// since typia.assertParse already validates the parsed data
|
|
618
|
+
const containsTypicalParse = (n) => {
|
|
619
|
+
if (ts.isCallExpression(n) && ts.isIdentifier(n.expression)) {
|
|
620
|
+
const name = n.expression.text;
|
|
621
|
+
if (name.startsWith("__typical" + "_parse_")) {
|
|
622
|
+
return true;
|
|
623
|
+
}
|
|
624
|
+
}
|
|
625
|
+
return ts.forEachChild(n, containsTypicalParse) || false;
|
|
626
|
+
};
|
|
627
|
+
if (containsTypicalParse(node.expression)) {
|
|
628
|
+
return node; // Already validated by parse, skip return validation
|
|
629
|
+
}
|
|
630
|
+
// Flow analysis: Skip return validation if returning a validated variable
|
|
631
|
+
// (or property of one) that hasn't been tainted
|
|
632
|
+
const rootVar = getRootIdentifier(node.expression);
|
|
633
|
+
if (rootVar && validatedVariables.has(rootVar)) {
|
|
634
|
+
// Check if the variable has been tainted (mutated, passed to function, etc.)
|
|
635
|
+
if (!isTainted(rootVar, visitedBody)) {
|
|
636
|
+
// Return expression is rooted at a validated, untainted variable
|
|
637
|
+
// For direct returns (identifier) or property access, we can skip validation
|
|
638
|
+
if (ts.isIdentifier(node.expression) || ts.isPropertyAccessExpression(node.expression)) {
|
|
639
|
+
return node; // Skip validation - already validated and untainted
|
|
640
|
+
}
|
|
641
|
+
}
|
|
642
|
+
}
|
|
365
643
|
// For async functions, we need to await the expression before validating
|
|
366
644
|
// because the return expression might be a Promise
|
|
367
645
|
let expressionToValidate = node.expression;
|
|
@@ -451,7 +729,7 @@ export class TypicalTransformer {
|
|
|
451
729
|
if (this.typeValidators.has(typeText)) {
|
|
452
730
|
return this.typeValidators.get(typeText).name;
|
|
453
731
|
}
|
|
454
|
-
const validatorName = `
|
|
732
|
+
const validatorName = `__typical_` + `assert_${this.typeValidators.size}`;
|
|
455
733
|
this.typeValidators.set(typeText, { name: validatorName, typeNode });
|
|
456
734
|
return validatorName;
|
|
457
735
|
}
|
|
@@ -459,7 +737,7 @@ export class TypicalTransformer {
|
|
|
459
737
|
if (this.typeStringifiers.has(typeText)) {
|
|
460
738
|
return this.typeStringifiers.get(typeText).name;
|
|
461
739
|
}
|
|
462
|
-
const stringifierName = `
|
|
740
|
+
const stringifierName = `__typical_` + `stringify_${this.typeStringifiers.size}`;
|
|
463
741
|
this.typeStringifiers.set(typeText, { name: stringifierName, typeNode });
|
|
464
742
|
return stringifierName;
|
|
465
743
|
}
|
|
@@ -467,7 +745,7 @@ export class TypicalTransformer {
|
|
|
467
745
|
if (this.typeParsers.has(typeText)) {
|
|
468
746
|
return this.typeParsers.get(typeText).name;
|
|
469
747
|
}
|
|
470
|
-
const parserName = `
|
|
748
|
+
const parserName = `__typical_` + `parse_${this.typeParsers.size}`;
|
|
471
749
|
this.typeParsers.set(typeText, { name: parserName, typeNode });
|
|
472
750
|
return parserName;
|
|
473
751
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transformer.js","sourceRoot":"","sources":["../../src/transformer.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"transformer.js","sourceRoot":"","sources":["../../src/transformer.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@elliots/typical",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.4",
|
|
4
4
|
"description": "Runtime safe TypeScript transformer using typia",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"type": "module",
|
|
@@ -24,6 +24,8 @@
|
|
|
24
24
|
"build": "tsc",
|
|
25
25
|
"dev": "tsc --watch",
|
|
26
26
|
"test": "rm -f test/test.temp.ts && tsc && node --import ./dist/src/esm-loader-register.js --test dist/test/*.test.js",
|
|
27
|
+
"bench": "cd bench && npm install && npm run bench",
|
|
28
|
+
"test:all": "npm test && npm run bench",
|
|
27
29
|
"prepublishOnly": "npm run build && npm test",
|
|
28
30
|
"sample:esm": "cd samples/esm && npm install && npm run start",
|
|
29
31
|
"sample:ttsx": "cd samples/ttsx && npm install && npm run start",
|
|
@@ -58,9 +60,9 @@
|
|
|
58
60
|
"strip-json-comments": "5.0.3",
|
|
59
61
|
"ts-patch": "3.3.0",
|
|
60
62
|
"tsx": "4.21.0",
|
|
63
|
+
"typescript": "^5.0.0",
|
|
61
64
|
"typia": "11.0.0",
|
|
62
|
-
"unplugin": "2.3.11"
|
|
63
|
-
"typescript": "^5.0.0"
|
|
65
|
+
"unplugin": "2.3.11"
|
|
64
66
|
},
|
|
65
67
|
"devDependencies": {
|
|
66
68
|
"@types/node": "22"
|
package/src/transformer.ts
CHANGED
|
@@ -104,29 +104,31 @@ export class TypicalTransformer {
|
|
|
104
104
|
return transformedSourceFile;
|
|
105
105
|
}
|
|
106
106
|
|
|
107
|
-
//
|
|
107
|
+
// Apply typia transformation
|
|
108
108
|
const printer = this.ts.createPrinter();
|
|
109
109
|
const transformedCode = printer.printFile(transformedSourceFile);
|
|
110
110
|
|
|
111
|
+
if (process.env.DEBUG) {
|
|
112
|
+
console.log("TYPICAL: Before typia transform (first 500 chars):", transformedCode.substring(0, 500));
|
|
113
|
+
}
|
|
114
|
+
|
|
111
115
|
if (transformedCode.includes("typia.")) {
|
|
112
116
|
try {
|
|
113
|
-
//
|
|
114
|
-
|
|
115
|
-
// Create a new source file with the transformed code, preserving original filename
|
|
117
|
+
// Create a new source file from our transformed code
|
|
116
118
|
const newSourceFile = this.ts.createSourceFile(
|
|
117
|
-
sourceFile.fileName,
|
|
119
|
+
sourceFile.fileName,
|
|
118
120
|
transformedCode,
|
|
119
121
|
sourceFile.languageVersion,
|
|
120
122
|
true
|
|
121
123
|
);
|
|
122
124
|
|
|
123
|
-
// Create a new program with the transformed source file so typia
|
|
125
|
+
// Create a new program with the transformed source file so typia can resolve types
|
|
124
126
|
const compilerOptions = this.program.getCompilerOptions();
|
|
125
127
|
const originalSourceFiles = new Map<string, ts.SourceFile>();
|
|
126
128
|
for (const sf of this.program.getSourceFiles()) {
|
|
127
129
|
originalSourceFiles.set(sf.fileName, sf);
|
|
128
130
|
}
|
|
129
|
-
// Replace the original source file with
|
|
131
|
+
// Replace the original source file with our transformed one
|
|
130
132
|
originalSourceFiles.set(sourceFile.fileName, newSourceFile);
|
|
131
133
|
|
|
132
134
|
const customHost: ts.CompilerHost = {
|
|
@@ -141,7 +143,7 @@ export class TypicalTransformer {
|
|
|
141
143
|
true
|
|
142
144
|
);
|
|
143
145
|
},
|
|
144
|
-
getDefaultLibFileName: () => this.ts.getDefaultLibFilePath(
|
|
146
|
+
getDefaultLibFileName: (opts) => this.ts.getDefaultLibFilePath(opts),
|
|
145
147
|
writeFile: () => {},
|
|
146
148
|
getCurrentDirectory: () => this.ts.sys.getCurrentDirectory(),
|
|
147
149
|
getCanonicalFileName: (fileName) =>
|
|
@@ -158,33 +160,62 @@ export class TypicalTransformer {
|
|
|
158
160
|
customHost
|
|
159
161
|
);
|
|
160
162
|
|
|
161
|
-
//
|
|
162
|
-
const
|
|
163
|
+
// Get the bound source file from the new program (has proper symbol tables)
|
|
164
|
+
const boundSourceFile = newProgram.getSourceFile(sourceFile.fileName);
|
|
165
|
+
if (!boundSourceFile) {
|
|
166
|
+
throw new Error(`Failed to get bound source file: ${sourceFile.fileName}`);
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
// Create typia transformer with the NEW program that has our transformed source
|
|
170
|
+
const typiaTransformerFactory = typiaTransform(
|
|
163
171
|
newProgram,
|
|
164
172
|
{},
|
|
165
173
|
{
|
|
166
174
|
addDiagnostic(diag: ts.Diagnostic) {
|
|
167
|
-
|
|
175
|
+
if (process.env.DEBUG) {
|
|
176
|
+
console.warn("Typia diagnostic:", diag);
|
|
177
|
+
}
|
|
168
178
|
return 0;
|
|
169
179
|
},
|
|
170
180
|
}
|
|
171
181
|
);
|
|
172
182
|
|
|
173
|
-
// Apply
|
|
174
|
-
const
|
|
175
|
-
|
|
176
|
-
[typiaTransformer],
|
|
177
|
-
{ ...compilerOptions, sourceMap: true }
|
|
178
|
-
);
|
|
183
|
+
// Apply typia's transformer to the bound source file
|
|
184
|
+
const typiaNodeTransformer = typiaTransformerFactory(context);
|
|
185
|
+
const typiaTransformed = typiaNodeTransformer(boundSourceFile);
|
|
179
186
|
|
|
180
|
-
if (
|
|
181
|
-
const
|
|
182
|
-
|
|
187
|
+
if (process.env.DEBUG) {
|
|
188
|
+
const afterTypia = printer.printFile(typiaTransformed);
|
|
189
|
+
console.log("TYPICAL: After typia transform (first 500 chars):", afterTypia.substring(0, 500));
|
|
190
|
+
}
|
|
183
191
|
|
|
184
|
-
|
|
192
|
+
// Return the typia-transformed source file.
|
|
193
|
+
// We need to recreate imports as synthetic nodes to prevent import elision,
|
|
194
|
+
// since the imports come from a different program context.
|
|
195
|
+
// Skip type-only imports as they shouldn't appear in JS output.
|
|
196
|
+
const syntheticStatements: ts.Statement[] = [];
|
|
197
|
+
for (const stmt of typiaTransformed.statements) {
|
|
198
|
+
if (this.ts.isImportDeclaration(stmt)) {
|
|
199
|
+
// Skip type-only imports (import type X from "y")
|
|
200
|
+
if (stmt.importClause?.isTypeOnly) {
|
|
201
|
+
continue;
|
|
202
|
+
}
|
|
203
|
+
syntheticStatements.push(this.recreateImportDeclaration(stmt, factory));
|
|
204
|
+
} else {
|
|
205
|
+
syntheticStatements.push(stmt);
|
|
206
|
+
}
|
|
185
207
|
}
|
|
186
208
|
|
|
187
|
-
|
|
209
|
+
// Update the source file with synthetic imports
|
|
210
|
+
transformedSourceFile = factory.updateSourceFile(
|
|
211
|
+
typiaTransformed,
|
|
212
|
+
syntheticStatements,
|
|
213
|
+
typiaTransformed.isDeclarationFile,
|
|
214
|
+
typiaTransformed.referencedFiles,
|
|
215
|
+
typiaTransformed.typeReferenceDirectives,
|
|
216
|
+
typiaTransformed.hasNoDefaultLib,
|
|
217
|
+
typiaTransformed.libReferenceDirectives
|
|
218
|
+
);
|
|
188
219
|
} catch (error) {
|
|
189
220
|
console.warn("Failed to apply typia transformer:", sourceFile.fileName, error);
|
|
190
221
|
}
|
|
@@ -195,6 +226,59 @@ export class TypicalTransformer {
|
|
|
195
226
|
};
|
|
196
227
|
}
|
|
197
228
|
|
|
229
|
+
/**
|
|
230
|
+
* Re-create an import declaration as a fully synthetic node.
|
|
231
|
+
* This prevents TypeScript from trying to look up symbol bindings
|
|
232
|
+
* and eliding the import as "unused".
|
|
233
|
+
*/
|
|
234
|
+
private recreateImportDeclaration(
|
|
235
|
+
importDecl: ts.ImportDeclaration,
|
|
236
|
+
factory: ts.NodeFactory
|
|
237
|
+
): ts.ImportDeclaration {
|
|
238
|
+
let importClause: ts.ImportClause | undefined;
|
|
239
|
+
|
|
240
|
+
if (importDecl.importClause) {
|
|
241
|
+
const clause = importDecl.importClause;
|
|
242
|
+
let namedBindings: ts.NamedImportBindings | undefined;
|
|
243
|
+
|
|
244
|
+
if (clause.namedBindings) {
|
|
245
|
+
if (this.ts.isNamespaceImport(clause.namedBindings)) {
|
|
246
|
+
// import * as foo from "bar"
|
|
247
|
+
namedBindings = factory.createNamespaceImport(
|
|
248
|
+
factory.createIdentifier(clause.namedBindings.name.text)
|
|
249
|
+
);
|
|
250
|
+
} else if (this.ts.isNamedImports(clause.namedBindings)) {
|
|
251
|
+
// import { foo, bar } from "baz"
|
|
252
|
+
const elements = clause.namedBindings.elements.map((el) =>
|
|
253
|
+
factory.createImportSpecifier(
|
|
254
|
+
el.isTypeOnly,
|
|
255
|
+
el.propertyName ? factory.createIdentifier(el.propertyName.text) : undefined,
|
|
256
|
+
factory.createIdentifier(el.name.text)
|
|
257
|
+
)
|
|
258
|
+
);
|
|
259
|
+
namedBindings = factory.createNamedImports(elements);
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
importClause = factory.createImportClause(
|
|
264
|
+
clause.isTypeOnly,
|
|
265
|
+
clause.name ? factory.createIdentifier(clause.name.text) : undefined,
|
|
266
|
+
namedBindings
|
|
267
|
+
);
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
const moduleSpecifier = this.ts.isStringLiteral(importDecl.moduleSpecifier)
|
|
271
|
+
? factory.createStringLiteral(importDecl.moduleSpecifier.text)
|
|
272
|
+
: importDecl.moduleSpecifier;
|
|
273
|
+
|
|
274
|
+
return factory.createImportDeclaration(
|
|
275
|
+
importDecl.modifiers,
|
|
276
|
+
importClause,
|
|
277
|
+
moduleSpecifier,
|
|
278
|
+
importDecl.attributes
|
|
279
|
+
);
|
|
280
|
+
}
|
|
281
|
+
|
|
198
282
|
/**
|
|
199
283
|
* Transform a single source file with TypeScript AST
|
|
200
284
|
*/
|
|
@@ -210,10 +294,12 @@ export class TypicalTransformer {
|
|
|
210
294
|
return sourceFile; // Return unchanged for excluded files
|
|
211
295
|
}
|
|
212
296
|
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
297
|
+
if (!sourceFile.fileName.includes('transformer.test.ts')) {
|
|
298
|
+
// Check if this file has already been transformed by us
|
|
299
|
+
const sourceText = sourceFile.getFullText();
|
|
300
|
+
if (sourceText.includes('__typical_' + 'assert_') || sourceText.includes('__typical_' + 'stringify_') || sourceText.includes('__typical_' + 'parse_')) {
|
|
301
|
+
throw new Error(`File ${sourceFile.fileName} has already been transformed by Typical! Double transformation detected.`);
|
|
302
|
+
}
|
|
217
303
|
}
|
|
218
304
|
|
|
219
305
|
// Reset caches for each file
|
|
@@ -238,6 +324,17 @@ export class TypicalTransformer {
|
|
|
238
324
|
|
|
239
325
|
if (propertyAccess.name.text === "stringify") {
|
|
240
326
|
// For stringify, we need to infer the type from the argument
|
|
327
|
+
// First check if the argument type is 'any' - if so, skip transformation
|
|
328
|
+
if (node.arguments.length > 0) {
|
|
329
|
+
const arg = node.arguments[0];
|
|
330
|
+
const argType = typeChecker.getTypeAtLocation(arg);
|
|
331
|
+
const typeFlags = argType.flags;
|
|
332
|
+
// Skip if type is any (1) or unknown (2)
|
|
333
|
+
if (typeFlags & ts.TypeFlags.Any || typeFlags & ts.TypeFlags.Unknown) {
|
|
334
|
+
return node; // Don't transform JSON.stringify for any/unknown types
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
|
|
241
338
|
if (this.config.reusableValidators) {
|
|
242
339
|
// For JSON.stringify, try to infer the type from the argument
|
|
243
340
|
let typeText = "unknown";
|
|
@@ -385,10 +482,32 @@ export class TypicalTransformer {
|
|
|
385
482
|
funcParent = funcParent.parent;
|
|
386
483
|
}
|
|
387
484
|
break;
|
|
485
|
+
} else if (ts.isArrowFunction(parent) && parent.type) {
|
|
486
|
+
// Arrow function with expression body (not block)
|
|
487
|
+
// e.g., (s: string): User => JSON.parse(s)
|
|
488
|
+
targetType = parent.type;
|
|
489
|
+
break;
|
|
388
490
|
}
|
|
389
491
|
parent = parent.parent;
|
|
390
492
|
}
|
|
391
493
|
|
|
494
|
+
// Skip transformation if target type is any or unknown
|
|
495
|
+
const isAnyOrUnknown = targetType && (
|
|
496
|
+
targetType.kind === ts.SyntaxKind.AnyKeyword ||
|
|
497
|
+
targetType.kind === ts.SyntaxKind.UnknownKeyword
|
|
498
|
+
);
|
|
499
|
+
|
|
500
|
+
if (isAnyOrUnknown) {
|
|
501
|
+
// Don't transform JSON.parse for any/unknown types
|
|
502
|
+
return node;
|
|
503
|
+
}
|
|
504
|
+
|
|
505
|
+
// If we can't determine the target type and there's no explicit type argument,
|
|
506
|
+
// don't transform - we can't validate against an unknown type
|
|
507
|
+
if (!targetType && !node.typeArguments) {
|
|
508
|
+
return node;
|
|
509
|
+
}
|
|
510
|
+
|
|
392
511
|
if (this.config.reusableValidators && targetType) {
|
|
393
512
|
// Use reusable parser - use typeToString
|
|
394
513
|
const targetTypeObj = typeChecker.getTypeFromTypeNode(targetType);
|
|
@@ -446,25 +565,189 @@ export class TypicalTransformer {
|
|
|
446
565
|
return ctx.ts.visitEachChild(node, visit, ctx.context);
|
|
447
566
|
};
|
|
448
567
|
|
|
568
|
+
// Helper functions for flow analysis
|
|
569
|
+
const getRootIdentifier = (expr: ts.Expression): string | undefined => {
|
|
570
|
+
if (ts.isIdentifier(expr)) {
|
|
571
|
+
return expr.text;
|
|
572
|
+
}
|
|
573
|
+
if (ts.isPropertyAccessExpression(expr)) {
|
|
574
|
+
return getRootIdentifier(expr.expression);
|
|
575
|
+
}
|
|
576
|
+
return undefined;
|
|
577
|
+
};
|
|
578
|
+
|
|
579
|
+
const containsReference = (expr: ts.Expression, name: string): boolean => {
|
|
580
|
+
if (ts.isIdentifier(expr) && expr.text === name) {
|
|
581
|
+
return true;
|
|
582
|
+
}
|
|
583
|
+
if (ts.isPropertyAccessExpression(expr)) {
|
|
584
|
+
return containsReference(expr.expression, name);
|
|
585
|
+
}
|
|
586
|
+
if (ts.isElementAccessExpression(expr)) {
|
|
587
|
+
return containsReference(expr.expression, name) ||
|
|
588
|
+
containsReference(expr.argumentExpression as ts.Expression, name);
|
|
589
|
+
}
|
|
590
|
+
// Check all children
|
|
591
|
+
let found = false;
|
|
592
|
+
ts.forEachChild(expr, (child) => {
|
|
593
|
+
if (ts.isExpression(child) && containsReference(child, name)) {
|
|
594
|
+
found = true;
|
|
595
|
+
}
|
|
596
|
+
});
|
|
597
|
+
return found;
|
|
598
|
+
};
|
|
599
|
+
|
|
600
|
+
// Check if a validated variable has been tainted in the function body
|
|
601
|
+
const isTainted = (varName: string, body: ts.Block): boolean => {
|
|
602
|
+
let tainted = false;
|
|
603
|
+
|
|
604
|
+
// First pass: collect aliases (variables that reference properties of varName)
|
|
605
|
+
// e.g., const addr = user.address; -> addr is an alias
|
|
606
|
+
const aliases = new Set<string>([varName]);
|
|
607
|
+
|
|
608
|
+
const collectAliases = (node: ts.Node): void => {
|
|
609
|
+
// Look for: const/let x = varName.property or const/let x = varName
|
|
610
|
+
if (ts.isVariableStatement(node)) {
|
|
611
|
+
for (const decl of node.declarationList.declarations) {
|
|
612
|
+
if (ts.isIdentifier(decl.name) && decl.initializer) {
|
|
613
|
+
// Check if initializer is rooted at our tracked variable or any existing alias
|
|
614
|
+
const initRoot = getRootIdentifier(decl.initializer);
|
|
615
|
+
if (initRoot && aliases.has(initRoot)) {
|
|
616
|
+
aliases.add(decl.name.text);
|
|
617
|
+
}
|
|
618
|
+
}
|
|
619
|
+
}
|
|
620
|
+
}
|
|
621
|
+
ts.forEachChild(node, collectAliases);
|
|
622
|
+
};
|
|
623
|
+
collectAliases(body);
|
|
624
|
+
|
|
625
|
+
// Helper to check if any alias is involved
|
|
626
|
+
const involvesTrackedVar = (expr: ts.Expression): boolean => {
|
|
627
|
+
const root = getRootIdentifier(expr);
|
|
628
|
+
return root !== undefined && aliases.has(root);
|
|
629
|
+
};
|
|
630
|
+
|
|
631
|
+
const checkTainting = (node: ts.Node): void => {
|
|
632
|
+
if (tainted) return; // Early exit if already tainted
|
|
633
|
+
|
|
634
|
+
// Reassignment: trackedVar = ...
|
|
635
|
+
if (ts.isBinaryExpression(node) &&
|
|
636
|
+
node.operatorToken.kind === ts.SyntaxKind.EqualsToken &&
|
|
637
|
+
ts.isIdentifier(node.left) &&
|
|
638
|
+
aliases.has(node.left.text)) {
|
|
639
|
+
tainted = true;
|
|
640
|
+
return;
|
|
641
|
+
}
|
|
642
|
+
|
|
643
|
+
// Property assignment: trackedVar.x = ... or alias.x = ...
|
|
644
|
+
if (ts.isBinaryExpression(node) &&
|
|
645
|
+
node.operatorToken.kind === ts.SyntaxKind.EqualsToken &&
|
|
646
|
+
ts.isPropertyAccessExpression(node.left) &&
|
|
647
|
+
involvesTrackedVar(node.left)) {
|
|
648
|
+
tainted = true;
|
|
649
|
+
return;
|
|
650
|
+
}
|
|
651
|
+
|
|
652
|
+
// Element assignment: trackedVar[x] = ... or alias[x] = ...
|
|
653
|
+
if (ts.isBinaryExpression(node) &&
|
|
654
|
+
node.operatorToken.kind === ts.SyntaxKind.EqualsToken &&
|
|
655
|
+
ts.isElementAccessExpression(node.left) &&
|
|
656
|
+
involvesTrackedVar(node.left.expression)) {
|
|
657
|
+
tainted = true;
|
|
658
|
+
return;
|
|
659
|
+
}
|
|
660
|
+
|
|
661
|
+
// Passed as argument to a function: fn(trackedVar) or fn(alias)
|
|
662
|
+
if (ts.isCallExpression(node)) {
|
|
663
|
+
for (const arg of node.arguments) {
|
|
664
|
+
// Check if any tracked variable or alias appears in the argument
|
|
665
|
+
let hasTrackedRef = false;
|
|
666
|
+
const checkRef = (n: ts.Node): void => {
|
|
667
|
+
if (ts.isIdentifier(n) && aliases.has(n.text)) {
|
|
668
|
+
hasTrackedRef = true;
|
|
669
|
+
}
|
|
670
|
+
ts.forEachChild(n, checkRef);
|
|
671
|
+
};
|
|
672
|
+
checkRef(arg);
|
|
673
|
+
if (hasTrackedRef) {
|
|
674
|
+
tainted = true;
|
|
675
|
+
return;
|
|
676
|
+
}
|
|
677
|
+
}
|
|
678
|
+
}
|
|
679
|
+
|
|
680
|
+
// Method call on the variable: trackedVar.method() or alias.method()
|
|
681
|
+
if (ts.isCallExpression(node) &&
|
|
682
|
+
ts.isPropertyAccessExpression(node.expression) &&
|
|
683
|
+
involvesTrackedVar(node.expression.expression)) {
|
|
684
|
+
tainted = true;
|
|
685
|
+
return;
|
|
686
|
+
}
|
|
687
|
+
|
|
688
|
+
// Await expression (async boundary - external code could run)
|
|
689
|
+
if (ts.isAwaitExpression(node)) {
|
|
690
|
+
tainted = true;
|
|
691
|
+
return;
|
|
692
|
+
}
|
|
693
|
+
|
|
694
|
+
ts.forEachChild(node, checkTainting);
|
|
695
|
+
};
|
|
696
|
+
|
|
697
|
+
checkTainting(body);
|
|
698
|
+
return tainted;
|
|
699
|
+
};
|
|
700
|
+
|
|
449
701
|
const transformFunction = (
|
|
450
702
|
func: ts.FunctionDeclaration | ts.ArrowFunction | ts.MethodDeclaration
|
|
451
703
|
): ts.Node => {
|
|
452
704
|
const body = func.body;
|
|
705
|
+
|
|
706
|
+
// For arrow functions with expression bodies (not blocks),
|
|
707
|
+
// still visit the expression to transform JSON calls etc.
|
|
708
|
+
if (body && !ts.isBlock(body) && ts.isArrowFunction(func)) {
|
|
709
|
+
const visitedBody = ctx.ts.visitNode(body, visit) as ts.Expression;
|
|
710
|
+
if (visitedBody !== body) {
|
|
711
|
+
return ctx.factory.updateArrowFunction(
|
|
712
|
+
func,
|
|
713
|
+
func.modifiers,
|
|
714
|
+
func.typeParameters,
|
|
715
|
+
func.parameters,
|
|
716
|
+
func.type,
|
|
717
|
+
func.equalsGreaterThanToken,
|
|
718
|
+
visitedBody
|
|
719
|
+
);
|
|
720
|
+
}
|
|
721
|
+
return func;
|
|
722
|
+
}
|
|
723
|
+
|
|
453
724
|
if (!body || !ts.isBlock(body)) return func;
|
|
454
725
|
|
|
726
|
+
// Track validated variables (params and consts with type annotations)
|
|
727
|
+
const validatedVariables = new Map<string, ts.Type>();
|
|
728
|
+
|
|
455
729
|
// Add parameter validation
|
|
456
730
|
const validationStatements: ts.Statement[] = [];
|
|
457
731
|
|
|
458
732
|
func.parameters.forEach((param) => {
|
|
459
733
|
if (param.type) {
|
|
734
|
+
// Skip 'any' and 'unknown' types - no point validating them
|
|
735
|
+
if (param.type.kind === ts.SyntaxKind.AnyKeyword ||
|
|
736
|
+
param.type.kind === ts.SyntaxKind.UnknownKeyword) {
|
|
737
|
+
return;
|
|
738
|
+
}
|
|
739
|
+
|
|
460
740
|
const paramName = ts.isIdentifier(param.name)
|
|
461
741
|
? param.name.text
|
|
462
742
|
: "param";
|
|
463
743
|
const paramIdentifier = ctx.factory.createIdentifier(paramName);
|
|
464
744
|
|
|
745
|
+
// Track this parameter as validated for flow analysis
|
|
746
|
+
const paramType = typeChecker.getTypeFromTypeNode(param.type);
|
|
747
|
+
validatedVariables.set(paramName, paramType);
|
|
748
|
+
|
|
465
749
|
if (this.config.reusableValidators) {
|
|
466
750
|
// Use reusable validators - use typeToString
|
|
467
|
-
const paramType = typeChecker.getTypeFromTypeNode(param.type);
|
|
468
751
|
const typeText = typeChecker.typeToString(paramType);
|
|
469
752
|
const validatorName = this.getOrCreateValidator(
|
|
470
753
|
typeText,
|
|
@@ -504,6 +787,28 @@ export class TypicalTransformer {
|
|
|
504
787
|
// First visit all child nodes (including JSON calls) before adding validation
|
|
505
788
|
const visitedBody = ctx.ts.visitNode(body, visit) as ts.Block;
|
|
506
789
|
|
|
790
|
+
// Also track const declarations with type annotations as validated
|
|
791
|
+
// (the assignment will be validated, and const can't be reassigned)
|
|
792
|
+
const collectConstDeclarations = (node: ts.Node): void => {
|
|
793
|
+
if (ts.isVariableStatement(node)) {
|
|
794
|
+
const isConst = (node.declarationList.flags & ts.NodeFlags.Const) !== 0;
|
|
795
|
+
if (isConst) {
|
|
796
|
+
for (const decl of node.declarationList.declarations) {
|
|
797
|
+
if (decl.type && ts.isIdentifier(decl.name)) {
|
|
798
|
+
// Skip any/unknown types
|
|
799
|
+
if (decl.type.kind !== ts.SyntaxKind.AnyKeyword &&
|
|
800
|
+
decl.type.kind !== ts.SyntaxKind.UnknownKeyword) {
|
|
801
|
+
const constType = typeChecker.getTypeFromTypeNode(decl.type);
|
|
802
|
+
validatedVariables.set(decl.name.text, constType);
|
|
803
|
+
}
|
|
804
|
+
}
|
|
805
|
+
}
|
|
806
|
+
}
|
|
807
|
+
}
|
|
808
|
+
ts.forEachChild(node, collectConstDeclarations);
|
|
809
|
+
};
|
|
810
|
+
collectConstDeclarations(visitedBody);
|
|
811
|
+
|
|
507
812
|
// Transform return statements - use explicit type or infer from type checker
|
|
508
813
|
let transformedStatements = visitedBody.statements;
|
|
509
814
|
let returnType = func.type;
|
|
@@ -516,15 +821,20 @@ export class TypicalTransformer {
|
|
|
516
821
|
// If no explicit return type, try to infer it from the type checker
|
|
517
822
|
let returnTypeForString: ts.Type | undefined;
|
|
518
823
|
if (!returnType) {
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
824
|
+
try {
|
|
825
|
+
const signature = typeChecker.getSignatureFromDeclaration(func);
|
|
826
|
+
if (signature) {
|
|
827
|
+
const inferredReturnType = typeChecker.getReturnTypeOfSignature(signature);
|
|
828
|
+
returnType = typeChecker.typeToTypeNode(
|
|
829
|
+
inferredReturnType,
|
|
830
|
+
func,
|
|
831
|
+
ts.NodeBuilderFlags.InTypeAlias
|
|
832
|
+
);
|
|
833
|
+
returnTypeForString = inferredReturnType;
|
|
834
|
+
}
|
|
835
|
+
} catch {
|
|
836
|
+
// Could not infer signature (e.g., untyped arrow function callback)
|
|
837
|
+
// Skip return type validation for this function
|
|
528
838
|
}
|
|
529
839
|
} else {
|
|
530
840
|
// For explicit return types, get the Type from the TypeNode
|
|
@@ -555,9 +865,44 @@ export class TypicalTransformer {
|
|
|
555
865
|
}
|
|
556
866
|
}
|
|
557
867
|
|
|
558
|
-
|
|
868
|
+
// Skip 'any' and 'unknown' return types - no point validating them
|
|
869
|
+
const isAnyOrUnknownReturn = returnType && (
|
|
870
|
+
returnType.kind === ts.SyntaxKind.AnyKeyword ||
|
|
871
|
+
returnType.kind === ts.SyntaxKind.UnknownKeyword
|
|
872
|
+
);
|
|
873
|
+
|
|
874
|
+
if (returnType && returnTypeForString && !isAnyOrUnknownReturn) {
|
|
559
875
|
const returnTransformer = (node: ts.Node): ts.Node => {
|
|
560
876
|
if (ts.isReturnStatement(node) && node.expression) {
|
|
877
|
+
// Skip return validation if the expression already contains a __typical _parse_* call
|
|
878
|
+
// since typia.assertParse already validates the parsed data
|
|
879
|
+
const containsTypicalParse = (n: ts.Node): boolean => {
|
|
880
|
+
if (ts.isCallExpression(n) && ts.isIdentifier(n.expression)) {
|
|
881
|
+
const name = n.expression.text;
|
|
882
|
+
if (name.startsWith("__typical" + "_parse_")) {
|
|
883
|
+
return true;
|
|
884
|
+
}
|
|
885
|
+
}
|
|
886
|
+
return ts.forEachChild(n, containsTypicalParse) || false;
|
|
887
|
+
};
|
|
888
|
+
if (containsTypicalParse(node.expression)) {
|
|
889
|
+
return node; // Already validated by parse, skip return validation
|
|
890
|
+
}
|
|
891
|
+
|
|
892
|
+
// Flow analysis: Skip return validation if returning a validated variable
|
|
893
|
+
// (or property of one) that hasn't been tainted
|
|
894
|
+
const rootVar = getRootIdentifier(node.expression);
|
|
895
|
+
if (rootVar && validatedVariables.has(rootVar)) {
|
|
896
|
+
// Check if the variable has been tainted (mutated, passed to function, etc.)
|
|
897
|
+
if (!isTainted(rootVar, visitedBody)) {
|
|
898
|
+
// Return expression is rooted at a validated, untainted variable
|
|
899
|
+
// For direct returns (identifier) or property access, we can skip validation
|
|
900
|
+
if (ts.isIdentifier(node.expression) || ts.isPropertyAccessExpression(node.expression)) {
|
|
901
|
+
return node; // Skip validation - already validated and untainted
|
|
902
|
+
}
|
|
903
|
+
}
|
|
904
|
+
}
|
|
905
|
+
|
|
561
906
|
// For async functions, we need to await the expression before validating
|
|
562
907
|
// because the return expression might be a Promise
|
|
563
908
|
let expressionToValidate = node.expression;
|
|
@@ -746,7 +1091,7 @@ export class TypicalTransformer {
|
|
|
746
1091
|
return this.typeValidators.get(typeText)!.name;
|
|
747
1092
|
}
|
|
748
1093
|
|
|
749
|
-
const validatorName = `
|
|
1094
|
+
const validatorName = `__typical_` + `assert_${this.typeValidators.size}`;
|
|
750
1095
|
this.typeValidators.set(typeText, { name: validatorName, typeNode });
|
|
751
1096
|
return validatorName;
|
|
752
1097
|
}
|
|
@@ -759,7 +1104,7 @@ export class TypicalTransformer {
|
|
|
759
1104
|
return this.typeStringifiers.get(typeText)!.name;
|
|
760
1105
|
}
|
|
761
1106
|
|
|
762
|
-
const stringifierName = `
|
|
1107
|
+
const stringifierName = `__typical_` + `stringify_${this.typeStringifiers.size}`;
|
|
763
1108
|
this.typeStringifiers.set(typeText, { name: stringifierName, typeNode });
|
|
764
1109
|
return stringifierName;
|
|
765
1110
|
}
|
|
@@ -769,7 +1114,7 @@ export class TypicalTransformer {
|
|
|
769
1114
|
return this.typeParsers.get(typeText)!.name;
|
|
770
1115
|
}
|
|
771
1116
|
|
|
772
|
-
const parserName = `
|
|
1117
|
+
const parserName = `__typical_` + `parse_${this.typeParsers.size}`;
|
|
773
1118
|
this.typeParsers.set(typeText, { name: parserName, typeNode });
|
|
774
1119
|
return parserName;
|
|
775
1120
|
}
|
package/src/tsc-plugin.ts
CHANGED
|
@@ -6,7 +6,7 @@ import { loadConfig } from './config.js';
|
|
|
6
6
|
export default function (program: ts.Program, pluginConfig: PluginConfig, { ts: tsInstance }: TransformerExtras) {
|
|
7
7
|
const config = loadConfig();
|
|
8
8
|
const transformer = new TypicalTransformer(config, program, tsInstance);
|
|
9
|
-
|
|
9
|
+
|
|
10
10
|
// Create the typical transformer with typia integration
|
|
11
11
|
return transformer.getTransformer(true);
|
|
12
12
|
}
|