├── .credo.exs ├── .defaults.reek ├── .eslintrc.js ├── .remarkrc ├── .rubocop.yml ├── .scss-lint.yml ├── LICENSE └── README.md /.credo.exs: -------------------------------------------------------------------------------- 1 | %{ 2 | # 3 | # You can have as many configs as you like in the `configs:` field. 4 | configs: [ 5 | %{ 6 | # 7 | # Run any exec using `mix credo -C `. If no exec name is given 8 | # "default" is used. 9 | # 10 | name: "default", 11 | # 12 | # These are the files included in the analysis: 13 | files: %{ 14 | # 15 | # You can give explicit globs or simply directories. 16 | # In the latter case `**/*.{ex,exs}` will be used. 17 | # 18 | included: ["lib/", "src/", "test/", "web/", "apps/"], 19 | excluded: [~r"/_build/", ~r"/deps/", ~r"/node_modules/"] 20 | }, 21 | # 22 | # Load and configure plugins here: 23 | # 24 | plugins: [], 25 | # 26 | # If you create your own checks, you must specify the source files for 27 | # them here, so they can be loaded by Credo before running the analysis. 28 | # 29 | requires: [], 30 | check_for_updates: false, 31 | # 32 | # If you want to enforce a style guide and need a more traditional linting 33 | # experience, you can change `strict` to `true` below: 34 | # 35 | strict: false, 36 | # 37 | # You can customize the parameters of any check by adding a second element 38 | # to the tuple. 39 | # 40 | # To disable a check put `false` as second element: 41 | # 42 | # {Credo.Check.Design.DuplicatedCode, false} 43 | # 44 | checks: [ 45 | # 46 | ## Consistency Checks 47 | # 48 | {Credo.Check.Consistency.ExceptionNames, []}, 49 | {Credo.Check.Consistency.LineEndings, []}, 50 | {Credo.Check.Consistency.MultiAliasImportRequireUse, []}, 51 | {Credo.Check.Consistency.ParameterPatternMatching, []}, 52 | {Credo.Check.Consistency.SpaceAroundOperators, []}, 53 | {Credo.Check.Consistency.SpaceInParentheses, []}, 54 | {Credo.Check.Consistency.TabsOrSpaces, []}, 55 | 56 | # 57 | ## Design Checks 58 | # 59 | # You can customize the priority of any check 60 | # Priority values are: `low, normal, high, higher` 61 | # 62 | {Credo.Check.Design.AliasUsage, false}, 63 | # For some checks, you can also set other parameters 64 | # 65 | # If you don't want the `setup` and `test` macro calls in ExUnit tests 66 | # or the `schema` macro in Ecto schemas to trigger DuplicatedCode, just 67 | # set the `excluded_macros` parameter to `[:schema, :setup, :test]`. 68 | # 69 | {Credo.Check.Design.DuplicatedCode, excluded_macros: []}, 70 | # You can also customize the exit_status of each check. 71 | # If you don't want TODO comments to cause `mix credo` to fail, just 72 | # set this value to 0 (zero). 73 | # 74 | # Disabled for now as they are also checked by Code Climate 75 | {Credo.Check.Design.TagTODO, false}, 76 | {Credo.Check.Design.TagFIXME, false}, 77 | 78 | # 79 | ## Readability Checks 80 | # 81 | {Credo.Check.Readability.AliasOrder, []}, 82 | {Credo.Check.Readability.FunctionNames, []}, 83 | {Credo.Check.Readability.LargeNumbers, []}, 84 | {Credo.Check.Readability.MaxLineLength, false}, 85 | {Credo.Check.Readability.ModuleAttributeNames, []}, 86 | {Credo.Check.Readability.ModuleDoc, []}, 87 | {Credo.Check.Readability.ModuleNames, []}, 88 | {Credo.Check.Readability.ParenthesesInCondition, []}, 89 | {Credo.Check.Readability.ParenthesesOnZeroArityDefs, false}, 90 | {Credo.Check.Readability.PredicateFunctionNames, []}, 91 | {Credo.Check.Readability.PreferImplicitTry, false}, 92 | {Credo.Check.Readability.RedundantBlankLines, []}, 93 | {Credo.Check.Readability.Semicolons, []}, 94 | {Credo.Check.Readability.SinglePipe, []}, 95 | {Credo.Check.Readability.SpaceAfterCommas, []}, 96 | {Credo.Check.Readability.StringSigils, []}, 97 | {Credo.Check.Readability.TrailingBlankLine, []}, 98 | {Credo.Check.Readability.TrailingWhiteSpace, []}, 99 | {Credo.Check.Readability.VariableNames, []}, 100 | 101 | # 102 | ## Refactoring Opportunities 103 | # 104 | {Credo.Check.Refactor.DoubleBooleanNegation, false}, # That's a feature! 105 | {Credo.Check.Refactor.CondStatements, []}, 106 | {Credo.Check.Refactor.CyclomaticComplexity, []}, 107 | {Credo.Check.Refactor.FunctionArity, []}, 108 | {Credo.Check.Refactor.LongQuoteBlocks, []}, 109 | {Credo.Check.Refactor.MapInto, []}, 110 | {Credo.Check.Refactor.MatchInCondition, []}, 111 | {Credo.Check.Refactor.NegatedConditionsInUnless, []}, 112 | {Credo.Check.Refactor.NegatedConditionsWithElse, []}, 113 | {Credo.Check.Refactor.Nesting, []}, 114 | {Credo.Check.Refactor.PipeChainStart, false}, 115 | {Credo.Check.Refactor.UnlessWithElse, []}, 116 | {Credo.Check.Refactor.WithClauses, []}, 117 | 118 | # 119 | ## Warnings 120 | # 121 | {Credo.Check.Warning.BoolOperationOnSameValues, []}, 122 | {Credo.Check.Warning.ExpensiveEmptyEnumCheck, []}, 123 | {Credo.Check.Warning.IExPry, []}, 124 | {Credo.Check.Warning.IoInspect, []}, 125 | {Credo.Check.Warning.LazyLogging, []}, 126 | {Credo.Check.Warning.OperationOnSameValues, []}, 127 | {Credo.Check.Warning.OperationWithConstantResult, []}, 128 | {Credo.Check.Warning.RaiseInsideRescue, []}, 129 | {Credo.Check.Warning.UnusedEnumOperation, []}, 130 | {Credo.Check.Warning.UnusedFileOperation, []}, 131 | {Credo.Check.Warning.UnusedKeywordOperation, []}, 132 | {Credo.Check.Warning.UnusedListOperation, []}, 133 | {Credo.Check.Warning.UnusedPathOperation, []}, 134 | {Credo.Check.Warning.UnusedRegexOperation, []}, 135 | {Credo.Check.Warning.UnusedStringOperation, []}, 136 | {Credo.Check.Warning.UnusedTupleOperation, []}, 137 | 138 | # 139 | # Controversial and experimental checks (opt-in, just remove `, false`) 140 | # 141 | {Credo.Check.Consistency.UnusedVariableNames, false}, 142 | {Credo.Check.Readability.AliasAs, false}, 143 | {Credo.Check.Readability.MultiAlias, false}, 144 | {Credo.Check.Refactor.ABCSize, false}, 145 | {Credo.Check.Refactor.AppendSingleItem, false}, 146 | {Credo.Check.Refactor.VariableRebinding, false}, 147 | {Credo.Check.Warning.MapGetUnsafePass, false}, 148 | {Credo.Check.Readability.Specs, false} 149 | 150 | # 151 | # Custom checks can be created using `mix credo.gen.check`. 152 | # 153 | ] 154 | } 155 | ] 156 | } 157 | -------------------------------------------------------------------------------- /.defaults.reek: -------------------------------------------------------------------------------- 1 | --- 2 | TooManyStatements: 3 | max_statements: 10 4 | UncommunicativeMethodName: 5 | reject: 6 | - !ruby/regexp /^[a-z]$/ 7 | - !ruby/regexp /[0-9]$/ 8 | UncommunicativeParameterName: 9 | reject: 10 | - !ruby/regexp /^.$/ 11 | - !ruby/regexp /[0-9]$/ 12 | - !ruby/regexp /^_/ 13 | UncommunicativeVariableName: 14 | reject: 15 | - !ruby/regexp /^.$/ 16 | - !ruby/regexp /[0-9]$/ 17 | UtilityFunction: 18 | enabled: false 19 | LongParameterList: 20 | enabled: false 21 | DuplicateMethodCall: 22 | max_calls: 2 23 | IrresponsibleModule: 24 | enabled: false 25 | NestedIterators: 26 | max_allowed_nesting: 2 27 | PrimaDonnaMethod: 28 | enabled: false 29 | UnusedParameters: 30 | enabled: false 31 | FeatureEnvy: 32 | enabled: false 33 | ControlParameter: 34 | enabled: false 35 | UnusedPrivateMethod: 36 | enabled: false 37 | InstanceVariableAssumption: 38 | exclude: 39 | - !ruby/regexp /Controller$/ 40 | - !ruby/regexp /Mailer$/ 41 | -------------------------------------------------------------------------------- /.eslintrc.js: -------------------------------------------------------------------------------- 1 | /*eslint-env node*/ 2 | module.exports = { 3 | "parserOptions": { 4 | "ecmaVersion": 6, 5 | "sourceType": "module" 6 | }, 7 | "env": { 8 | "browser": true 9 | }, 10 | 'rules': { 11 | 'camelcase': 2, 12 | 'comma-dangle': [2, 'never'], 13 | 'comma-style': [2, 'last'], 14 | 'eqeqeq': 2, 15 | 'indent': [2, 2, { 'VariableDeclarator': 2 }], 16 | 'no-eq-null': 2, 17 | 'no-extra-parens': 2, 18 | 'no-extra-semi': 2, 19 | 'no-lonely-if': 2, 20 | 'no-multi-spaces': 0, 21 | 'no-nested-ternary': 2, 22 | 'no-param-reassign': 2, 23 | 'no-self-compare': 2, 24 | 'no-shadow': 2, 25 | 'no-throw-literal': 2, 26 | 'no-undef': 2, 27 | 'no-underscore-dangle': 0, 28 | 'no-void': 2, 29 | 'quotes': [2, 'single'], 30 | 'semi': [2, 'always'] 31 | } 32 | }; 33 | -------------------------------------------------------------------------------- /.remarkrc: -------------------------------------------------------------------------------- 1 | { 2 | "plugins": { 3 | "lint": { 4 | "final-newline": true, 5 | "list-item-bullet-indent": true, 6 | "list-item-indent": "tab-size", 7 | "no-auto-link-without-protocol": true, 8 | "no-blockquote-without-caret": true, 9 | "no-literal-urls": true, 10 | "ordered-list-marker-style": ".", 11 | "hard-break-spaces": true, 12 | "no-duplicate-definitions": true, 13 | "no-heading-content-indent": true, 14 | "no-inline-padding": true, 15 | "no-shortcut-reference-image": true, 16 | "no-shortcut-reference-link": true, 17 | "no-undefined-references": true, 18 | "no-unused-definitions": true 19 | } 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /.rubocop.yml: -------------------------------------------------------------------------------- 1 | AllCops: 2 | Exclude: 3 | - 'bin/**/*' 4 | - 'db/**/*' 5 | - 'config/**/*' 6 | - 'script/**/*' 7 | 8 | Rails: 9 | Enabled: true 10 | 11 | Layout/AlignParameters: 12 | EnforcedStyle: with_fixed_indentation 13 | 14 | Layout/CaseIndentation: 15 | EnforcedStyle: end 16 | 17 | Layout/IndentHash: 18 | Enabled: false 19 | 20 | Layout/MultilineMethodCallIndentation: 21 | EnforcedStyle: indented 22 | 23 | Layout/MultilineOperationIndentation: 24 | EnforcedStyle: indented 25 | 26 | Layout/SpaceInsideHashLiteralBraces: 27 | Enabled: false 28 | 29 | Layout/AlignHash: 30 | Enabled: true 31 | EnforcedLastArgumentHashStyle: always_ignore 32 | 33 | Layout/EndAlignment: 34 | EnforcedStyleAlignWith: variable 35 | 36 | Style/AsciiComments: 37 | Enabled: false 38 | 39 | Style/CollectionMethods: 40 | Enabled: true 41 | PreferredMethods: 42 | inject: 'inject' 43 | 44 | Style/Documentation: 45 | Enabled: false 46 | 47 | Style/BlockDelimiters: 48 | Exclude: 49 | - spec/**/*_spec.rb 50 | 51 | Style/BracesAroundHashParameters: 52 | Exclude: 53 | - spec/**/*_spec.rb 54 | 55 | Style/GuardClause: 56 | Enabled: false 57 | 58 | Style/IfUnlessModifier: 59 | Enabled: false 60 | 61 | Style/Lambda: 62 | Enabled: false 63 | 64 | Style/RaiseArgs: 65 | Enabled: false 66 | 67 | Style/SignalException: 68 | Enabled: false 69 | 70 | Metrics/AbcSize: 71 | Max: 20 72 | 73 | Metrics/ClassLength: 74 | Max: 100 75 | 76 | Metrics/ModuleLength: 77 | Max: 100 78 | 79 | Metrics/LineLength: 80 | Enabled: false 81 | 82 | Metrics/MethodLength: 83 | Max: 15 84 | 85 | Style/SingleLineBlockParams: 86 | Enabled: false 87 | 88 | Style/FormatString: 89 | Enabled: false 90 | 91 | Style/WordArray: 92 | Enabled: false 93 | 94 | Style/RedundantSelf: 95 | Enabled: false 96 | 97 | Style/TrivialAccessors: 98 | AllowPredicates: true 99 | -------------------------------------------------------------------------------- /.scss-lint.yml: -------------------------------------------------------------------------------- 1 | # This is the lint file for .scss files. It uses https://github.com/causes/scss-lint 2 | # to search through .scss files and point out errors. 3 | # You can view these errors in your editor. 4 | # 5 | # Here's a link to all the default configurations 6 | # https://github.com/causes/scss-lint/blob/master/config/default.yml 7 | # below is our settings. 8 | 9 | linters: 10 | BangFormat: 11 | enabled: true 12 | space_before_bang: true 13 | space_after_bang: false 14 | 15 | BorderZero: 16 | enabled: true 17 | convention: zero # or `none` 18 | 19 | ColorKeyword: 20 | enabled: true 21 | 22 | ColorVariable: 23 | enabled: false 24 | 25 | Comment: 26 | enabled: true 27 | 28 | DebugStatement: 29 | enabled: true 30 | 31 | DeclarationOrder: 32 | enabled: true 33 | 34 | DuplicateProperty: 35 | enabled: true 36 | 37 | ElsePlacement: 38 | enabled: true 39 | style: same_line # or 'new_line' 40 | 41 | EmptyLineBetweenBlocks: 42 | enabled: true 43 | ignore_single_line_blocks: true 44 | 45 | EmptyRule: 46 | enabled: true 47 | 48 | FinalNewline: 49 | enabled: true 50 | present: true 51 | 52 | HexLength: 53 | enabled: true 54 | style: short # or 'long' 55 | 56 | HexNotation: 57 | enabled: true 58 | style: lowercase # or 'uppercase' 59 | 60 | HexValidation: 61 | enabled: true 62 | 63 | IdSelector: 64 | enabled: true 65 | 66 | ImportantRule: 67 | enabled: true 68 | 69 | ImportPath: 70 | enabled: true 71 | leading_underscore: false 72 | filename_extension: false 73 | 74 | Indentation: 75 | enabled: true 76 | allow_non_nested_indentation: false 77 | character: space # or 'tab' 78 | width: 2 79 | 80 | LeadingZero: 81 | enabled: true 82 | style: exclude_zero 83 | 84 | MergeableSelector: 85 | enabled: true 86 | force_nesting: false 87 | 88 | NameFormat: 89 | enabled: true 90 | convention: hyphenated_lowercase # or 'BEM', or a regex pattern 91 | 92 | NestingDepth: 93 | enabled: false 94 | max_depth: 3 95 | 96 | PlaceholderInExtend: 97 | enabled: false 98 | 99 | PropertySortOrder: 100 | enabled: true 101 | ignore_unspecified: true 102 | severity: warning 103 | order: 104 | - content # content gets precedence to help identify pseudo selectors. 105 | - position 106 | - top 107 | - right 108 | - bottom 109 | - left 110 | - z-index 111 | - display 112 | - float 113 | - width 114 | - min-width 115 | - max-width 116 | - height 117 | - min-height 118 | - max-height 119 | - box-sizing 120 | - padding 121 | - padding-top 122 | - padding-right 123 | - padding-bottom 124 | - padding-left 125 | - margin 126 | - margin-top 127 | - margin-right 128 | - margin-bottom 129 | - margin-left 130 | - overflow 131 | - overflow-x 132 | - overflow-y 133 | - clip 134 | - clear 135 | - font 136 | - font-family 137 | - font-size 138 | - font-style 139 | - font-weight 140 | - font-variant 141 | - font-size-adjust 142 | - font-stretch 143 | - font-effect 144 | - font-emphasize 145 | - font-emphasize-position 146 | - font-emphasize-style 147 | - font-smooth 148 | - hyphens 149 | - line-height 150 | - color 151 | - text-align 152 | - text-align-last 153 | - text-emphasis 154 | - text-emphasis-color 155 | - text-emphasis-style 156 | - text-emphasis-position 157 | - text-decoration 158 | - text-indent 159 | - text-justify 160 | - text-outline 161 | - text-overflow 162 | - text-overflow-ellipsis 163 | - text-overflow-mode 164 | - text-shadow 165 | - text-transform 166 | - text-wrap 167 | - letter-spacing 168 | - word-break 169 | - word-spacing 170 | - word-wrap 171 | - tab-size 172 | - white-space 173 | - vertical-align 174 | - list-style 175 | - list-style-position 176 | - list-style-type 177 | - list-style-image 178 | - pointer-events 179 | - fill 180 | - fill-opacity 181 | - stroke 182 | - stroke-opacity 183 | - stroke-width 184 | - shape-rendering 185 | - cursor 186 | - visibility 187 | - zoom 188 | - flex-direction 189 | - flex-order 190 | - flex-pack 191 | - flex-align 192 | - flex-grow 193 | - table-layout 194 | - empty-cells 195 | - caption-side 196 | - border-spacing 197 | - border-collapse 198 | - quotes 199 | - counter-reset 200 | - counter-increment 201 | - resize 202 | - user-select 203 | - nav-index 204 | - nav-up 205 | - nav-right 206 | - nav-down 207 | - nav-left 208 | - background 209 | - background-color 210 | - background-image 211 | - filter 212 | - background-repeat 213 | - background-attachment 214 | - background-position 215 | - background-position-x 216 | - background-position-y 217 | - background-clip 218 | - background-origin 219 | - background-size 220 | - border 221 | - border-color 222 | - border-style 223 | - border-width 224 | - border-top 225 | - border-top-color 226 | - border-top-style 227 | - border-top-width 228 | - border-right 229 | - border-right-color 230 | - border-right-style 231 | - border-right-width 232 | - border-bottom 233 | - border-bottom-color 234 | - border-bottom-style 235 | - border-bottom-width 236 | - border-left 237 | - border-left-color 238 | - border-left-style 239 | - border-left-width 240 | - border-radius 241 | - border-top-left-radius 242 | - border-top-right-radius 243 | - border-bottom-right-radius 244 | - border-bottom-left-radius 245 | - border-image 246 | - border-image-source 247 | - border-image-slice 248 | - border-image-width 249 | - border-image-outset 250 | - border-image-repeat 251 | - outline 252 | - outline-width 253 | - outline-style 254 | - outline-color 255 | - outline-offset 256 | - box-shadow 257 | - opacity 258 | - transition 259 | - transition-delay 260 | - transition-timing-function 261 | - transition-duration 262 | - transition-property 263 | - transform 264 | - transform-origin 265 | - animation 266 | - animation-name 267 | - animation-duration 268 | - animation-fill-mode 269 | - animation-play-state 270 | - animation-timing-function 271 | - animation-delay 272 | - animation-iteration-count 273 | - animation-direction 274 | 275 | PropertySpelling: 276 | enabled: true 277 | extra_properties: [] 278 | 279 | QualifyingElement: 280 | enabled: false 281 | 282 | SelectorDepth: 283 | enabled: true 284 | max_depth: 4 285 | 286 | SelectorFormat: 287 | enabled: false 288 | convention: hyphenated_lowercase # or 'BEM', or 'hyphenated_BEM', or 'snake_case', or 'camel_case', or a regex pattern 289 | 290 | Shorthand: 291 | enabled: true 292 | 293 | SingleLinePerProperty: 294 | enabled: true 295 | allow_single_line_rule_sets: true 296 | 297 | SingleLinePerSelector: 298 | enabled: true 299 | 300 | SpaceAfterComma: 301 | enabled: true 302 | 303 | SpaceAfterPropertyColon: 304 | enabled: true 305 | style: one_space # or 'no_space', or 'at_least_one_space', or 'aligned' 306 | 307 | SpaceAfterPropertyName: 308 | enabled: true 309 | 310 | SpaceBeforeBrace: 311 | enabled: true 312 | style: space # or 'new_line' 313 | allow_single_line_padding: true 314 | 315 | SpaceBetweenParens: 316 | enabled: true 317 | spaces: 0 318 | 319 | StringQuotes: 320 | enabled: true 321 | style: single_quotes 322 | 323 | TrailingSemicolon: 324 | enabled: true 325 | 326 | TrailingZero: 327 | enabled: false 328 | 329 | UnnecessaryMantissa: 330 | enabled: true 331 | 332 | UnnecessaryParentReference: 333 | enabled: true 334 | 335 | UrlFormat: 336 | enabled: true 337 | 338 | UrlQuotes: 339 | enabled: true 340 | 341 | VariableForProperty: 342 | enabled: false 343 | properties: [] 344 | 345 | VendorPrefix: 346 | enabled: true 347 | identifier_list: base 348 | additional_identifiers: [] 349 | excluded_identifiers: [] 350 | 351 | ZeroUnit: 352 | enabled: true 353 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Copyright (c) 2020 SourceLevel 2 | 3 | Licensed under the Apache License, Version 2.0 (the "License"); 4 | you may not use this file except in compliance with the License. 5 | You may obtain a copy of the License at 6 | 7 | http://www.apache.org/licenses/LICENSE-2.0 8 | 9 | Unless required by applicable law or agreed to in writing, software 10 | distributed under the License is distributed on an "AS IS" BASIS, 11 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | See the License for the specific language governing permissions and 13 | limitations under the License. 14 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # SourceLevel - Linters 2 | 3 | ## Code Quality & Analytics for Engineering Teams 4 | 5 | Increase visibility, collaborativity, and efficiency in your teams with 6 | [SourceLevel](https://sourcelevel.io). 7 | 8 | SourceLevel runs more than 9 | [30 different engines and supports lots of programming languages](https://docs.sourcelevel.io/engines). 10 | It can comment straight into Pull Requests the found issues, so your team can easily spot and fix them. 11 | In adittion, we show charts showing your code health, so you can follow its improvement over time. 12 | 13 | ## About this Styleguide 14 | 15 | This is the default Styleguide repository for SourceLevel! 16 | 17 | Styleguide repositories are a way to share engine configuration files across multiple repositories 18 | without replicating these files on each codebase, you can learn more information in 19 | [our docs](https://docs.sourcelevel.io/guides/repos/using-a-styleguide/) 20 | 21 | If you're looking for `latest` configs for [channel configuration](https://docs.sourcelevel.io/configuration/#channels) 22 | you can check [`latest` branch](https://github.com/sourcelevel/linters/tree/latest). 23 | 24 | Here you can find a curated styleguide for a collection of configuration files we 25 | use for source code linters and static analysis tools: 26 | 27 | | Programming Language | Linter | Config file | 28 | |----------------------|------------------------------------------------------------|----------------------------------| 29 | | Elixir | [Credo](https://docs.sourcelevel.io/engines/credo) | [.credo.exs](.credo.exs) | 30 | | JavaScript | [ESLint](https://docs.sourcelevel.io/engines/eslint) | [.eslintrc.js](.eslintrc.js) | 31 | | Markdown | [Remark](https://docs.sourcelevel.io/engines/remark-lint) | [.remarkrc](.remarkrc) | 32 | | Ruby | [Reek](https://docs.sourcelevel.io/engines/reek) | [.defaults.reek](.defaults.reek) | 33 | | Ruby | [Rubocop](https://docs.sourcelevel.io/engines/rubocop) | [.rubocop.yml](.rubocop.yml) | 34 | | SCSS | [SCSS Lint](https://docs.sourcelevel.io/engines/scss-lint) | [.scss-lint.yml](.scss-lint.yml) | 35 | --------------------------------------------------------------------------------