@@ -12,12 +12,12 @@ ES6 or TypeScript.
1212### General
1313
1414#### Write useful comments
15- Comments that explain what some block of code does are nice; they can tell you something in less
15+ Comments that explain what some block of code does are nice; they can tell you something in less
1616time than it would take to follow through the code itself.
1717
18- Comments that explain why some block of code exists at all, or does something the way it does,
19- are _ invaluable_ . The "why" is difficult, or sometimes impossible, to track down without seeking out
20- the original author. When collaborators are in the same room, this hurts productivity.
18+ Comments that explain why some block of code exists at all, or does something the way it does,
19+ are _ invaluable_ . The "why" is difficult, or sometimes impossible, to track down without seeking out
20+ the original author. When collaborators are in the same room, this hurts productivity.
2121When collaborators are in different timezones, this can be devastating to productivity.
2222
2323For example, this is a not-very-useful comment:
@@ -55,22 +55,22 @@ do this:
5555```
5656
5757#### Prefer small, focused modules
58- Keeping modules to a single responsibility makes the code easier to test, consume, and maintain.
59- ES6 modules offer a straightforward way to organize code into logical, granular units.
58+ Keeping modules to a single responsibility makes the code easier to test, consume, and maintain.
59+ ES6 modules offer a straightforward way to organize code into logical, granular units.
6060Ideally, individual files are 200 - 300 lines of code.
6161
62- As a rule of thumb, once a file draws near 400 lines (barring abnormally long constants / comments),
63- start considering how to refactor into smaller pieces.
62+ As a rule of thumb, once a file draws near 400 lines (barring abnormally long constants / comments),
63+ start considering how to refactor into smaller pieces.
6464
6565#### Less is more
66- Once a feature is released, it never goes away. We should avoid adding features that don't offer
67- high user value for price we pay both in maintenance, complexity, and payload size. When in doubt,
68- leave it out.
66+ Once a feature is released, it never goes away. We should avoid adding features that don't offer
67+ high user value for price we pay both in maintenance, complexity, and payload size. When in doubt,
68+ leave it out.
6969
70- This applies especially so to providing two different APIs to accomplish the same thing. Always
70+ This applies especially so to providing two different APIs to accomplish the same thing. Always
7171prefer sticking to a _ single_ API for accomplishing something.
7272
73- ### 100 column limit
73+ ### 100 column limit
7474All code and docs in the repo should be 100 columns or fewer. This applies to TypeScript, SCSS,
7575 HTML, bash scripts, and markdown files.
7676
@@ -81,12 +81,12 @@ Avoid `any` where possible. If you find yourself using `any`, consider whether a
8181appropriate in your case.
8282
8383For methods and properties that are part of a component's public API, all types must be explicitly
84- specified because our documentation tooling cannot currently infer types in places where TypeScript
84+ specified because our documentation tooling cannot currently infer types in places where TypeScript
8585can.
8686
8787#### Fluent APIs
8888When creating a fluent or builder-pattern style API, use the ` this ` return type for methods:
89- ```
89+ ``` ts
9090class ConfigBuilder {
9191 withName(name : string ): this {
9292 this .config .name = name ;
@@ -95,13 +95,39 @@ class ConfigBuilder {
9595}
9696```
9797
98+ #### RxJS
99+ When dealing with RxJS operators, import the operator functions directly (e.g.
100+ ` import "rxjs/operator/map" ` ), as opposed to using the "patch" imports which pollute the user's
101+ global Observable object (e.g. ` import "rxjs/add/operator/map" ` ):
102+
103+ ``` ts
104+ // NO
105+ import ' rxjs/add/operator/map' ;
106+ someObservable .map (... ).subscribe (... );
107+
108+ // YES
109+ import {map } from ' rxks/operator/map' ;
110+ map .call (someObservable , ... ).subscribe (... );
111+ ```
112+
113+ Note that this approach can be inflexible when dealing with long chains of operators. You can use
114+ the ` FunctionChain ` class to help with it:
115+
116+ ``` ts
117+ // Before
118+ someObservable .filter (... ).map (... ).do (... );
119+
120+ // After
121+ new FunctionChain (someObservable ).call (filter , ... ).call (map , ... ).call (do , ... ).execute ();
122+ ```
123+
98124#### Access modifiers
99125* Omit the ` public ` keyword as it is the default behavior.
100126* Use ` private ` when appropriate and possible, prefixing the name with an underscore.
101127* Use ` protected ` when appropriate and possible with no prefix.
102- * Prefix * library-internal* properties and methods with an underscore without using the ` private `
128+ * Prefix * library-internal* properties and methods with an underscore without using the ` private `
103129keyword. This is necessary for anything that must be public (to be used by Angular), but should not
104- be part of the user-facing API. This typically applies to symbols used in template expressions,
130+ be part of the user-facing API. This typically applies to symbols used in template expressions,
105131` @ViewChildren ` / ` @ContentChildren ` properties, host bindings, and ` @Input ` / ` @Output ` properties
106132(when using an alias).
107133
@@ -114,14 +140,14 @@ All public APIs must have user-facing comments. These are extracted and shown in
114140on [ material.angular.io] ( https://material.angular.io ) .
115141
116142Private and internal APIs should have JsDoc when they are not obvious. Ultimately it is the purview
117- of the code reviwer as to what is "obvious", but the rule of thumb is that * most* classes,
118- properties, and methods should have a JsDoc description.
143+ of the code reviwer as to what is "obvious", but the rule of thumb is that * most* classes,
144+ properties, and methods should have a JsDoc description.
119145
120146Properties should have a concise description of what the property means:
121147``` ts
122148 /** The label position relative to the checkbox. Defaults to 'after' */
123149 @Input () labelPosition : ' before' | ' after' = ' after' ;
124- ```
150+ ```
125151
126152Methods blocks should describe what the function does and provide a description for each parameter
127153and the return value:
@@ -145,7 +171,7 @@ Boolean properties and return values should use "Whether..." as opposed to "True
145171
146172##### General
147173* Prefer writing out words instead of using abbreviations.
148- * Prefer * exact* names over short names (within reason). E.g., ` labelPosition ` is better than
174+ * Prefer * exact* names over short names (within reason). E.g., ` labelPosition ` is better than
149175` align ` because the former much more exactly communicates what the property means.
150176* Except for ` @Input ` properties, use ` is ` and ` has ` prefixes for boolean properties / methods.
151177
@@ -169,25 +195,25 @@ The name of a method should capture the action that is performed *by* that metho
169195### Angular
170196
171197#### Host bindings
172- Prefer using the ` host ` object in the directive configuration instead of ` @HostBinding ` and
173- ` @HostListener ` . We do this because TypeScript preserves the type information of methods with
198+ Prefer using the ` host ` object in the directive configuration instead of ` @HostBinding ` and
199+ ` @HostListener ` . We do this because TypeScript preserves the type information of methods with
174200decorators, and when one of the arguments for the method is a native ` Event ` type, this preserved
175- type information can lead to runtime errors in non-browser environments (e.g., server-side
176- pre-rendering).
201+ type information can lead to runtime errors in non-browser environments (e.g., server-side
202+ pre-rendering).
177203
178204
179205### CSS
180206
181207#### Be cautious with use of ` display: flex `
182- * The [ baseline calculation for flex elements] ( http://www.w3.org/TR/css-flexbox-1/#flex-baselines )
183- is different than other display values, making it difficult to align flex elements with standard
208+ * The [ baseline calculation for flex elements] ( http://www.w3.org/TR/css-flexbox-1/#flex-baselines )
209+ is different than other display values, making it difficult to align flex elements with standard
184210elements like input and button.
185211* Component outermost elements are never flex (block or inline-block)
186212* Don't use ` display: flex ` on elements that will contain projected content.
187213
188214#### Use lowest specificity possible
189- Always prioritize lower specificity over other factors. Most style definitions should consist of a
190- single element or css selector plus necessary state modifiers. ** Avoid SCSS nesting for the sake of
215+ Always prioritize lower specificity over other factors. Most style definitions should consist of a
216+ single element or css selector plus necessary state modifiers. ** Avoid SCSS nesting for the sake of
191217code organization.** This will allow users to much more easily override styles.
192218
193219For example, rather than doing this:
@@ -224,12 +250,12 @@ md-calendar {
224250The end-user of a component should be the one to decide how much margin a component has around it.
225251
226252#### Prefer styling the host element vs. elements inside the template (where possible).
227- This makes it easier to override styles when necessary. For example, rather than
253+ This makes it easier to override styles when necessary. For example, rather than
228254
229255``` scss
230256the-host-element {
231257 // ...
232-
258+
233259 .some-child-element {
234260 color : red ;
235261 }
@@ -267,4 +293,4 @@ When it is not super obvious, include a brief description of what a class repres
267293
268294// Portion of the floating panel that sits, invisibly, on top of the input.
269295.md-datepicker-input-mask { }
270- ```
296+ ```
0 commit comments