eslint-config-arklint 1.11.0 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,43 +1,43 @@
1
1
  # eslint-config-arklint
2
- My personal ESLint configuration. Most of it is based on [eslint-config-react-app](https://github.com/facebook/create-react-app/blob/0a827f69ab0d2ee3871ba9b71350031d8a81b7ae/packages/eslint-config-react-app/README.md) but with additional stylistic and JSDoc rules.
2
+ My personal ESLint configuration.
3
3
 
4
4
  ---
5
5
 
6
6
  ## Installation
7
7
 
8
8
  ```shell
9
- yarn add eslint-config-arklint -D
9
+ yarn add eslint eslint-config-arklint -D
10
10
  ```
11
11
 
12
- You also need to add [ESLint](https://github.com/eslint/eslint) in your `devDependencies`:
12
+ ## Usage
13
13
 
14
- ```shell
15
- yarn add eslint -D
16
- ```
14
+ > [!WARNING]
15
+ > Only **flat config** is supported, either CJS or ESM.
17
16
 
18
- ## Usage
17
+ ### Default config
19
18
 
20
- Add the extend in your `.eslintrc.js`:
19
+ The default configuration includes standards and stylistic rules for JS.
21
20
 
22
- ```javascript
23
- module.exports = {
24
- extends: "arklint",
25
- rules: {
26
- // Rule overrides
27
- }
28
- }
21
+ ```js
22
+ import arklintConfig from "eslint-config-arklint";
23
+
24
+ export default [
25
+ ...arklintConfig
26
+ ];
29
27
  ```
30
28
 
31
- The default configuration includes the extensions for `import` and `jsdoc`. The configuration for `react` has to be added manually:
32
-
33
- ```javascript
34
- module.exports = {
35
- extends: [
36
- "arklint",
37
- "arklint/extensions/react"
38
- ],
39
- rules: {
40
- // Rule overrides
41
- }
42
- }
29
+ ### Extensions
30
+
31
+ Optional extensions can be added to add rules for `import`, `react` and `jsdoc`:
32
+
33
+ ```js
34
+ import arklintConfig from "eslint-config-arklint";
35
+ import { importConfig, reactConfig, jsdocConfig } from "eslint-config-arklint/extensions";
36
+
37
+ export default [
38
+ ...arklintConfig,
39
+ ...reactConfig,
40
+ ...importConfig,
41
+ ...jsdocConfig
42
+ ];
43
43
  ```
@@ -0,0 +1,30 @@
1
+ var importPlugin = require("eslint-plugin-import");
2
+ var sortImportsES6Autofix = require("eslint-plugin-sort-imports-es6-autofix");
3
+ module.exports = [importPlugin.flatConfigs.recommended, {
4
+ plugins: {
5
+ "sort-imports-es6-autofix": sortImportsES6Autofix
6
+ },
7
+ rules: {
8
+ "sort-imports-es6-autofix/sort-imports-es6": ["warn", {
9
+ ignoreCase: true,
10
+ memberSyntaxSortOrder: ["all", "multiple", "single", "none"]
11
+ }],
12
+ "import/no-named-as-default-member": "off",
13
+ "import/no-anonymous-default-export": "off",
14
+ "import/newline-after-import": ["warn", {
15
+ count: 2,
16
+ considerComments: true
17
+ }],
18
+ "import/order": ["warn", {
19
+ "newlines-between": "always",
20
+ "groups": [["type", "unknown", "builtin"], "external", ["internal", "parent", "index", "sibling"]],
21
+ "warnOnUnassignedImports": true
22
+ }],
23
+ "import/first": "error",
24
+ "import/no-amd": "error",
25
+ "import/no-webpack-loader-syntax": "error",
26
+ "import/no-unresolved": ["error", {
27
+ commonjs: true
28
+ }]
29
+ }
30
+ }];
@@ -0,0 +1,8 @@
1
+ var importConfig = require("./import.cjs");
2
+ var jsdocConfig = require("./jsdoc.cjs");
3
+ var reactConfig = require("./react.cjs");
4
+ module.exports = {
5
+ importConfig,
6
+ jsdocConfig,
7
+ reactConfig
8
+ };
@@ -0,0 +1,82 @@
1
+ var jsdocPlugin = require("eslint-plugin-jsdoc");
2
+ module.exports = [jsdocPlugin.configs["flat/recommended"], {
3
+ plugins: {
4
+ jsdoc: jsdocPlugin
5
+ },
6
+ settings: {
7
+ jsdoc: {
8
+ maxLines: 2,
9
+ mode: "typescript",
10
+ preferredTypes: {
11
+ "object<>": false,
12
+ "Object<>": "Record<>",
13
+ "Object": "object",
14
+ ".<>": "<>",
15
+ "*": "any"
16
+ }
17
+ }
18
+ },
19
+ rules: {
20
+ "jsdoc/check-param-names": "warn",
21
+ "jsdoc/check-template-names": "warn",
22
+ "jsdoc/lines-before-block": "warn",
23
+ "jsdoc/require-jsdoc": "off",
24
+ "jsdoc/require-returns": "off",
25
+ "jsdoc/require-template": "warn",
26
+ "jsdoc/check-indentation": ["warn", {
27
+ excludeTags: ["import", "example"]
28
+ }],
29
+ "jsdoc/no-bad-blocks": "warn",
30
+ "jsdoc/tag-lines": ["warn", "never"],
31
+ "jsdoc/no-defaults": "off",
32
+ "jsdoc/require-hyphen-before-param-description": ["warn", "always", {
33
+ tags: {
34
+ property: "always",
35
+ template: "always",
36
+ return: "never"
37
+ }
38
+ }],
39
+ "jsdoc/check-line-alignment": ["warn", "never"],
40
+ "jsdoc/match-name": ["warn", {
41
+ match: [{
42
+ allowName: "/^_?([A-Z][a-z]+)+$/",
43
+ message: "The name should be written in PascalCase.",
44
+ tags: ["typedef"]
45
+ }, {
46
+ allowName: "/^([A-Z][a-z]+)+$/",
47
+ message: "The name should be written in PascalCase.",
48
+ tags: ["callback"]
49
+ }, {
50
+ allowName: "/^[A-Z]{1}$/",
51
+ message: "The name should be a single capital letter.",
52
+ tags: ["template"]
53
+ }]
54
+ }],
55
+ "jsdoc/match-description": ["warn", {
56
+ contexts: ["any"],
57
+ mainDescription: {
58
+ message: "The main description should be written in the third person, begin with a capital letter and end with a period.",
59
+ match: "/^[A-Z][.^\\w]*s\\b.*\\.$/us"
60
+ },
61
+ matchDescription: "^[A-Z].*[^\\.]$",
62
+ tags: {
63
+ param: {
64
+ message: "@param description should begin with a capital letter and not end with a period.",
65
+ match: true
66
+ },
67
+ property: {
68
+ message: "@property description should begin with a capital letter and not end with a period.",
69
+ match: true
70
+ },
71
+ returns: {
72
+ message: "@returns description should begin with a capital letter and not end with a period.",
73
+ match: true
74
+ },
75
+ template: {
76
+ message: "@template description should begin with a capital letter and not end with a period.",
77
+ match: true
78
+ }
79
+ }
80
+ }]
81
+ }
82
+ }];
@@ -0,0 +1,84 @@
1
+ var jsxA11yPlugin = require("eslint-plugin-jsx-a11y");
2
+ var reactHooksPlugin = require("eslint-plugin-react-hooks");
3
+ var reactPlugin = require("eslint-plugin-react");
4
+ module.exports = [reactPlugin.configs.flat.recommended, reactPlugin.configs.flat["jsx-runtime"], {
5
+ plugins: {
6
+ "react": reactPlugin,
7
+ "react-hooks": reactHooksPlugin,
8
+ "jsx-a11y": jsxA11yPlugin
9
+ },
10
+ languageOptions: {
11
+ parserOptions: {
12
+ ecmaFeatures: {
13
+ jsx: true
14
+ },
15
+ babelOptions: {
16
+ presets: ["@babel/preset-react"]
17
+ }
18
+ }
19
+ },
20
+ settings: {
21
+ react: {
22
+ version: "detect"
23
+ }
24
+ },
25
+ rules: {
26
+ "jsx-a11y/alt-text": "warn",
27
+ "jsx-a11y/anchor-has-content": "warn",
28
+ "jsx-a11y/anchor-is-valid": ["warn", {
29
+ aspects: ["noHref", "invalidHref"]
30
+ }],
31
+ "jsx-a11y/aria-activedescendant-has-tabindex": "warn",
32
+ "jsx-a11y/aria-props": "warn",
33
+ "jsx-a11y/aria-proptypes": "warn",
34
+ "jsx-a11y/aria-role": ["warn", {
35
+ ignoreNonDOM: true
36
+ }],
37
+ "jsx-a11y/aria-unsupported-elements": "warn",
38
+ "jsx-a11y/heading-has-content": "warn",
39
+ "jsx-a11y/iframe-has-title": "warn",
40
+ "jsx-a11y/img-redundant-alt": "warn",
41
+ "jsx-a11y/no-access-key": "warn",
42
+ "jsx-a11y/no-distracting-elements": "warn",
43
+ "jsx-a11y/no-redundant-roles": "warn",
44
+ "jsx-a11y/role-has-required-aria-props": "warn",
45
+ "jsx-a11y/role-supports-aria-props": "warn",
46
+ "jsx-a11y/scope": "warn",
47
+ "react/display-name": "warn",
48
+ "react-hooks/exhaustive-deps": "warn",
49
+ "react-hooks/rules-of-hooks": "error",
50
+ "react/jsx-curly-brace-presence": "warn",
51
+ "react/jsx-first-prop-new-line": ["warn", "multiline"],
52
+ "react/jsx-fragments": ["warn", "element"],
53
+ "react/jsx-key": "warn",
54
+ "react/jsx-max-props-per-line": ["warn", {
55
+ maximum: {
56
+ single: 3,
57
+ multi: 1
58
+ }
59
+ }],
60
+ "react/jsx-no-comment-textnodes": "warn",
61
+ "react/jsx-no-duplicate-props": "warn",
62
+ "react/jsx-no-target-blank": "warn",
63
+ "react/jsx-no-undef": "error",
64
+ "react/jsx-pascal-case": "warn",
65
+ "react/jsx-tag-spacing": ["warn", {
66
+ closingSlash: "never",
67
+ beforeSelfClosing: "always",
68
+ afterOpening: "never",
69
+ beforeClosing: "never"
70
+ }],
71
+ "react/jsx-uses-react": "warn",
72
+ "react/jsx-uses-vars": "warn",
73
+ "react/jsx-boolean-value": ["warn", "never"],
74
+ "react/jsx-closing-bracket-location": "warn",
75
+ "react/jsx-wrap-multilines": "warn",
76
+ "react/jsx-props-no-spread-multi": "warn",
77
+ "react/no-danger-with-children": "warn",
78
+ "react/no-direct-mutation-state": "warn",
79
+ "react/no-is-mounted": "warn",
80
+ "react/prop-types": "off",
81
+ "react/require-render-return": "error",
82
+ "react/style-prop-object": "warn"
83
+ }
84
+ }];
package/cjs/index.cjs ADDED
@@ -0,0 +1,202 @@
1
+ var babelParser = require("@babel/eslint-parser");
2
+ var globals = require("globals");
3
+ var js = require("@eslint/js");
4
+ var stylisticJsPlugin = require("@stylistic/eslint-plugin-js");
5
+ module.exports = [{
6
+ files: ["**/*.{js,mjs,cjs,jsx}"]
7
+ }, {
8
+ languageOptions: {
9
+ globals: {
10
+ ...globals.browser,
11
+ ...globals.commonjs,
12
+ ...globals.node,
13
+ ...globals.es2025
14
+ },
15
+ parser: babelParser,
16
+ parserOptions: {
17
+ requireConfigFile: false,
18
+ ecmaVersion: "latest",
19
+ babelOptions: {
20
+ babelrc: false,
21
+ configFile: false,
22
+ presets: ["@babel/preset-env"]
23
+ }
24
+ }
25
+ }
26
+ }, js.configs.recommended, {
27
+ plugins: {
28
+ "@stylistic/js": stylisticJsPlugin
29
+ },
30
+ rules: {
31
+ "array-callback-return": "warn",
32
+ "arrow-body-style": "warn",
33
+ "camelcase": "warn",
34
+ "default-case": ["warn", {
35
+ commentPattern: "^no default$"
36
+ }],
37
+ "dot-notation": "warn",
38
+ "eqeqeq": ["warn", "smart"],
39
+ "getter-return": "warn",
40
+ "no-array-constructor": "warn",
41
+ "no-async-promise-executor": "off",
42
+ "no-caller": "warn",
43
+ "no-case-declarations": "off",
44
+ "no-cond-assign": ["warn", "except-parens"],
45
+ "no-const-assign": "warn",
46
+ "no-control-regex": "warn",
47
+ "no-delete-var": "warn",
48
+ "no-dupe-args": "warn",
49
+ "no-dupe-class-members": "warn",
50
+ "no-dupe-keys": "warn",
51
+ "no-duplicate-case": "warn",
52
+ "no-duplicate-imports": "warn",
53
+ "no-empty-character-class": "warn",
54
+ "no-empty-pattern": "warn",
55
+ "no-eval": "warn",
56
+ "no-ex-assign": "warn",
57
+ "no-extend-native": "warn",
58
+ "no-extra-bind": "warn",
59
+ "no-extra-label": "warn",
60
+ "no-extra-semi": "off",
61
+ "no-fallthrough": "warn",
62
+ "no-func-assign": "warn",
63
+ "no-global-assign": "warn",
64
+ "no-implied-eval": "warn",
65
+ "no-invalid-regexp": "warn",
66
+ "no-iterator": "warn",
67
+ "no-label-var": "warn",
68
+ "no-labels": ["warn", {
69
+ allowLoop: true,
70
+ allowSwitch: false
71
+ }],
72
+ "no-lone-blocks": "warn",
73
+ "no-loop-func": "warn",
74
+ "no-multi-str": "warn",
75
+ "no-new-func": "warn",
76
+ "no-new-object": "warn",
77
+ "no-new-symbol": "warn",
78
+ "no-new-wrappers": "warn",
79
+ "no-obj-calls": "warn",
80
+ "no-octal-escape": "warn",
81
+ "no-octal": "warn",
82
+ "no-redeclare": "warn",
83
+ "no-regex-spaces": "warn",
84
+ "no-restricted-globals": ["error", "addEventListener", "blur", "close", "closed", "confirm", "event", "external", "focus", "frameElement", "frames", "history", "innerHeight", "innerWidth", "length", "location", "locationbar", "menubar", "moveBy", "moveTo", "name", "onblur", "onerror", "onfocus", "onload", "onresize", "onunload", "open", "opener", "outerHeight", "outerWidth", "pageXOffset", "pageYOffset", "parent", "print", "removeEventListener", "resizeBy", "resizeTo", "screen", "screenLeft", "screenTop", "screenX", "screenY", "scroll", "scrollbars", "scrollBy", "scrollTo", "scrollX", "scrollY", "self", "status", "statusbar", "stop", "toolbar", "top"],
85
+ "no-restricted-syntax": ["warn", "WithStatement"],
86
+ "no-script-url": "warn",
87
+ "no-self-assign": "warn",
88
+ "no-self-compare": "warn",
89
+ "no-sequences": "warn",
90
+ "no-shadow-restricted-names": "warn",
91
+ "no-sparse-arrays": "warn",
92
+ "no-template-curly-in-string": "warn",
93
+ "no-this-before-super": "warn",
94
+ "no-undef": "error",
95
+ "no-unreachable": "warn",
96
+ "no-unsafe-negation": "warn",
97
+ "no-unused-expressions": ["error", {
98
+ allowShortCircuit: true,
99
+ allowTernary: true,
100
+ allowTaggedTemplates: true
101
+ }],
102
+ "no-unused-labels": "warn",
103
+ "no-unused-vars": "warn",
104
+ "no-use-before-define": ["warn", {
105
+ functions: false,
106
+ classes: false,
107
+ variables: false
108
+ }],
109
+ "no-useless-escape": "warn",
110
+ "no-useless-computed-key": "warn",
111
+ "no-useless-concat": "warn",
112
+ "no-useless-constructor": "warn",
113
+ "no-useless-rename": "warn",
114
+ "no-var": "warn",
115
+ "no-with": "warn",
116
+ "object-shorthand": ["warn", "always"],
117
+ "prefer-arrow-callback": "warn",
118
+ "require-await": "warn",
119
+ "require-yield": "warn",
120
+ "strict": ["warn", "never"],
121
+ "unicode-bom": ["warn", "never"],
122
+ "use-isnan": "warn",
123
+ "valid-typeof": "warn",
124
+ "@stylistic/js/array-bracket-newline": ["warn", "consistent"],
125
+ "@stylistic/js/array-bracket-spacing": "warn",
126
+ "@stylistic/js/array-element-newline": ["warn", "consistent"],
127
+ "@stylistic/js/arrow-parens": "warn",
128
+ "@stylistic/js/arrow-spacing": "warn",
129
+ "@stylistic/js/block-spacing": "warn",
130
+ "@stylistic/js/brace-style": ["warn", "1tbs", {
131
+ allowSingleLine: true
132
+ }],
133
+ "@stylistic/js/comma-dangle": ["warn", "never"],
134
+ "@stylistic/js/comma-spacing": "warn",
135
+ "@stylistic/js/comma-style": "warn",
136
+ "@stylistic/js/computed-property-spacing": "warn",
137
+ "@stylistic/js/dot-location": ["warn", "property"],
138
+ "@stylistic/js/eol-last": ["warn", "never"],
139
+ "@stylistic/js/function-call-spacing": "warn",
140
+ "@stylistic/js/function-call-argument-newline": ["warn", "consistent"],
141
+ "@stylistic/js/function-paren-newline": ["warn", "consistent"],
142
+ "@stylistic/js/implicit-arrow-linebreak": "warn",
143
+ "@stylistic/js/indent": ["warn", "tab", {
144
+ SwitchCase: 1,
145
+ ignoreComments: true
146
+ }],
147
+ "@stylistic/js/key-spacing": "warn",
148
+ "@stylistic/js/keyword-spacing": "warn",
149
+ "@stylistic/js/new-parens": "warn",
150
+ "@stylistic/js/no-confusing-arrow": "warn",
151
+ "@stylistic/js/no-extra-semi": "warn",
152
+ "@stylistic/js/no-floating-decimal": "warn",
153
+ "@stylistic/js/no-mixed-operators": "warn",
154
+ "@stylistic/js/no-multi-spaces": "warn",
155
+ "@stylistic/js/no-multiple-empty-lines": ["warn", {
156
+ max: 2,
157
+ maxBOF: 0,
158
+ maxEOF: 0
159
+ }],
160
+ "@stylistic/js/no-trailing-spaces": "warn",
161
+ "@stylistic/js/no-whitespace-before-property": "warn",
162
+ "@stylistic/js/nonblock-statement-body-position": "warn",
163
+ "@stylistic/js/object-curly-newline": "warn",
164
+ "@stylistic/js/object-curly-spacing": ["warn", "always"],
165
+ "@stylistic/js/operator-linebreak": ["warn", "after", {
166
+ overrides: {
167
+ "?": "ignore",
168
+ ":": "ignore",
169
+ "||": "ignore",
170
+ "&&": "ignore"
171
+ }
172
+ }],
173
+ "@stylistic/js/padding-line-between-statements": ["warn", {
174
+ blankLine: "always",
175
+ prev: "default",
176
+ next: "*"
177
+ }, {
178
+ blankLine: "always",
179
+ prev: "*",
180
+ next: "switch"
181
+ }],
182
+ "@stylistic/js/quote-props": ["warn", "consistent-as-needed"],
183
+ "@stylistic/js/quotes": ["warn", "double"],
184
+ "@stylistic/js/rest-spread-spacing": "warn",
185
+ "@stylistic/js/semi": "warn",
186
+ "@stylistic/js/semi-spacing": "warn",
187
+ "@stylistic/js/semi-style": "warn",
188
+ "@stylistic/js/space-before-blocks": "warn",
189
+ "@stylistic/js/space-before-function-paren": ["warn", {
190
+ anonymous: "always",
191
+ named: "never",
192
+ asyncArrow: "always"
193
+ }],
194
+ "@stylistic/js/space-in-parens": "warn",
195
+ "@stylistic/js/space-infix-ops": "warn",
196
+ "@stylistic/js/space-unary-ops": "warn",
197
+ "@stylistic/js/spaced-comment": "warn",
198
+ "@stylistic/js/template-curly-spacing": "warn"
199
+ }
200
+ }, {
201
+ ignores: [".yarn/"]
202
+ }];
@@ -0,0 +1,30 @@
1
+ import importPlugin from "eslint-plugin-import";
2
+ import sortImportsES6Autofix from "eslint-plugin-sort-imports-es6-autofix";
3
+
4
+
5
+ export default [
6
+ importPlugin.flatConfigs.recommended,
7
+ {
8
+ plugins: {
9
+ "sort-imports-es6-autofix": sortImportsES6Autofix
10
+ },
11
+ rules: {
12
+ "sort-imports-es6-autofix/sort-imports-es6": ["warn", {
13
+ ignoreCase: true,
14
+ memberSyntaxSortOrder: ["all", "multiple", "single", "none"]
15
+ }],
16
+ "import/no-named-as-default-member": "off",
17
+ "import/no-anonymous-default-export": "off",
18
+ "import/newline-after-import": ["warn", { count: 2, considerComments: true }],
19
+ "import/order": ["warn", {
20
+ "newlines-between": "always",
21
+ "groups": [["type", "unknown", "builtin"], "external", ["internal", "parent", "index", "sibling"]],
22
+ "warnOnUnassignedImports": true
23
+ }],
24
+ "import/first": "error",
25
+ "import/no-amd": "error",
26
+ "import/no-webpack-loader-syntax": "error",
27
+ "import/no-unresolved": ["error", { commonjs: true }]
28
+ }
29
+ }
30
+ ];
@@ -0,0 +1,6 @@
1
+ import importConfig from "./import.mjs";
2
+ import jsdocConfig from "./jsdoc.mjs";
3
+ import reactConfig from "./react.mjs";
4
+
5
+
6
+ export default { importConfig, jsdocConfig, reactConfig };
@@ -0,0 +1,91 @@
1
+ import jsdocPlugin from "eslint-plugin-jsdoc";
2
+
3
+
4
+ export default [
5
+ jsdocPlugin.configs["flat/recommended"],
6
+ {
7
+ plugins: {
8
+ jsdoc: jsdocPlugin
9
+ },
10
+ settings: {
11
+ jsdoc: {
12
+ maxLines: 2,
13
+ mode: "typescript",
14
+ preferredTypes: {
15
+ "object<>": false,
16
+ "Object<>": "Record<>",
17
+ "Object": "object",
18
+ ".<>": "<>",
19
+ "*": "any"
20
+ }
21
+ }
22
+ },
23
+ rules: {
24
+ "jsdoc/check-param-names": "warn",
25
+ "jsdoc/check-template-names": "warn",
26
+ "jsdoc/lines-before-block": "warn",
27
+ "jsdoc/require-jsdoc": "off",
28
+ "jsdoc/require-returns": "off",
29
+ "jsdoc/require-template": "warn",
30
+ "jsdoc/check-indentation": ["warn", {
31
+ excludeTags: ["import", "example"]
32
+ }],
33
+ "jsdoc/no-bad-blocks": "warn",
34
+ "jsdoc/tag-lines": ["warn", "never"],
35
+ "jsdoc/no-defaults": "off",
36
+ "jsdoc/require-hyphen-before-param-description": ["warn", "always", {
37
+ tags: {
38
+ property: "always",
39
+ template: "always",
40
+ return: "never"
41
+ }
42
+ }],
43
+ "jsdoc/check-line-alignment": ["warn", "never"],
44
+ "jsdoc/match-name": ["warn", {
45
+ match: [
46
+ {
47
+ allowName: "/^_?([A-Z][a-z]+)+$/",
48
+ message: "The name should be written in PascalCase.",
49
+ tags: ["typedef"]
50
+ },
51
+ {
52
+ allowName: "/^([A-Z][a-z]+)+$/",
53
+ message: "The name should be written in PascalCase.",
54
+ tags: ["callback"]
55
+ },
56
+ {
57
+ allowName: "/^[A-Z]{1}$/",
58
+ message: "The name should be a single capital letter.",
59
+ tags: ["template"]
60
+ }
61
+ ]
62
+ }],
63
+ "jsdoc/match-description": ["warn", {
64
+ contexts: ["any"],
65
+ mainDescription: {
66
+ message: "The main description should be written in the third person, begin with a capital letter and end with a period.",
67
+ match: "/^[A-Z][.^\\w]*s\\b.*\\.$/us"
68
+ },
69
+ matchDescription: "^[A-Z].*[^\\.]$",
70
+ tags: {
71
+ param: {
72
+ message: "@param description should begin with a capital letter and not end with a period.",
73
+ match: true
74
+ },
75
+ property: {
76
+ message: "@property description should begin with a capital letter and not end with a period.",
77
+ match: true
78
+ },
79
+ returns: {
80
+ message: "@returns description should begin with a capital letter and not end with a period.",
81
+ match: true
82
+ },
83
+ template: {
84
+ message: "@template description should begin with a capital letter and not end with a period.",
85
+ match: true
86
+ }
87
+ }
88
+ }]
89
+ }
90
+ }
91
+ ];