ts-simple-ast
Version:
TypeScript compiler wrapper for AST navigation and code generation.
275 lines (206 loc) • 17.2 kB
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 - Directories</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">
<a class="nav-link" href="/setup">Setup</a>
</li>
<li class="nav-item active">
<a class="nav-link" href="/navigation">Navigation</a>
<ul>
<li class=""><a href="/navigation/getting-source-files">Getting Source Files</a></li>
<li class="active"><a href="/navigation/directories">Directories</a></li>
<li class=""><a href="/navigation/example">Example</a></li>
<li class=""><a href="/navigation/compiler-nodes">Compiler Nodes</a></li>
<li class=""><a href="/navigation/existing-nodes">Existing Nodes</a></li>
<li class=""><a href="/navigation/finding-references">Finding References</a></li>
<li class=""><a href="/navigation/language-service">Language Service</a></li>
<li class=""><a href="/navigation/program">Program</a></li>
<li class=""><a href="/navigation/type-checker">Type Checker</a></li>
</ul>
</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="directories">Directories</h2>
<p>Based on the source files created, appropriate directory objects will be created. These objects hold source files and directories that have been added.</p>
<p>Note that it’s completely fine to ignore the concept of directories and only deal with source files. This is an advanced feature that
only needs to be used if it will help make solving your problem easier.</p>
<h3 id="retrieving">Retrieving</h3>
<p>Directories can be retrieved from a source file:</p>
<div class="language-ts highlighter-rouge"><pre class="highlight"><code><span class="kd">const</span> <span class="nx">directory</span> <span class="o">=</span> <span class="nx">sourceFile</span><span class="p">.</span><span class="nx">getDirectory</span><span class="p">();</span>
</code></pre>
</div>
<p>From other directories:</p>
<div class="language-ts highlighter-rouge"><pre class="highlight"><code><span class="nx">directory</span><span class="p">.</span><span class="nx">getDirectory</span><span class="p">(</span><span class="s2">"childDir"</span><span class="p">);</span>
<span class="nx">directory</span><span class="p">.</span><span class="nx">getDirectoryOrThrow</span><span class="p">(</span><span class="s2">"childDir"</span><span class="p">);</span>
<span class="c1">// child directories</span>
<span class="nx">directory</span><span class="p">.</span><span class="nx">getDirectories</span><span class="p">();</span>
<span class="c1">// parent directory, if it exists</span>
<span class="nx">directory</span><span class="p">.</span><span class="nx">getParent</span><span class="p">();</span>
</code></pre>
</div>
<p>Or from the main ast object:</p>
<div class="language-ts highlighter-rouge"><pre class="highlight"><code><span class="nx">ast</span><span class="p">.</span><span class="nx">getRootDirectories</span><span class="p">();</span> <span class="c1">// gets directories without a parent</span>
<span class="nx">ast</span><span class="p">.</span><span class="nx">getDirectories</span><span class="p">();</span> <span class="c1">// gets all the directories</span>
<span class="nx">ast</span><span class="p">.</span><span class="nx">getDirectory</span><span class="p">(</span><span class="s2">"path/to/directory"</span><span class="p">);</span>
<span class="nx">ast</span><span class="p">.</span><span class="nx">getDirectoryOrThrow</span><span class="p">(</span><span class="s2">"path/to/directory"</span><span class="p">);</span>
</code></pre>
</div>
<h3 id="adding">Adding</h3>
<p>On a directory:</p>
<div class="language-ts highlighter-rouge"><pre class="highlight"><code><span class="kd">const</span> <span class="nx">childDirectory</span> <span class="o">=</span> <span class="nx">directory</span><span class="p">.</span><span class="nx">addExistingDirectory</span><span class="p">(</span><span class="s2">"childDir"</span><span class="p">);</span> <span class="c1">// or addDirectoryIfExists</span>
</code></pre>
</div>
<p>Or main ast object:</p>
<div class="language-ts highlighter-rouge"><pre class="highlight"><code><span class="kd">const</span> <span class="nx">directory</span> <span class="o">=</span> <span class="nx">ast</span><span class="p">.</span><span class="nx">addExistingDirectory</span><span class="p">(</span><span class="s2">"path/to/dir"</span><span class="p">);</span> <span class="c1">// or addDirectoryIfExists</span>
</code></pre>
</div>
<h3 id="creating">Creating</h3>
<p>On a directory</p>
<div class="language-ts highlighter-rouge"><pre class="highlight"><code><span class="kd">const</span> <span class="nx">childDir</span> <span class="o">=</span> <span class="nx">directory</span><span class="p">.</span><span class="nx">createDirectory</span><span class="p">(</span><span class="s2">"childDir"</span><span class="p">);</span>
</code></pre>
</div>
<p>Or main ast object:</p>
<div class="language-ts highlighter-rouge"><pre class="highlight"><code><span class="kd">const</span> <span class="nx">directory</span> <span class="o">=</span> <span class="nx">ast</span><span class="p">.</span><span class="nx">createDirectory</span><span class="p">(</span><span class="s2">"path/to/dir"</span><span class="p">);</span>
</code></pre>
</div>
<h2 id="directory">Directory</h2>
<h3 id="path-and-name">Path and name</h3>
<div class="language-ts highlighter-rouge"><pre class="highlight"><code><span class="c1">// returns the full path (ex. /home/david/project/)</span>
<span class="kd">const</span> <span class="nx">path</span> <span class="o">=</span> <span class="nx">directory</span><span class="p">.</span><span class="nx">getPath</span><span class="p">();</span>
<span class="c1">// returns only the directory name (ex. project)</span>
<span class="kd">const</span> <span class="nx">baseName</span> <span class="o">=</span> <span class="nx">directory</span><span class="p">.</span><span class="nx">getBaseName</span><span class="p">();</span>
</code></pre>
</div>
<h3 id="parent-directory">Parent directory</h3>
<div class="language-ts highlighter-rouge"><pre class="highlight"><code><span class="kd">const</span> <span class="nx">parentDir</span> <span class="o">=</span> <span class="nx">directory</span><span class="p">.</span><span class="nx">getParent</span><span class="p">();</span> <span class="c1">// or getParentOrThrow()</span>
</code></pre>
</div>
<h3 id="child-directories">Child directories</h3>
<div class="language-ts highlighter-rouge"><pre class="highlight"><code><span class="kd">const</span> <span class="nx">childDirs</span> <span class="o">=</span> <span class="nx">directory</span><span class="p">.</span><span class="nx">getDirectories</span><span class="p">();</span>
</code></pre>
</div>
<h3 id="ancestor--descendant">Ancestor / Descendant</h3>
<p>Check if a directory is an ancestor or descendant of another directory:</p>
<div class="language-typescript highlighter-rouge"><pre class="highlight"><code><span class="nx">grandParentDir</span><span class="p">.</span><span class="nx">isAncestorOf</span><span class="p">(</span><span class="nx">childDir</span><span class="p">);</span> <span class="c1">// true</span>
<span class="nx">childDir</span><span class="p">.</span><span class="nx">isDescendantOf</span><span class="p">(</span><span class="nx">grandParentDir</span><span class="p">);</span> <span class="c1">// true</span>
</code></pre>
</div>
<p>Or if a directory is an ancestor of a source file:</p>
<div class="language-ts highlighter-rouge"><pre class="highlight"><code><span class="nx">grandParentDir</span><span class="p">.</span><span class="nx">isAncestorOf</span><span class="p">(</span><span class="nx">childSourceFile</span><span class="p">);</span> <span class="c1">// true</span>
<span class="nx">parentDir</span><span class="p">.</span><span class="nx">isAncestorOf</span><span class="p">(</span><span class="nx">childSourceFile</span><span class="p">);</span> <span class="c1">// true</span>
</code></pre>
</div>
<h3 id="source-files">Source files</h3>
<div class="language-ts highlighter-rouge"><pre class="highlight"><code><span class="kd">const</span> <span class="nx">sourceFiles</span> <span class="o">=</span> <span class="nx">directory</span><span class="p">.</span><span class="nx">getSourceFiles</span><span class="p">();</span>
<span class="kd">const</span> <span class="nx">sourceFile</span> <span class="o">=</span> <span class="nx">directory</span><span class="p">.</span><span class="nx">getSourceFile</span><span class="p">(</span><span class="s2">"someFile.ts"</span><span class="p">);</span> <span class="c1">// or getSourceFileOrThrow</span>
<span class="kd">const</span> <span class="nx">indexFile</span> <span class="o">=</span> <span class="nx">directory</span><span class="p">.</span><span class="nx">addExistingSourceFile</span><span class="p">(</span><span class="s2">"index.ts"</span><span class="p">);</span> <span class="c1">// or addSourceFileIfExists</span>
<span class="kd">const</span> <span class="nx">descendantSourceFiles</span> <span class="o">=</span> <span class="nx">directory</span><span class="p">.</span><span class="nx">getDescendantSourceFiles</span><span class="p">();</span>
</code></pre>
</div>
<h3 id="saving">Saving</h3>
<p>Save all the unsaved source files:</p>
<div class="language-ts highlighter-rouge"><pre class="highlight"><code><span class="nx">directory</span><span class="p">.</span><span class="nx">saveUnsavedSourceFiles</span><span class="p">();</span>
<span class="nx">directory</span><span class="p">.</span><span class="nx">saveUnsavedSourceFilesSync</span><span class="p">();</span> <span class="c1">// slow</span>
</code></pre>
</div>
<h3 id="emitting">Emitting</h3>
<p>It’s possible to only specific directories:</p>
<div class="language-ts highlighter-rouge"><pre class="highlight"><code><span class="c1">// always check result.getEmitSkipped() to make sure the emit was successful</span>
<span class="kd">const</span> <span class="nx">result</span> <span class="o">=</span> <span class="k">await</span> <span class="nx">directory</span><span class="p">.</span><span class="nx">emit</span><span class="p">();</span>
<span class="nx">directory</span><span class="p">.</span><span class="nx">emitSync</span><span class="p">();</span> <span class="c1">// slow</span>
</code></pre>
</div>
<p>Or specify the output directories (specify a path relative from the directory or an absolute paths):</p>
<div class="language-ts highlighter-rouge"><pre class="highlight"><code><span class="nx">directory</span><span class="p">.</span><span class="nx">emit</span><span class="p">({</span>
<span class="na">outDir</span><span class="p">:</span> <span class="s2">"out"</span><span class="p">,</span>
<span class="na">declarationDir</span><span class="p">:</span> <span class="s2">"declarations"</span>
<span class="p">});</span>
</code></pre>
</div>
<p>And of course, specify to only emit declaration files:</p>
<div class="language-ts highlighter-rouge"><pre class="highlight"><code><span class="nx">directory</span><span class="p">.</span><span class="nx">emit</span><span class="p">({</span> <span class="na">emitOnlyDtsFiles</span><span class="p">:</span> <span class="kc">true</span> <span class="p">});</span>
</code></pre>
</div>
<h3 id="copying">Copying</h3>
<p>Copy the directory to a new directory:</p>
<div class="highlighter-rouge"><pre class="highlight"><code>// ex. copies C:\MyProject\dir to C:\MyProject\newDir
directory.copy("../newDir");
directory.copy("../newDir", { overwrite: true }); // don't throw if it will overwrite a file
directory.copy("C:\\test"); // or absolute
</code></pre>
</div>
<p>Note that the directory and source files, in all these cases, won’t be created until calling save on them.</p>
<h3 id="deleting">Deleting</h3>
<p>Deletes the directory and all its descendants from the file system:</p>
<div class="language-ts highlighter-rouge"><pre class="highlight"><code><span class="nx">directory</span><span class="p">.</span><span class="k">delete</span><span class="p">();</span>
<span class="c1">// or</span>
<span class="nx">directory</span><span class="p">.</span><span class="nx">deleteSync</span><span class="p">();</span>
</code></pre>
</div>
<p>Note that after doing this, the directory object and all its descendant source files and directories will not be available.</p>
<h3 id="removing">Removing</h3>
<p>Removes from main ast object:</p>
<div class="language-ts highlighter-rouge"><pre class="highlight"><code><span class="nx">directory</span><span class="p">.</span><span class="nx">remove</span><span class="p">();</span>
</code></pre>
</div>
<p>Note that after doing this, the directory object and all its descendant source files and directories will not be available. If you want to use them again,
then you will need to re-add them.</p>
</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>