UNPKG

ts-simple-ast

Version:

TypeScript compiler wrapper for AST navigation and code generation.

172 lines (135 loc) 14.8 kB
<!doctype html> <html> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"> <title>ts-simple-ast - File System</title> <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-alpha.6/css/bootstrap.min.css" integrity="sha384-rwoIResjU2yc3z8GV/NPeZWAv56rSmLldC3R/AZzGRnGxQQKnKkoFVhFQhNUwEyJ" crossorigin="anonymous"> <link rel="stylesheet" href="/assets/css/style.css?v=502728dc7b09041e36b06c50f79a13adbfb6f1b2"> <!-- <link rel="stylesheet" href="/assets/css/style.css?v=502728dc7b09041e36b06c50f79a13adbfb6f1b2"> <link rel="stylesheet" href="/assets/css/custom-style.css?v=502728dc7b09041e36b06c50f79a13adbfb6f1b2"> <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script> <script src="/assets/js/main.js"></script>--> </head> <body> <div class="main"> <header class="container"> <div class="row"> <h1 onclick="document.location.href = '/'" class="headerLink">ts-simple-ast</h1> <!--<p class="subText">Simple way to navigate and manipulate the TypeScript AST.</p>--> </div> </header> <div class="container"> <div class="row"> <div class="col-md-3"> <button class="navbar-toggler navbar-toggler-right" type="button" data-toggle="collapse" data-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation"> <span class="navbar-toggler-icon"></span> </button> <nav class="sidebar-nav" id="navbarSupportedContent"> <ul class="navbar-nav navbar-default"> <li class="nav-item"> <a class="nav-link" href="/">Overview</a> </li> <li class="nav-item active"> <a class="nav-link" href="/setup">Setup</a> <ul> <li class=""><a href="/setup/index">Instantiating</a></li> <li class=""><a href="/setup/adding-source-files">Adding Source Files</a></li> <li class=""><a href="/setup/diagnostics">Diagnostics</a></li> <li class="active"><a href="/setup/file-system">File System</a></li> <li class=""><a href="/setup/ast-viewers">AST Viewers</a></li> </ul> </li> <li class="nav-item"> <a class="nav-link" href="/navigation">Navigation</a> </li> <li class="nav-item"> <a class="nav-link" href="/manipulation">Manipulation</a> </li> <li class="nav-item"> <a class="nav-link" href="/emitting">Emitting</a> </li> <li class=""> <a class="nav-link" href="/details/index">Details</a> </li> <li class="nav-item"> <a class="nav-link" href="/utilities">Utilities</a> </li> <li class="nav-item"> <a class="nav-link" href="http://github.com/dsherret/ts-simple-ast">View on GitHub</a> </li> </ul> </nav> </div> <section class="container-fluid col-md-9"> <h2 id="file-system">File System</h2> <p>By default, the library will use the local file system based on the current working directory. In most scenarios, you won’t have to bother with what’s outlined here, but it may by useful in some scenarios (for example, using a virtual file system is useful for mocking the file system for testing purposes).</p> <h3 id="current-file-system-object">Current File System Object</h3> <div class="language-ts highlighter-rouge"><pre class="highlight"><code><span class="kd">const</span> <span class="nx">fs</span> <span class="o">=</span> <span class="nx">ast</span><span class="p">.</span><span class="nx">getFileSystem</span><span class="p">();</span> <span class="c1">// returns: FileSystemHost</span> </code></pre> </div> <p>This file system object can be used to interact with the current file system. The methods available on it are very obvious and not worth explaining here (ex. <code class="highlighter-rouge">writeFile(filePath: string, fileText: string): Promise&lt;void&gt;</code>, <code class="highlighter-rouge">readFile(filePath: string): Promise&lt;string&gt;</code>, <code class="highlighter-rouge">readFileSync(filePath: string): string</code>, etc..).</p> <h3 id="virtual-file-system">Virtual File System</h3> <p>If you want to use a virtual file system that is stored in memory, specify that when creating an <code class="highlighter-rouge">Ast</code> object:</p> <div class="language-ts highlighter-rouge"><pre class="highlight"><code><span class="k">import</span> <span class="nx">Ast</span> <span class="k">from</span> <span class="s2">"ts-simple-ast"</span><span class="p">;</span> <span class="kd">const</span> <span class="nx">ast</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">Ast</span><span class="p">({</span> <span class="na">useVirtualFileSystem</span><span class="p">:</span> <span class="kc">true</span> <span class="p">});</span> <span class="kd">const</span> <span class="nx">fs</span> <span class="o">=</span> <span class="nx">ast</span><span class="p">.</span><span class="nx">getFileSystem</span><span class="p">();</span> <span class="c1">// note that it's ok to use synchronous commands when using a virtual file system</span> <span class="kd">const</span> <span class="nx">sourceFile</span> <span class="o">=</span> <span class="nx">ast</span><span class="p">.</span><span class="nx">createSourceFile</span><span class="p">(</span><span class="s2">"file.ts"</span><span class="p">,</span> <span class="s2">"console.log(5);"</span><span class="p">);</span> <span class="nx">sourceFile</span><span class="p">.</span><span class="nx">saveSync</span><span class="p">();</span> <span class="nx">fs</span><span class="p">.</span><span class="nx">readFileSync</span><span class="p">(</span><span class="s2">"file.ts"</span><span class="p">);</span> <span class="c1">// returns: "console.log(5);"</span> </code></pre> </div> <p>The current working directory on this file system will be <code class="highlighter-rouge">/</code>.</p> <h4 id="libdts-files"><code class="highlighter-rouge">lib.d.ts</code> files</h4> <p>By default, the virtual file system won’t have the <a href="https://github.com/Microsoft/TypeScript/tree/master/lib"><code class="highlighter-rouge">lib.d.ts</code> files</a>. These files may be important because without them, you won’t be able to resolve the types they define.</p> <p>If you need this information, you will have to write them to the virtual file system manually using a method that works well in your environment:</p> <div class="language-ts highlighter-rouge"><pre class="highlight"><code><span class="k">import</span> <span class="nx">Ast</span><span class="p">,</span> <span class="p">{</span><span class="nx">FileSystemHost</span><span class="p">}</span> <span class="k">from</span> <span class="s2">"ts-simple-ast"</span><span class="p">;</span> <span class="kd">function</span> <span class="nx">loadDtsFiles</span><span class="p">(</span><span class="nx">fs</span><span class="err">:</span> <span class="nx">FileSystemHost</span><span class="p">)</span> <span class="p">{</span> <span class="c1">// Example that loads every single lib file. You most likely don't need all of these.</span> <span class="c1">// Please consult your version of the compiler to see what's necessary.</span> <span class="kd">const</span> <span class="nx">libDtsFileNames</span> <span class="o">=</span> <span class="p">[</span><span class="s2">"lib.d.ts"</span><span class="p">,</span> <span class="s2">"lib.dom.d.ts"</span><span class="p">,</span> <span class="s2">"lib.dom.iterable.d.ts"</span><span class="p">,</span> <span class="s2">"lib.es2015.collection.d.ts"</span><span class="p">,</span> <span class="s2">"lib.es2015.core.d.ts"</span><span class="p">,</span> <span class="s2">"lib.es2015.d.ts"</span><span class="p">,</span> <span class="s2">"lib.es2015.generator.d.ts"</span><span class="p">,</span> <span class="s2">"lib.es2015.iterable.d.ts"</span><span class="p">,</span> <span class="s2">"lib.es2015.promise.d.ts"</span><span class="p">,</span> <span class="s2">"lib.es2015.proxy.d.ts"</span><span class="p">,</span> <span class="s2">"lib.es2015.reflect.d.ts"</span><span class="p">,</span> <span class="s2">"lib.es2015.symbol.d.ts"</span><span class="p">,</span> <span class="s2">"lib.es2015.symbol.wellknown.d.ts"</span><span class="p">,</span> <span class="s2">"lib.es2016.array.include.d.ts"</span><span class="p">,</span> <span class="s2">"lib.es2016.d.ts"</span><span class="p">,</span> <span class="s2">"lib.es2016.full.d.ts"</span><span class="p">,</span> <span class="s2">"lib.es2017.d.ts"</span><span class="p">,</span> <span class="s2">"lib.es2017.full.d.ts"</span><span class="p">,</span> <span class="s2">"lib.es2017.intl.d.ts"</span><span class="p">,</span> <span class="s2">"lib.es2017.object.d.ts"</span><span class="p">,</span> <span class="s2">"lib.es2017.sharedmemory.d.ts"</span><span class="p">,</span> <span class="s2">"lib.es2017.string.d.ts"</span><span class="p">,</span> <span class="s2">"lib.es2017.typedarrays.d.ts"</span><span class="p">,</span> <span class="s2">"lib.es2018.d.ts"</span><span class="p">,</span> <span class="s2">"lib.es2018.full.d.ts"</span><span class="p">,</span> <span class="s2">"lib.es5.d.ts"</span><span class="p">,</span> <span class="s2">"lib.es6.d.ts"</span><span class="p">,</span> <span class="s2">"lib.esnext.asynciterable.d.ts"</span><span class="p">,</span> <span class="s2">"lib.esnext.d.ts"</span><span class="p">,</span> <span class="s2">"lib.esnext.full.d.ts"</span><span class="p">,</span> <span class="s2">"lib.scripthost.d.ts"</span><span class="p">,</span> <span class="s2">"lib.webworker.d.ts"</span><span class="p">];</span> <span class="k">for</span> <span class="p">(</span><span class="kd">const</span> <span class="nx">fileName</span> <span class="nx">of</span> <span class="nx">libDtsFileNames</span><span class="p">)</span> <span class="p">{</span> <span class="kd">const</span> <span class="nx">fileText</span> <span class="o">=</span> <span class="p">...;</span> <span class="c1">// get the file text somehow</span> <span class="nx">fs</span><span class="p">.</span><span class="nx">writeFileSync</span><span class="p">(</span><span class="err">`</span><span class="nx">node_modules</span><span class="o">/</span><span class="nx">typescript</span><span class="o">/</span><span class="nx">lib</span><span class="o">/</span><span class="nx">$</span><span class="p">{</span><span class="nx">fileName</span><span class="p">}</span><span class="err">`</span><span class="p">,</span> <span class="nx">fileText</span><span class="p">);</span> <span class="p">}</span> <span class="p">}</span> <span class="kd">const</span> <span class="nx">ast</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">Ast</span><span class="p">({</span> <span class="na">useVirtualFileSystem</span><span class="p">:</span> <span class="kc">true</span> <span class="p">});</span> <span class="kd">const</span> <span class="nx">fs</span> <span class="o">=</span> <span class="nx">ast</span><span class="p">.</span><span class="nx">getFileSystem</span><span class="p">();</span> <span class="nx">loadDtsFiles</span><span class="p">(</span><span class="nx">fs</span><span class="p">);</span> </code></pre> </div> <p>When using a non-default file system, the library will search for these files in <code class="highlighter-rouge">path.join(fs.getCurrentDirectory(), "node_modules/typescript/lib"))</code>.</p> <h3 id="custom-file-system">Custom File System</h3> <p>It’s possible to use your own custom file system by implementing the <code class="highlighter-rouge">FileSystemHost</code> interface then passing in an instance of this when creating a new <code class="highlighter-rouge">Ast</code> object:</p> <div class="language-ts highlighter-rouge"><pre class="highlight"><code><span class="kd">const</span> <span class="nx">Ast</span><span class="p">,</span> <span class="p">{</span><span class="nx">FileSystemHost</span><span class="p">}</span> <span class="k">from</span> <span class="s2">"ts-simple-ast"</span><span class="p">;</span> <span class="kr">class</span> <span class="nx">MyCustomFileSystem</span> <span class="k">implements</span> <span class="nx">FileSystemHost</span> <span class="p">{</span> <span class="c1">// implement it</span> <span class="p">}</span> <span class="kd">const</span> <span class="nx">fs</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">MyCustomFileSystem</span><span class="p">();</span> <span class="kd">const</span> <span class="nx">ast</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">Ast</span><span class="p">({},</span> <span class="nx">fs</span><span class="p">);</span> </code></pre> </div> </section> </div> </div> <footer> </footer> </div> <script src="https://code.jquery.com/jquery-3.1.1.slim.min.js" integrity="sha384-A7FZj7v+d/sdmMqp/nOQwliLvUsJfDHW+k9Omg/a/EheAdgtzNs3hpfag6Ed950n" crossorigin="anonymous"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/tether/1.4.0/js/tether.min.js" integrity="sha384-DztdAPBWPRXSA/3eYEEUWrWCy7G5KFbe8fFjk5JAIxUYHKkDx6Qin1DkWx51bBrb" crossorigin="anonymous"></script> <script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-alpha.6/js/bootstrap.min.js" integrity="sha384-vBWWzlZJ8ea9aCX4pEW3rVHjgjt7zpkNpZk+02D9phzyeVkE+jo0ieGizqPLForn" crossorigin="anonymous"></script> <!--[if !IE]><script>fixScale(document);</script><![endif]--> </body> </html>