37 lines
1.4 KiB
TypeScript
37 lines
1.4 KiB
TypeScript
|
import * as ts from "typescript";
|
||
|
|
||
|
// Custom Typescript AST transformer for use with ts-jest / jest-preset-angular
|
||
|
// Removes specified ES2020 syntax from source code, as node does not support it yet
|
||
|
// Reference: https://kulshekhar.github.io/ts-jest/docs/getting-started/options/astTransformers
|
||
|
// Use this tool to understand how we identify and filter AST nodes: https://ts-ast-viewer.com/
|
||
|
|
||
|
/**
|
||
|
* Remember to increase the version whenever transformer's content is changed. This is to inform Jest to not reuse
|
||
|
* the previous cache which contains old transformer's content
|
||
|
*/
|
||
|
export const version = 1;
|
||
|
export const name = "bit-es2020-transformer";
|
||
|
|
||
|
// Returns true for 'import.meta' statements
|
||
|
const isImportMetaStatement = (node: ts.Node) =>
|
||
|
ts.isPropertyAccessExpression(node) &&
|
||
|
ts.isMetaProperty(node.expression) &&
|
||
|
node.expression.keywordToken === ts.SyntaxKind.ImportKeyword;
|
||
|
|
||
|
export const factory = function (/*opts?: Opts*/) {
|
||
|
function visitor(ctx: ts.TransformationContext, sf: ts.SourceFile) {
|
||
|
const visitor: ts.Visitor = (node: ts.Node): ts.VisitResult<any> => {
|
||
|
if (isImportMetaStatement(node)) {
|
||
|
return null;
|
||
|
}
|
||
|
|
||
|
// Continue searching child nodes
|
||
|
return ts.visitEachChild(node, visitor, ctx);
|
||
|
};
|
||
|
return visitor;
|
||
|
}
|
||
|
return (ctx: ts.TransformationContext): ts.Transformer<any> => {
|
||
|
return (sf: ts.SourceFile) => ts.visitNode(sf, visitor(ctx, sf));
|
||
|
};
|
||
|
};
|