Skip to content

Commit

Permalink
fix: unit test passes
Browse files Browse the repository at this point in the history
  • Loading branch information
tvillaren committed Feb 15, 2024
1 parent dd1ca0f commit db7da40
Showing 1 changed file with 47 additions and 34 deletions.
81 changes: 47 additions & 34 deletions src/utils/fixOptionalAny.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import ts, { factory as f } from "typescript";
import { getImportIdentifiers } from "./importHandling";

/**
* Add optional property to `any` to workaround comparison issue.
Expand All @@ -12,49 +13,61 @@ export function fixOptionalAny(sourceText: string) {
ts.ScriptTarget.Latest
);

// Apply transformation
const outputFile = ts.transform(sourceFile, [markAnyAsOptional]);

// Printing the transformed file
const printer = ts.createPrinter({ newLine: ts.NewLineKind.LineFeed });
return printer.printFile(outputFile.transformed[0]);
}
// Extracting imports
const importNamesAvailable = new Set<string>();
const extractImportIdentifiers = (node: ts.Node) => {
if (ts.isImportDeclaration(node) && node.importClause) {
const identifiers = getImportIdentifiers(node);
identifiers.forEach((i) => importNamesAvailable.add(i));
}
};
ts.forEachChild(sourceFile, extractImportIdentifiers);

const markAnyAsOptional: ts.TransformerFactory<ts.SourceFile> = (context) => {
const visit: ts.Visitor = (node) => {
node = ts.visitEachChild(node, visit, context);
function shouldAddQuestionToken(node: ts.TypeNode) {
return (
node.kind === ts.SyntaxKind.AnyKeyword ||
(ts.isTypeReferenceNode(node) &&
importNamesAvailable.has(node.typeName.getText(sourceFile)))
);
}

if (ts.isPropertySignature(node) && node.type) {
const typeNode = node.type;
const markAnyAsOptional: ts.TransformerFactory<ts.SourceFile> = (context) => {
const visit: ts.Visitor = (node) => {
node = ts.visitEachChild(node, visit, context);

if (shouldAddQuestionToken(typeNode)) {
return createOptionalPropertyNode(node);
}
if (ts.isPropertySignature(node) && node.type) {
const typeNode = node.type;

// Handling nested Any / TypeReference
if (ts.isUnionTypeNode(typeNode) || ts.isIntersectionTypeNode(typeNode)) {
const withQuestionToken = typeNode.types.filter((childNode) =>
shouldAddQuestionToken(childNode)
);
if (withQuestionToken.length > 0)
if (shouldAddQuestionToken(typeNode)) {
return createOptionalPropertyNode(node);
}

// Handling nested Any / TypeReference
if (
ts.isUnionTypeNode(typeNode) ||
ts.isIntersectionTypeNode(typeNode)
) {
const withQuestionToken = typeNode.types.filter((childNode) =>
shouldAddQuestionToken(childNode)
);
if (withQuestionToken.length > 0)
return createOptionalPropertyNode(node);
}
}
}
return node;
};
return node;
};

return (sourceFile) => ts.visitNode(sourceFile, visit) as ts.SourceFile;
};
return (sourceFile) => {
return ts.visitNode(sourceFile, visit) as ts.SourceFile;
};
};

function shouldAddQuestionToken(node: ts.TypeNode) {
return (
node.kind === ts.SyntaxKind.AnyKeyword ||
(ts.isTypeReferenceNode(node) && isImportedTypeReferenceNode(node))
);
}
// Apply transformation
const outputFile = ts.transform(sourceFile, [markAnyAsOptional]);

function isImportedTypeReferenceNode(node: ts.TypeReferenceNode) {
return true;
// Printing the transformed file
const printer = ts.createPrinter({ newLine: ts.NewLineKind.LineFeed });
return printer.printFile(outputFile.transformed[0]);
}

function createOptionalPropertyNode(node: ts.PropertySignature) {
Expand Down

0 comments on commit db7da40

Please sign in to comment.