mirror of
https://github.com/bendtherules/ts-transformer-visualizer.git
synced 2026-08-18 22:01:45 +00:00
examples - refactor to load transformer from separate file
This commit is contained in:
@@ -1,61 +0,0 @@
|
||||
import React, { Component } from "react";
|
||||
|
||||
import {
|
||||
ASTVisualizer,
|
||||
initSourceFile,
|
||||
updateSourceFile
|
||||
} from "ts-transformer-visualizer";
|
||||
import * as ts from "typescript";
|
||||
|
||||
const source = "x = y;\nx=1;\nx=y=z;";
|
||||
|
||||
const mainFile = ts.createSourceFile("/test", source, ts.ScriptTarget.ES2015);
|
||||
|
||||
const transformer = context => {
|
||||
return sourceFile => {
|
||||
/**
|
||||
*
|
||||
* @param {ts.Node} node
|
||||
* @returns {ts.VisitResult<ts.Node>}
|
||||
*/
|
||||
const visitor = node => {
|
||||
if (
|
||||
ts.isBinaryExpression(node) &&
|
||||
node.operatorToken.kind === ts.SyntaxKind.EqualsToken &&
|
||||
ts.isIdentifier(node.left) &&
|
||||
ts.isIdentifier(node.right)
|
||||
) {
|
||||
return ts.updateBinary(node, node.right, node.left);
|
||||
}
|
||||
|
||||
return ts.visitEachChild(node, visitor, context);
|
||||
};
|
||||
return ts.visitNode(sourceFile, visitor);
|
||||
};
|
||||
};
|
||||
|
||||
// const printer = ts.createPrinter();
|
||||
// const result = ts.transform(mainFile, [transformer]);
|
||||
// const transformedSourceFile = result.transformed[0];
|
||||
// const newContent = printer.printFile(transformedSourceFile);
|
||||
// result.dispose();
|
||||
|
||||
// console.log(newContent);
|
||||
|
||||
export default class App extends Component {
|
||||
componentDidMount() {
|
||||
initSourceFile(mainFile);
|
||||
|
||||
setTimeout(() => {
|
||||
const modifiedFile = ts.transform(mainFile, [transformer]).transformed[0];
|
||||
updateSourceFile(modifiedFile);
|
||||
}, 5000);
|
||||
}
|
||||
render() {
|
||||
return (
|
||||
<div>
|
||||
<ASTVisualizer />
|
||||
</div>
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,48 @@
|
||||
import React, { useEffect } from "react";
|
||||
|
||||
import {
|
||||
ASTVisualizer,
|
||||
initSourceFile,
|
||||
updateSourceFile,
|
||||
clearSourceFile
|
||||
} from "ts-transformer-visualizer";
|
||||
import * as ts from "typescript";
|
||||
|
||||
import { moduleMap, ModuleNames } from "./transforms";
|
||||
|
||||
// result.dispose();
|
||||
|
||||
export default function App({
|
||||
moduleName,
|
||||
timeDelayMs = 3000
|
||||
}: {
|
||||
moduleName: ModuleNames;
|
||||
timeDelayMs?: number;
|
||||
}) {
|
||||
// Create sourceFile and reset on route change
|
||||
useEffect(() => {
|
||||
const { sourceCodeString, transformer } = moduleMap[moduleName];
|
||||
|
||||
// 1. Create sourceFile and pass it to visualizer
|
||||
const mainFile = ts.createSourceFile(
|
||||
"/test",
|
||||
sourceCodeString,
|
||||
ts.ScriptTarget.ES2015
|
||||
);
|
||||
initSourceFile(mainFile);
|
||||
|
||||
// 2. Set timeout to run transformer and update visualizer
|
||||
const timeoutID = setTimeout(() => {
|
||||
const modifiedFile = ts.transform(mainFile, [transformer]).transformed[0];
|
||||
updateSourceFile(modifiedFile);
|
||||
}, timeDelayMs);
|
||||
|
||||
return () => {
|
||||
// 3. Clean timeout and reset visualizer
|
||||
clearTimeout(timeoutID);
|
||||
clearSourceFile();
|
||||
};
|
||||
});
|
||||
|
||||
return <ASTVisualizer />;
|
||||
}
|
||||
@@ -4,4 +4,7 @@ import ReactDOM from "react-dom";
|
||||
import "./index.css";
|
||||
import App from "./App";
|
||||
|
||||
ReactDOM.render(<App />, document.getElementById("root"));
|
||||
ReactDOM.render(
|
||||
<App moduleName="swap-expression" />,
|
||||
document.getElementById("root")
|
||||
);
|
||||
|
||||
@@ -0,0 +1,8 @@
|
||||
import SwapExpression from "./swap-expression";
|
||||
import { TransformModuleExport } from "src/types";
|
||||
|
||||
export type ModuleNames = "swap-expression";
|
||||
|
||||
export const moduleMap: { [key in ModuleNames]: TransformModuleExport } = {
|
||||
"swap-expression": SwapExpression
|
||||
};
|
||||
@@ -0,0 +1,30 @@
|
||||
import * as ts from "typescript";
|
||||
import { TransformModuleExport } from "../types";
|
||||
|
||||
const sourceCodeString = `x = y; a = b + c`;
|
||||
|
||||
const transformer: ts.TransformerFactory<ts.SourceFile> = context => {
|
||||
return sourceFile => {
|
||||
const visitor = (node: ts.Node): ts.Node => {
|
||||
if (
|
||||
ts.isBinaryExpression(node) &&
|
||||
node.operatorToken.kind === ts.SyntaxKind.EqualsToken &&
|
||||
ts.isIdentifier(node.left) &&
|
||||
ts.isIdentifier(node.right)
|
||||
) {
|
||||
return ts.updateBinary(node, node.right, node.left);
|
||||
}
|
||||
|
||||
return ts.visitEachChild(node, visitor, context);
|
||||
};
|
||||
|
||||
return ts.visitNode(sourceFile, visitor);
|
||||
};
|
||||
};
|
||||
|
||||
const toExport: TransformModuleExport = {
|
||||
sourceCodeString,
|
||||
transformer
|
||||
};
|
||||
|
||||
export default toExport;
|
||||
@@ -0,0 +1,6 @@
|
||||
import * as ts from "typescript";
|
||||
|
||||
export interface TransformModuleExport {
|
||||
sourceCodeString: string;
|
||||
transformer: ts.TransformerFactory<ts.SourceFile>;
|
||||
}
|
||||
Reference in New Issue
Block a user