UNPKG

3.46 kBJavaScriptView Raw
1/**
2 * Requires space before `()` or `{}` in function declarations.
3 *
4 * Type: `Object`
5 *
6 * Values: `"beforeOpeningRoundBrace"` and `"beforeOpeningCurlyBrace"` as child properties.
7 * Child properties must be set to `true`.
8 *
9 * #### Example
10 *
11 * ```js
12 * "requireSpacesInFunctionDeclaration": {
13 * "beforeOpeningRoundBrace": true,
14 * "beforeOpeningCurlyBrace": true
15 * }
16 * ```
17 *
18 * ##### Valid
19 *
20 * ```js
21 * function a () {}
22 * ```
23 *
24 * ##### Invalid
25 *
26 * ```js
27 * function a() {}
28 * function a (){}
29 * function a(){}
30 * ```
31 */
32
33var assert = require('assert');
34
35module.exports = function() {};
36
37module.exports.prototype = {
38 configure: function(options) {
39 assert(
40 typeof options === 'object',
41 this.getOptionName() + ' option must be the object'
42 );
43
44 if ('beforeOpeningRoundBrace' in options) {
45 assert(
46 options.beforeOpeningRoundBrace === true,
47 this.getOptionName() + '.beforeOpeningRoundBrace ' +
48 'property requires true value or should be removed'
49 );
50 }
51
52 if ('beforeOpeningCurlyBrace' in options) {
53 assert(
54 options.beforeOpeningCurlyBrace === true,
55 this.getOptionName() + '.beforeOpeningCurlyBrace ' +
56 'property requires true value or should be removed'
57 );
58 }
59
60 assert(
61 options.beforeOpeningCurlyBrace || options.beforeOpeningRoundBrace,
62 this.getOptionName() + ' must have beforeOpeningCurlyBrace or beforeOpeningRoundBrace property'
63 );
64
65 this._beforeOpeningRoundBrace = Boolean(options.beforeOpeningRoundBrace);
66 this._beforeOpeningCurlyBrace = Boolean(options.beforeOpeningCurlyBrace);
67 },
68
69 getOptionName: function() {
70 return 'requireSpacesInFunctionDeclaration';
71 },
72
73 check: function(file, errors) {
74 var beforeOpeningRoundBrace = this._beforeOpeningRoundBrace;
75 var beforeOpeningCurlyBrace = this._beforeOpeningCurlyBrace;
76
77 file.iterateNodesByType(['FunctionDeclaration'], function(node) {
78 // Exception for `export default function` #1376
79 if (!node.id) {
80 return;
81 }
82
83 if (beforeOpeningRoundBrace) {
84 // for a named function, use node.id
85 var functionToken = file.getFirstNodeToken(node.id || node);
86 if (node.async && functionToken.value === 'async') {
87 functionToken = file.getNextToken(functionToken);
88 }
89 // if generator, set token to be * instead
90 if (node.generator && functionToken.value === 'function') {
91 functionToken = file.getNextToken(functionToken);
92 }
93 errors.assert.whitespaceBetween({
94 token: functionToken,
95 nextToken: file.getNextToken(functionToken),
96 message: 'Missing space before opening round brace'
97 });
98 }
99
100 if (beforeOpeningCurlyBrace) {
101 var bodyToken = file.getFirstNodeToken(node.body);
102 errors.assert.whitespaceBetween({
103 token: file.getPrevToken(bodyToken),
104 nextToken: bodyToken,
105 message: 'Missing space before opening curly brace'
106 });
107 }
108 });
109 }
110
111};