aboutsummaryrefslogtreecommitdiff
path: root/javascript.html
diff options
context:
space:
mode:
Diffstat (limited to 'javascript.html')
-rw-r--r--javascript.html196
1 files changed, 196 insertions, 0 deletions
diff --git a/javascript.html b/javascript.html
new file mode 100644
index 0000000..764861c
--- /dev/null
+++ b/javascript.html
@@ -0,0 +1,196 @@
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml" lang="" xml:lang="">
+ <head>
+ <meta charset="utf-8" />
+ <meta name="generator" content="pandoc" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes" />
+ <meta name="dcterms.date" content="2018-09-21" />
+ <title>Style Guide</title>
+ <style type="text/css">
+ code{white-space: pre-wrap;}
+ span.smallcaps{font-variant: small-caps;}
+ span.underline{text-decoration: underline;}
+ div.column{display: inline-block; vertical-align: top; width: 50%;}
+ </style>
+ <style type="text/css">
+ a.sourceLine { display: inline-block; line-height: 1.25; }
+a.sourceLine { pointer-events: none; color: inherit; text-decoration: inherit; }
+a.sourceLine:empty { height: 1.2em; position: absolute; }
+.sourceCode { overflow: visible; }
+code.sourceCode { white-space: pre; position: relative; }
+div.sourceCode { margin: 1em 0; }
+pre.sourceCode { margin: 0; }
+@media screen {
+div.sourceCode { overflow: auto; }
+}
+@media print {
+code.sourceCode { white-space: pre-wrap; }
+a.sourceLine { text-indent: -1em; padding-left: 1em; }
+}
+pre.numberSource a.sourceLine
+ { position: relative; }
+pre.numberSource a.sourceLine:empty
+ { position: absolute; }
+pre.numberSource a.sourceLine::before
+ { content: attr(data-line-number);
+ position: absolute; left: -5em; text-align: right; vertical-align: baseline;
+ border: none; pointer-events: all;
+ -webkit-touch-callout: none; -webkit-user-select: none;
+ -khtml-user-select: none; -moz-user-select: none;
+ -ms-user-select: none; user-select: none;
+ padding: 0 4px; width: 4em;
+ color: #aaaaaa;
+ }
+pre.numberSource { margin-left: 3em; border-left: 1px solid #aaaaaa; padding-left: 4px; }
+div.sourceCode
+ { }
+@media screen {
+a.sourceLine::before { text-decoration: underline; }
+}
+code span.al { color: #ff0000; font-weight: bold; } /* Alert */
+code span.an { color: #60a0b0; font-weight: bold; font-style: italic; } /* Annotation */
+code span.at { color: #7d9029; } /* Attribute */
+code span.bn { color: #40a070; } /* BaseN */
+code span.bu { } /* BuiltIn */
+code span.cf { color: #007020; font-weight: bold; } /* ControlFlow */
+code span.ch { color: #4070a0; } /* Char */
+code span.cn { color: #880000; } /* Constant */
+code span.co { color: #60a0b0; font-style: italic; } /* Comment */
+code span.cv { color: #60a0b0; font-weight: bold; font-style: italic; } /* CommentVar */
+code span.do { color: #ba2121; font-style: italic; } /* Documentation */
+code span.dt { color: #902000; } /* DataType */
+code span.dv { color: #40a070; } /* DecVal */
+code span.er { color: #ff0000; font-weight: bold; } /* Error */
+code span.ex { } /* Extension */
+code span.fl { color: #40a070; } /* Float */
+code span.fu { color: #06287e; } /* Function */
+code span.im { } /* Import */
+code span.in { color: #60a0b0; font-weight: bold; font-style: italic; } /* Information */
+code span.kw { color: #007020; font-weight: bold; } /* Keyword */
+code span.op { color: #666666; } /* Operator */
+code span.ot { color: #007020; } /* Other */
+code span.pp { color: #bc7a00; } /* Preprocessor */
+code span.sc { color: #4070a0; } /* SpecialChar */
+code span.ss { color: #bb6688; } /* SpecialString */
+code span.st { color: #4070a0; } /* String */
+code span.va { color: #19177c; } /* Variable */
+code span.vs { color: #4070a0; } /* VerbatimString */
+code span.wa { color: #60a0b0; font-weight: bold; font-style: italic; } /* Warning */
+ </style>
+ <link rel="stylesheet" href="assets/lib/bootstrap/bootstrap.min.css">
+ <link rel="stylesheet" href="assets/lib/fontawesome/css/font-awesome.min.css">
+ <link rel="stylesheet" href="assets/stylesheets/main.css">
+ </head>
+ <body>
+ <header class="container">
+ <div style="text-align: center;">
+ <h1>Style Guide</h1>
+ <p class="subtitle">Software Engineering at Driver</p>
+ <nav class="my-4">
+ <a class="btn btn-light" href="css.html">
+ <img src="assets/images/css.svg" width="16px" class="img-fluid">
+ CSS
+ </a>
+ <a class="btn btn-light" href="git.html">
+ <img src="assets/images/git.png" width="16px" class="img-fluid">
+ Git
+ </a>
+ <a class="btn btn-light" href="html.html">
+ <img src="assets/images/html5.svg" width="16px" class="img-fluid">
+ HTML
+ </a>
+ <a class="btn btn-light" href="javascript.html">
+ <img src="assets/images/javascript.png" width="16px" class="img-fluid">
+ JavaScript
+ </a>
+ <a class="btn btn-light" href="scala.html">
+ <img src="assets/images/scala.png" width="16px" class="img-fluid">
+ Scala
+ </a>
+ <a class="btn btn-light" href="shell-script.html">
+ <img src="assets/images/bash.svg" width="16px" class="img-fluid">
+ Shell Script
+ </a>
+ </nav>
+ </div>
+ </header>
+ <div class="container">
+ This guide recommends stylistic and architectural best
+ practices, designed to make your code easier for others to
+ understand. It offers <em>guidelines</em> not <em>rules</em>,
+ and there are situations in which the advice offered
+ should be actively ignored.
+ <hr>
+ </div>
+ <main class="container">
+ <h2 id="javascript">JavaScript</h2>
+<ul>
+<li><p>Type with flow</p></li>
+<li><p>Style with <a href="https://prettier.io/">prettier</a> (<a href="#prettier">see section below</a>)</p></li>
+<li><p>Lint with eslint and use <code>eslint:recommended</code> at a minimum</p></li>
+<li><p>Test with <a href="https://facebook.github.io/jest/">jest</a> and enzyme</p></li>
+<li><p>2 spaces (instead of tabs)</p></li>
+<li><p>Promises (not callbacks)</p></li>
+<li><p>No <a href="https://medium.com/google-developers/exploring-es7-decorators-76ecb65fb841">decorators</a></p></li>
+<li><p>No <a href="https://mobx.js.org/">mobx</a></p></li>
+<li><p>Place tests alongside the file(s) it tests (not in a separate directory)</p></li>
+<li><p>End test files with <code>.test.js</code></p></li>
+</ul>
+<h3 id="reactredux">React/Redux</h3>
+<ul>
+<li><p>Lint with <a href="https://github.com/palantir/tslint-react"><code>tslint-react</code></a> or eslint’s <a href="https://github.com/yannickcr/eslint-plugin-react"><code>plugin:react/recommended</code></a> at a minimum.</p></li>
+<li><p>No unnecessary and empty <code>&lt;div&gt;</code>’s</p></li>
+<li><p>If <code>this.props.&lt;variable name&gt;</code> is used more than once, dereference it at the top of <code>render</code>.</p></li>
+<li><p>Extract variables used in <code>render()</code> to the top of <code>render()</code></p></li>
+<li><p>API calls should lie in a testable file outside of components.</p></li>
+<li><p>Components should not wait for promises to resolve, instead listen on props via redux’ <code>mapStateToProps()</code>.</p></li>
+<li><p>Declare and export components in separate places (otherwise the web inspector cannot name components properly)</p></li>
+</ul>
+<h3 id="flowtype">Flowtype</h3>
+<ul>
+<li><p>Any types used in more than one file should be placed in <code>src/types.js</code></p></li>
+<li><p>Add flow linting via <a href="https://github.com/gajus/eslint-plugin-flowtype">eslint-plugin-flowtype</a></p></li>
+<li><p>Disallow β€œ<code>any</code>” with <a href="https://github.com/gajus/eslint-plugin-flowtype#no-weak-types">eslint no-weak-types</a> (use β€œ<code>Obect</code>” and β€œ<code>Function</code>” to cover complicated use-cases)</p></li>
+<li><p>In components which use <code>mapStateToProps</code>, separate <code>OwnProps</code> from <code>ConnectedProps</code> into separate types. Join them with <code>type Props = OwnProps &amp; ConnectedProps</code>. In addition, if using <code>mapDispatchToProps</code>, create a type <code>DispatchProps</code> and join that with <code>Props</code>.</p></li>
+</ul>
+<h3 id="𝓣𝓒-typescript-𝓣𝓒">𝓣𝓒 TypeScript 𝓣𝓒</h3>
+<ul>
+<li><p>Lint with <a href="https://github.com/palantir/tslint"><code>tslint:recommended</code></a> at a minimum.</p></li>
+<li><p>No implicit any (type everything that’s not inferable)</p></li>
+<li><p>Any variable declared without an initial value should be typed</p></li>
+</ul>
+<h3 id="prettier">Prettier</h3>
+<p>Add the following to <code>package.json</code>:</p>
+<div class="sourceCode" id="cb1"><pre class="sourceCode json"><code class="sourceCode json"><a class="sourceLine" id="cb1-1" data-line-number="1"> <span class="er">&quot;prettier&quot;:</span> <span class="fu">{</span></a>
+<a class="sourceLine" id="cb1-2" data-line-number="2"> <span class="dt">&quot;overrides&quot;</span><span class="fu">:</span> <span class="ot">[</span></a>
+<a class="sourceLine" id="cb1-3" data-line-number="3"> <span class="fu">{</span></a>
+<a class="sourceLine" id="cb1-4" data-line-number="4"> <span class="dt">&quot;files&quot;</span><span class="fu">:</span> <span class="ot">[</span><span class="st">&quot;*.js&quot;</span><span class="ot">,</span> <span class="st">&quot;*.scss&quot;</span><span class="ot">,</span> <span class="st">&quot;*.css&quot;</span><span class="ot">,</span> <span class="st">&quot;*.pcss&quot;</span><span class="ot">]</span><span class="fu">,</span></a>
+<a class="sourceLine" id="cb1-5" data-line-number="5"> <span class="dt">&quot;options&quot;</span><span class="fu">:</span> <span class="fu">{</span></a>
+<a class="sourceLine" id="cb1-6" data-line-number="6"> <span class="dt">&quot;singleQuote&quot;</span><span class="fu">:</span> <span class="kw">true</span><span class="fu">,</span></a>
+<a class="sourceLine" id="cb1-7" data-line-number="7"> <span class="dt">&quot;trailingComma&quot;</span><span class="fu">:</span> <span class="st">&quot;all&quot;</span></a>
+<a class="sourceLine" id="cb1-8" data-line-number="8"> <span class="fu">}</span></a>
+<a class="sourceLine" id="cb1-9" data-line-number="9"> <span class="fu">}</span></a>
+<a class="sourceLine" id="cb1-10" data-line-number="10"> <span class="ot">]</span></a>
+<a class="sourceLine" id="cb1-11" data-line-number="11"> <span class="fu">}</span></a></code></pre></div>
+<p>The following information about prettier is better described on the prettier documentation <a href="https://prettier.io/docs/en/precommit.html#option-1-lint-staged-https-githubcom-okonet-lint-staged">here</a>. Use <code>lint-staged</code> to auto-call prettier in a <code>precommit</code> β€œ<code>script</code>”:</p>
+<div class="sourceCode" id="cb2"><pre class="sourceCode json"><code class="sourceCode json"><a class="sourceLine" id="cb2-1" data-line-number="1"> <span class="er">&quot;lint-staged&quot;:</span> <span class="fu">{</span></a>
+<a class="sourceLine" id="cb2-2" data-line-number="2"> <span class="dt">&quot;src/**/*.scss&quot;</span><span class="fu">:</span> <span class="ot">[</span><span class="st">&quot;prettier --parser scss --write&quot;</span><span class="ot">,</span> <span class="st">&quot;git add&quot;</span><span class="ot">]</span><span class="fu">,</span></a>
+<a class="sourceLine" id="cb2-3" data-line-number="3"> <span class="dt">&quot;src/**/*.{js,css}&quot;</span><span class="fu">:</span> <span class="ot">[</span><span class="st">&quot;prettier --parser flow --write&quot;</span><span class="ot">,</span> <span class="st">&quot;git add&quot;</span><span class="ot">]</span><span class="fu">,</span></a>
+<a class="sourceLine" id="cb2-4" data-line-number="4"> <span class="dt">&quot;nightwatch/**/*.js&quot;</span><span class="fu">:</span> <span class="ot">[</span><span class="st">&quot;prettier --write&quot;</span><span class="ot">,</span> <span class="st">&quot;git add&quot;</span><span class="ot">]</span></a>
+<a class="sourceLine" id="cb2-5" data-line-number="5"> <span class="fu">}</span></a></code></pre></div>
+<h3 id="npm">Npm</h3>
+<ul>
+<li>Support the following <code>script</code>’s in your root <code>package.json</code>:</li>
+</ul>
+<ol type="1">
+<li><code>β€œwatch”</code>: Starts the dev server</li>
+<li><code>β€œbuild”</code>: Builds static assets (if they exist) β€œ<code>/src</code>” -&gt; β€œ<code>/build</code>”</li>
+<li><code>β€œtest”</code>: Runs all tests (linting first, then unit tests)</li>
+</ol>
+ </main>
+ <footer class="small mt-6 mb-1">
+ <span class="date">2018-09-21</span>
+ | <a href="https://github.com/drivergroup/best-practices/blob/master/guides/javascript.md" style="display: inline-block;"><i class="fa fa-github"></i> Edit on GitHub</a>
+ </footer>
+ </body>
+</html>