knex/docs/lib/migrate.html

162 lines
37 KiB
HTML
Raw Normal View History

2013-09-13 13:50:41 -04:00
<!DOCTYPE html><html lang="en"><head><title>lib/migrate</title></head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0"><meta name="groc-relative-root" content="../"><meta name="groc-document-path" content="lib/migrate"><meta name="groc-project-path" content="lib/migrate.js"><link rel="stylesheet" type="text/css" media="all" href="../assets/style.css"><script type="text/javascript" src="../assets/behavior.js"></script><body><div id="meta"><div class="file-path">lib/migrate.js</div></div><div id="document"><div class="segment"><div class="code"><div class="wrapper"><span class="kd">var</span> <span class="nx">fs</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;fs&#39;</span><span class="p">);</span>
<span class="kd">var</span> <span class="nx">path</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;path&#39;</span><span class="p">);</span>
<span class="kd">var</span> <span class="nx">_</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;underscore&#39;</span><span class="p">);</span>
<span class="kd">var</span> <span class="nx">_str</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;underscore.string&#39;</span><span class="p">);</span>
<span class="kd">var</span> <span class="nx">mkdirp</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;mkdirp&#39;</span><span class="p">);</span>
<span class="kd">var</span> <span class="nx">when</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;when&#39;</span><span class="p">);</span>
<span class="kd">var</span> <span class="nx">nodefn</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;when/node/function&#39;</span><span class="p">);</span>
<span class="kd">var</span> <span class="nx">sequence</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;when/sequence&#39;</span><span class="p">);</span></div></div></div><div class="segment"><div class="comments"><div class="wrapper"><p>The new migration we're performing.
Takes a <code>config</code> object, which has the name
of the current migration (<code>main</code> if not otherwise specified)</p></div></div><div class="code"><div class="wrapper"><span class="kd">var</span> <span class="nx">Migrate</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(</span><span class="nx">instance</span><span class="p">)</span> <span class="p">{</span>
<span class="k">this</span><span class="p">.</span><span class="nx">knex</span> <span class="o">=</span> <span class="nx">instance</span><span class="p">;</span>
<span class="nx">_</span><span class="p">.</span><span class="nx">bindAll</span><span class="p">(</span><span class="k">this</span><span class="p">,</span> <span class="s1">&#39;currentVersion&#39;</span><span class="p">,</span> <span class="s1">&#39;createMigrationTable&#39;</span><span class="p">,</span> <span class="s1">&#39;_migrationData&#39;</span><span class="p">);</span>
<span class="p">};</span>
<span class="nx">Migrate</span><span class="p">.</span><span class="nx">prototype</span> <span class="o">=</span> <span class="p">{</span></div></div></div><div class="segment"><div class="comments"><div class="wrapper"><p>Initializes the migration, by creating the proper migration
file or database table, depending on the migration config settings.</p></div></div><div class="code"><div class="wrapper"> <span class="nx">initialize</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">config</span><span class="p">)</span> <span class="p">{</span>
<span class="nx">config</span> <span class="o">=</span> <span class="nx">_</span><span class="p">.</span><span class="nx">defaults</span><span class="p">(</span><span class="nx">config</span> <span class="o">||</span> <span class="p">{},</span> <span class="p">{</span>
<span class="nx">extension</span><span class="o">:</span> <span class="s1">&#39;js&#39;</span><span class="p">,</span>
<span class="nx">tableName</span><span class="o">:</span> <span class="s1">&#39;knex_migrations&#39;</span><span class="p">,</span>
<span class="nx">namespace</span><span class="o">:</span> <span class="s1">&#39;main&#39;</span><span class="p">,</span>
<span class="nx">directory</span><span class="o">:</span> <span class="nx">process</span><span class="p">.</span><span class="nx">cwd</span><span class="p">()</span> <span class="o">+</span> <span class="s1">&#39;/migrations&#39;</span>
<span class="p">});</span>
<span class="kd">var</span> <span class="nx">Knex</span> <span class="o">=</span> <span class="k">this</span><span class="p">.</span><span class="nx">Knex</span><span class="p">;</span>
<span class="kd">var</span> <span class="nx">directory</span> <span class="o">=</span> <span class="nx">config</span><span class="p">.</span><span class="nx">directory</span><span class="p">;</span>
<span class="kd">var</span> <span class="nx">tableName</span> <span class="o">=</span> <span class="nx">config</span><span class="p">.</span><span class="nx">tableName</span><span class="p">;</span>
<span class="k">return</span> <span class="nx">nodefn</span><span class="p">.</span><span class="nx">call</span><span class="p">(</span><span class="nx">fs</span><span class="p">.</span><span class="nx">stat</span><span class="p">,</span> <span class="nx">directory</span><span class="p">).</span><span class="nx">then</span><span class="p">(</span><span class="kc">null</span><span class="p">,</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
<span class="k">return</span> <span class="nx">nodefn</span><span class="p">.</span><span class="nx">call</span><span class="p">(</span><span class="nx">mkdirp</span><span class="p">,</span> <span class="nx">directory</span><span class="p">);</span>
<span class="p">})</span>
<span class="p">.</span><span class="nx">then</span><span class="p">(</span><span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
<span class="k">return</span> <span class="nx">Knex</span><span class="p">.</span><span class="nx">Schema</span><span class="p">.</span><span class="nx">hasTable</span><span class="p">(</span><span class="nx">tableName</span><span class="p">);</span>
<span class="p">})</span>
<span class="p">.</span><span class="nx">tap</span><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">exists</span><span class="p">)</span> <span class="p">{</span>
<span class="k">if</span> <span class="p">(</span><span class="nx">exists</span><span class="p">)</span> <span class="k">this</span><span class="p">.</span><span class="nx">createMigrationTable</span><span class="p">(</span><span class="nx">tableName</span><span class="p">);</span>
<span class="p">})</span>
<span class="p">.</span><span class="nx">yield</span><span class="p">(</span><span class="nx">config</span><span class="p">);</span>
<span class="p">},</span></div></div></div><div class="segment"><div class="comments"><div class="wrapper"><p>Create the migration table, if it doesn't already exist.</p></div></div><div class="code"><div class="wrapper"> <span class="nx">createMigrationTable</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">tableName</span><span class="p">)</span> <span class="p">{</span>
<span class="k">return</span> <span class="nx">Knex</span><span class="p">.</span><span class="nx">Schema</span><span class="p">.</span><span class="nx">createTable</span><span class="p">(</span><span class="nx">tableName</span><span class="p">,</span> <span class="kd">function</span><span class="p">(</span><span class="nx">t</span><span class="p">)</span> <span class="p">{</span>
<span class="nx">t</span><span class="p">.</span><span class="nx">increments</span><span class="p">();</span>
<span class="nx">t</span><span class="p">.</span><span class="nx">string</span><span class="p">(</span><span class="s1">&#39;name&#39;</span><span class="p">);</span>
<span class="nx">t</span><span class="p">.</span><span class="nx">integer</span><span class="p">(</span><span class="s1">&#39;batch&#39;</span><span class="p">);</span>
<span class="nx">t</span><span class="p">.</span><span class="nx">dateTime</span><span class="p">(</span><span class="s1">&#39;migration_time&#39;</span><span class="p">);</span>
<span class="p">});</span>
<span class="p">},</span></div></div></div><div class="segment"><div class="comments"><div class="wrapper"><p>Runs a specific migration, based on the migration version number.</p></div></div><div class="code"><div class="wrapper"> <span class="nx">run</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">version</span><span class="p">,</span> <span class="nx">config</span><span class="p">)</span> <span class="p">{</span>
<span class="nx">version</span> <span class="o">=</span> <span class="nx">parseVersion</span><span class="p">(</span><span class="nx">version</span><span class="p">);</span>
<span class="kd">var</span> <span class="nx">migration</span> <span class="o">=</span> <span class="k">this</span><span class="p">;</span>
<span class="k">return</span> <span class="k">this</span><span class="p">.</span><span class="nx">initialize</span><span class="p">(</span><span class="nx">config</span><span class="p">)</span>
<span class="p">.</span><span class="nx">then</span><span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">_migrationData</span><span class="p">(</span><span class="nx">config</span><span class="p">))</span>
<span class="p">.</span><span class="nx">spread</span><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">all</span><span class="p">,</span> <span class="nx">completed</span><span class="p">)</span> <span class="p">{</span>
<span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="nx">hasRun</span><span class="p">(</span><span class="nx">completed</span><span class="p">,</span> <span class="nx">version</span><span class="p">))</span> <span class="p">{</span>
<span class="k">return</span> <span class="nx">migration</span><span class="p">.</span><span class="nx">runBatch</span><span class="p">([</span><span class="nx">getMigration</span><span class="p">(</span><span class="nx">all</span><span class="p">,</span> <span class="nx">version</span><span class="p">,</span> <span class="nx">config</span><span class="p">)]);</span>
<span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
<span class="k">throw</span> <span class="k">new</span> <span class="nb">Error</span><span class="p">(</span><span class="s1">&#39;Migration &#39;</span> <span class="o">+</span> <span class="nx">version</span> <span class="o">+</span> <span class="s1">&#39; already exists&#39;</span><span class="p">);</span>
<span class="p">}</span>
<span class="p">})</span>
<span class="p">.</span><span class="nx">then</span><span class="p">(</span><span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
<span class="k">return</span> <span class="s1">&#39;Migration &#39;</span> <span class="o">+</span> <span class="nx">version</span> <span class="o">+</span> <span class="s1">&#39; successfully run&#39;</span><span class="p">;</span>
<span class="p">});</span>
<span class="p">},</span></div></div></div><div class="segment"><div class="comments"><div class="wrapper"><p>Migrate "up" to a specific migration id
otherwise, migrates all migrations which have
not been run yet.</p></div></div><div class="code"><div class="wrapper"> <span class="nx">up</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">version</span><span class="p">,</span> <span class="nx">config</span><span class="p">)</span> <span class="p">{</span>
<span class="k">return</span> <span class="k">this</span><span class="p">.</span><span class="nx">_direction</span><span class="p">(</span><span class="s1">&#39;up&#39;</span><span class="p">,</span> <span class="nx">version</span><span class="p">,</span> <span class="nx">config</span><span class="p">);</span>
<span class="p">},</span></div></div></div><div class="segment"><div class="comments"><div class="wrapper"><p>Migrate "down" to a specific migration id,
otherwise rolls back the last migration "batch".</p></div></div><div class="code"><div class="wrapper"> <span class="nx">down</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">version</span><span class="p">,</span> <span class="nx">config</span><span class="p">)</span> <span class="p">{</span>
<span class="k">return</span> <span class="k">this</span><span class="p">.</span><span class="nx">_direction</span><span class="p">(</span><span class="s1">&#39;down&#39;</span><span class="p">,</span> <span class="nx">version</span><span class="p">,</span> <span class="nx">config</span><span class="p">);</span>
<span class="p">},</span></div></div></div><div class="segment"><div class="comments"><div class="wrapper"><p>Run a batch of current migrations, in sequence.</p></div></div><div class="code"><div class="wrapper"> <span class="nx">runBatch</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">migrations</span><span class="p">,</span> <span class="nx">direction</span><span class="p">)</span> <span class="p">{</span>
<span class="nx">migrations</span> <span class="o">=</span> <span class="nx">_</span><span class="p">.</span><span class="nx">map</span><span class="p">(</span><span class="nx">migrations</span><span class="p">,</span> <span class="kd">function</span><span class="p">(</span><span class="nx">item</span><span class="p">)</span> <span class="p">{</span>
<span class="kd">var</span> <span class="nx">migration</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="nx">item</span><span class="p">);</span>
<span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="nx">_</span><span class="p">.</span><span class="nx">isFunction</span><span class="p">(</span><span class="nx">migration</span><span class="p">.</span><span class="nx">up</span><span class="p">)</span> <span class="o">||</span> <span class="o">!</span><span class="nx">_</span><span class="p">.</span><span class="nx">isFunction</span><span class="p">(</span><span class="nx">migration</span><span class="p">.</span><span class="nx">down</span><span class="p">))</span> <span class="p">{</span>
<span class="k">throw</span> <span class="k">new</span> <span class="nb">Error</span><span class="p">(</span><span class="s1">&#39;Invalid migration: &#39;</span> <span class="o">+</span> <span class="nx">item</span> <span class="o">+</span> <span class="s1">&#39; must have both an up and down function&#39;</span><span class="p">);</span>
<span class="p">}</span>
<span class="k">return</span> <span class="nx">migration</span><span class="p">[</span><span class="nx">direction</span><span class="p">];</span>
<span class="p">});</span>
<span class="k">return</span> <span class="nx">sequence</span><span class="p">(</span><span class="nx">migrations</span><span class="p">);</span>
<span class="p">},</span></div></div></div><div class="segment"><div class="comments"><div class="wrapper"><p>Retrieves and returns the current migration version
we're on, as a promise. If there aren't any migrations run yet,
return "none" as the value for the <code>currentVersion</code>.</p></div></div><div class="code"><div class="wrapper"> <span class="nx">currentVersion</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">config</span><span class="p">)</span> <span class="p">{</span>
<span class="k">return</span> <span class="k">this</span><span class="p">.</span><span class="nx">listCompleted</span><span class="p">(</span><span class="nx">config</span><span class="p">).</span><span class="nx">then</span><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">completed</span><span class="p">)</span> <span class="p">{</span>
<span class="kd">var</span> <span class="nx">val</span> <span class="o">=</span> <span class="nx">_</span><span class="p">.</span><span class="nx">chain</span><span class="p">(</span><span class="nx">completed</span><span class="p">).</span><span class="nx">map</span><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">value</span><span class="p">)</span> <span class="p">{</span>
<span class="k">return</span> <span class="nx">value</span><span class="p">.</span><span class="nx">split</span><span class="p">(</span><span class="s1">&#39;_&#39;</span><span class="p">)[</span><span class="mi">0</span><span class="p">];</span>
<span class="p">}).</span><span class="nx">max</span><span class="p">().</span><span class="nx">value</span><span class="p">();</span>
<span class="k">return</span> <span class="p">(</span><span class="nx">val</span> <span class="o">===</span> <span class="o">-</span><span class="kc">Infinity</span> <span class="o">?</span> <span class="s1">&#39;none&#39;</span> <span class="o">:</span> <span class="nx">val</span><span class="p">);</span>
<span class="p">});</span>
<span class="p">},</span></div></div></div><div class="segment"><div class="comments"><div class="wrapper"><p>Creates a new migration, with a given name.</p></div></div><div class="code"><div class="wrapper"> <span class="nx">create</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">name</span><span class="p">,</span> <span class="nx">config</span><span class="p">)</span> <span class="p">{</span>
<span class="k">return</span> <span class="k">this</span><span class="p">.</span><span class="nx">initialize</span><span class="p">(</span><span class="nx">config</span><span class="p">).</span><span class="nx">then</span><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">config</span><span class="p">)</span> <span class="p">{</span>
<span class="k">return</span> <span class="nx">when</span><span class="p">.</span><span class="nx">all</span><span class="p">([</span><span class="nx">nodefn</span><span class="p">.</span><span class="nx">call</span><span class="p">(</span><span class="nx">fs</span><span class="p">.</span><span class="nx">readFile</span><span class="p">,</span> <span class="nx">config</span><span class="p">.</span><span class="nx">stub</span> <span class="o">||</span> <span class="nx">path</span><span class="p">.</span><span class="nx">join</span><span class="p">(</span><span class="nx">__dirname</span><span class="p">,</span> <span class="s1">&#39;stub&#39;</span><span class="p">,</span> <span class="nx">config</span><span class="p">.</span><span class="nx">extension</span> <span class="o">+</span> <span class="s1">&#39;.stub&#39;</span><span class="p">)),</span> <span class="nx">config</span><span class="p">]);</span>
<span class="p">}).</span><span class="nx">spread</span><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">stub</span><span class="p">,</span> <span class="nx">config</span><span class="p">)</span> <span class="p">{</span>
<span class="nx">name</span> <span class="o">=</span> <span class="nx">_str</span><span class="p">.</span><span class="nx">dasherize</span><span class="p">(</span><span class="nx">name</span><span class="p">);</span>
<span class="k">if</span> <span class="p">(</span><span class="nx">name</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">===</span> <span class="s1">&#39;-&#39;</span><span class="p">)</span> <span class="nx">name</span> <span class="o">=</span> <span class="nx">name</span><span class="p">.</span><span class="nx">slice</span><span class="p">(</span><span class="mi">1</span><span class="p">);</span>
<span class="kd">var</span> <span class="nx">filename</span> <span class="o">=</span> <span class="nx">yyyymmddhhmmss</span><span class="p">()</span> <span class="o">+</span> <span class="s1">&#39;_&#39;</span> <span class="o">+</span> <span class="nx">name</span> <span class="o">+</span> <span class="s1">&#39;.&#39;</span> <span class="o">+</span> <span class="nx">config</span><span class="p">.</span><span class="nx">extension</span><span class="p">;</span>
<span class="k">return</span> <span class="nx">nodefn</span><span class="p">.</span><span class="nx">call</span><span class="p">(</span><span class="nx">fs</span><span class="p">.</span><span class="nx">writeFile</span><span class="p">,</span> <span class="nx">path</span><span class="p">.</span><span class="nx">join</span><span class="p">(</span><span class="nx">config</span><span class="p">.</span><span class="nx">directory</span><span class="p">,</span> <span class="nx">filename</span><span class="p">),</span> <span class="nx">stub</span><span class="p">).</span><span class="nx">then</span><span class="p">(</span><span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
<span class="k">return</span> <span class="nx">filename</span><span class="p">;</span>
<span class="p">});</span>
<span class="p">});</span>
<span class="p">},</span></div></div></div><div class="segment"><div class="comments"><div class="wrapper"><p>Lists all available migration versions, as an array.</p></div></div><div class="code"><div class="wrapper"> <span class="nx">listAll</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">config</span><span class="p">)</span> <span class="p">{</span>
<span class="k">return</span> <span class="k">this</span><span class="p">.</span><span class="nx">initialize</span><span class="p">(</span><span class="nx">config</span><span class="p">)</span>
<span class="p">.</span><span class="nx">then</span><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">config</span><span class="p">)</span> <span class="p">{</span>
<span class="k">return</span> <span class="nx">nodefn</span><span class="p">.</span><span class="nx">call</span><span class="p">(</span><span class="nx">fs</span><span class="p">.</span><span class="nx">readdir</span><span class="p">,</span> <span class="nx">config</span><span class="p">.</span><span class="nx">directory</span><span class="p">);</span>
<span class="p">})</span>
<span class="p">.</span><span class="nx">then</span><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">files</span><span class="p">)</span> <span class="p">{</span>
<span class="k">return</span> <span class="nx">_</span><span class="p">.</span><span class="nx">reduce</span><span class="p">(</span><span class="nx">files</span><span class="p">,</span> <span class="kd">function</span><span class="p">(</span><span class="nx">memo</span><span class="p">,</span> <span class="nx">value</span><span class="p">)</span> <span class="p">{</span>
<span class="nx">memo</span><span class="p">.</span><span class="nx">push</span><span class="p">(</span><span class="nx">value</span><span class="p">);</span>
<span class="k">return</span> <span class="nx">memo</span><span class="p">;</span>
<span class="p">},</span> <span class="p">[]);</span>
<span class="p">});</span>
<span class="p">},</span></div></div></div><div class="segment"><div class="comments"><div class="wrapper"><p>Lists all migrations that have been completed for the current db, as an array.</p></div></div><div class="code"><div class="wrapper"> <span class="nx">listCompleted</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">config</span><span class="p">)</span> <span class="p">{</span>
<span class="kd">var</span> <span class="nx">Knex</span> <span class="o">=</span> <span class="k">this</span><span class="p">.</span><span class="nx">Knex</span><span class="p">;</span>
<span class="k">return</span> <span class="k">this</span><span class="p">.</span><span class="nx">initialize</span><span class="p">(</span><span class="nx">config</span><span class="p">).</span><span class="nx">then</span><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">config</span><span class="p">)</span> <span class="p">{</span>
<span class="k">return</span> <span class="nx">Knex</span><span class="p">(</span><span class="nx">config</span><span class="p">.</span><span class="nx">tableName</span><span class="p">).</span><span class="nx">orderBy</span><span class="p">(</span><span class="s1">&#39;id&#39;</span><span class="p">).</span><span class="nx">select</span><span class="p">(</span><span class="s1">&#39;name&#39;</span><span class="p">);</span>
<span class="p">}).</span><span class="nx">then</span><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">values</span><span class="p">)</span> <span class="p">{</span>
<span class="k">return</span> <span class="nx">values</span><span class="p">;</span>
<span class="p">});</span>
<span class="p">},</span></div></div></div><div class="segment"><div class="comments"><div class="wrapper"><p>Gets the migration list, and the list of completed migrations
to check what should be run.</p></div></div><div class="code"><div class="wrapper"> <span class="nx">_migrationData</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">config</span><span class="p">)</span> <span class="p">{</span>
<span class="kd">var</span> <span class="nx">migration</span> <span class="o">=</span> <span class="k">this</span><span class="p">;</span>
<span class="k">return</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
<span class="k">return</span> <span class="nx">when</span><span class="p">.</span><span class="nx">all</span><span class="p">([</span><span class="nx">migration</span><span class="p">.</span><span class="nx">listAll</span><span class="p">(),</span> <span class="nx">migration</span><span class="p">.</span><span class="nx">listCompleted</span><span class="p">()]);</span>
<span class="p">};</span>
<span class="p">},</span></div></div></div><div class="segment"><div class="comments"><div class="wrapper"><p>Shared between the <code>up</code> and <code>down</code> migrations, this
helps to create the batch of migrations that need to be run.</p></div></div><div class="code"><div class="wrapper"> <span class="nx">_direction</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">direction</span><span class="p">,</span> <span class="nx">version</span><span class="p">,</span> <span class="nx">config</span><span class="p">)</span> <span class="p">{</span>
<span class="nx">version</span> <span class="o">=</span> <span class="nx">parseVersion</span><span class="p">(</span><span class="nx">version</span> <span class="o">||</span> <span class="s1">&#39;latest&#39;</span><span class="p">);</span>
<span class="kd">var</span> <span class="nx">migration</span> <span class="o">=</span> <span class="k">this</span><span class="p">;</span>
<span class="k">return</span> <span class="k">this</span><span class="p">.</span><span class="nx">initialize</span><span class="p">(</span><span class="nx">config</span><span class="p">).</span><span class="nx">then</span><span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">_migrationData</span><span class="p">(</span><span class="nx">config</span><span class="p">)).</span><span class="nx">spread</span><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">all</span><span class="p">,</span> <span class="nx">completed</span><span class="p">,</span> <span class="nx">version</span><span class="p">)</span> <span class="p">{</span>
<span class="p">});</span>
<span class="p">},</span></div></div></div><div class="segment"><div class="comments"><div class="wrapper"><p>Gets the current migration.</p></div></div><div class="code"><div class="wrapper"> <span class="nx">getMigration</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">all</span><span class="p">,</span> <span class="nx">version</span><span class="p">,</span> <span class="nx">config</span><span class="p">)</span> <span class="p">{</span>
<span class="kd">var</span> <span class="nx">found</span> <span class="o">=</span> <span class="nx">_</span><span class="p">.</span><span class="nx">find</span><span class="p">(</span><span class="nx">all</span><span class="p">,</span> <span class="kd">function</span><span class="p">(</span><span class="nx">item</span><span class="p">)</span> <span class="p">{</span>
<span class="nx">item</span><span class="p">.</span><span class="nx">indexOf</span><span class="p">(</span><span class="nx">version</span><span class="p">)</span> <span class="o">===</span> <span class="mi">0</span><span class="p">;</span>
<span class="p">});</span>
<span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="nx">found</span><span class="p">)</span> <span class="k">throw</span> <span class="k">new</span> <span class="nb">Error</span><span class="p">(</span><span class="s1">&#39;Unable to locate the specified migration &#39;</span> <span class="o">+</span> <span class="nx">version</span><span class="p">);</span>
<span class="k">return</span> <span class="nx">path</span><span class="p">.</span><span class="nx">join</span><span class="p">(</span><span class="nx">config</span><span class="p">.</span><span class="nx">directory</span><span class="p">,</span> <span class="nx">found</span><span class="p">);</span>
<span class="p">},</span></div></div></div><div class="segment"><div class="comments"><div class="wrapper"><p>Get all of the migrations that need to be run in the current batch.</p></div></div><div class="code"><div class="wrapper"> <span class="nx">getMigrations</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">all</span><span class="p">,</span> <span class="nx">version</span><span class="p">,</span> <span class="nx">direction</span><span class="p">,</span> <span class="nx">config</span><span class="p">)</span> <span class="p">{</span>
<span class="k">return</span> <span class="nx">_</span><span class="p">.</span><span class="nx">reduce</span><span class="p">(</span><span class="nx">all</span><span class="p">,</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
<span class="p">});</span>
<span class="p">},</span></div></div></div><div class="segment"><div class="comments"><div class="wrapper"><p>Check if the current version of the query has run.</p></div></div><div class="code"><div class="wrapper"> <span class="nx">hasRun</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">versions</span><span class="p">,</span> <span class="nx">check</span><span class="p">)</span> <span class="p">{</span>
<span class="k">return</span> <span class="nx">_</span><span class="p">.</span><span class="nx">some</span><span class="p">(</span><span class="nx">versions</span><span class="p">,</span> <span class="kd">function</span><span class="p">(</span><span class="nx">version</span><span class="p">)</span> <span class="p">{</span>
<span class="k">return</span> <span class="p">(</span><span class="nx">version</span><span class="p">.</span><span class="nx">indexOf</span><span class="p">(</span><span class="nx">check</span><span class="p">)</span> <span class="o">===</span> <span class="mi">0</span><span class="p">);</span>
<span class="p">});</span>
<span class="p">},</span></div></div></div><div class="segment"><div class="comments"><div class="wrapper"><p>Parse the version, which really only needs to be the
timestamp of the migration we wish to migrate to.</p></div></div><div class="code"><div class="wrapper"> <span class="nx">parseVersion</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">version</span><span class="p">)</span> <span class="p">{</span>
<span class="k">if</span> <span class="p">(</span><span class="nx">version</span> <span class="o">!==</span> <span class="s1">&#39;latest&#39;</span><span class="p">)</span> <span class="p">{</span>
<span class="nx">version</span> <span class="o">=</span> <span class="nx">version</span><span class="p">.</span><span class="nx">slice</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">14</span><span class="p">);</span>
<span class="k">if</span> <span class="p">(</span><span class="nx">version</span><span class="p">.</span><span class="nx">length</span> <span class="o">!==</span> <span class="mi">14</span><span class="p">)</span> <span class="p">{</span>
<span class="k">throw</span> <span class="k">new</span> <span class="nb">Error</span><span class="p">(</span><span class="s1">&#39;Invalid version number provided&#39;</span><span class="p">);</span>
<span class="p">}</span>
<span class="p">}</span>
<span class="k">return</span> <span class="nx">version</span><span class="p">;</span>
<span class="p">}</span>
<span class="p">};</span></div></div></div><div class="segment"><div class="comments"><div class="wrapper"><p>Get a date object in this form</p></div></div><div class="code"><div class="wrapper"><span class="kd">var</span> <span class="nx">yyyymmddhhmmss</span> <span class="o">=</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
<span class="kd">var</span> <span class="nx">d</span> <span class="o">=</span> <span class="k">new</span> <span class="nb">Date</span><span class="p">();</span>
<span class="k">return</span> <span class="nx">d</span><span class="p">.</span><span class="nx">getFullYear</span><span class="p">().</span><span class="nx">toString</span><span class="p">()</span> <span class="o">+</span> <span class="nx">padDate</span><span class="p">(</span><span class="nx">d</span><span class="p">.</span><span class="nx">getMonth</span><span class="p">()</span> <span class="o">+</span> <span class="mi">1</span><span class="p">)</span> <span class="o">+</span> <span class="nx">padDate</span><span class="p">(</span><span class="nx">d</span><span class="p">.</span><span class="nx">getDate</span><span class="p">())</span> <span class="o">+</span> <span class="nx">padDate</span><span class="p">(</span><span class="nx">d</span><span class="p">.</span><span class="nx">getHours</span><span class="p">())</span> <span class="o">+</span> <span class="nx">padDate</span><span class="p">(</span><span class="nx">d</span><span class="p">.</span><span class="nx">getMinutes</span><span class="p">())</span> <span class="o">+</span> <span class="nx">padDate</span><span class="p">(</span><span class="nx">d</span><span class="p">.</span><span class="nx">getSeconds</span><span class="p">());</span>
<span class="p">};</span></div></div></div><div class="segment"><div class="comments"><div class="wrapper"><p>Ensure that we have 2 places for each of the date segments</p></div></div><div class="code"><div class="wrapper"><span class="kd">var</span> <span class="nx">padDate</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(</span><span class="nx">segment</span><span class="p">)</span> <span class="p">{</span>
<span class="nx">segment</span> <span class="o">=</span> <span class="nx">segment</span><span class="p">.</span><span class="nx">toString</span><span class="p">();</span>
<span class="k">return</span> <span class="nx">segment</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="o">?</span> <span class="nx">segment</span> <span class="o">:</span> <span class="s1">&#39;0&#39;</span> <span class="o">+</span> <span class="nx">segment</span><span class="p">;</span>
<span class="p">};</span>
<span class="nx">module</span><span class="p">.</span><span class="nx">exports</span> <span class="o">=</span> <span class="nx">Migrate</span><span class="p">;</span></div></div></div></div></body></html>