// Input
class Foo {
templateString = 'some value';
}
// Output
import __LIB__ from '@scope/lib/path/to/lib';
class Foo {
templateString = (function compiledTemplate(deps) {
// ...
return result;
})({lib: __LIB__});
}
实际上,我有两个问题:
- 如何从字符串中创建AST-FRAGMENT?
- 如何添加导入?
P.S。我尝试了各种方法createSourceFile
和ts.createImportDeclaration
,但是它们都导致了这个错误:[
要添加任意文本,我知道的最好方法是将createIdentifier
与要插入的字符串一起使用。
要添加导入语句,请记住,您正在更新树而无需突变原始。
ts.visitEachChild
API采用nodesVisitor
参数,该参数专门在NodeArray
s上运行。通常,如果您不通过nodesVisitor
进入,则使用visitor
参数传递的第一个回调,它将在NodeArray
中的每个Node
上操作,但是在这里您特别想在完整的节点阵列上操作。
在您的情况下,您对SourceFile
的语句感兴趣(这是NodeArray<Statement>
。您可以使用createImportDeclaration
创建导入,并通过在nodesVisitor
中传递SourceFile
,如下:
function addImport(statements: ts.NodeArray<ts.Statement>) {
const importStatement = ts.createImportStatement(/*...*/);
return ts.createNodeArray([importStatement, ...statements]);
}
visitEachChild(
sourceFile,
/*replace this with something that controls traversal*/ x => x,
context,
addImport);