version: "2"
linters:
  default: none
  enable:
    - asciicheck
    - bidichk
    - bodyclose
    - dogsled
    - dupl
    - errcheck
    - errname
    - errorlint
    - exhaustruct
    - forcetypeassert
    - gocognit
    - gocritic
    - godot
    - gomodguard
    - gosec
    - govet
    - importas
    - ineffassign
    - makezero
    - misspell
    - nestif
    - nilnil
    # - noctx
    # - paralleltest
    - revive
    - staticcheck
    # - tparallel
    - unconvert
    - unused
  settings:
    dupl:
      threshold: 412
    godot:
      scope: all
      capital: true
    exhaustruct:
      include:
        - httpmw\.\w+
        - github.com/coder/coder/v2/coderd/database\.[^G][^e][^t]\w+Params
    gocognit:
      min-complexity: 300
    goconst:
      min-len: 4
      min-occurrences: 3
    gocritic:
      enabled-checks:
        - badLock
        - badRegexp
        - boolExprSimplify
        - builtinShadow
        - builtinShadowDecl
        - commentedOutImport
        - deferUnlambda
        - dupImport
        - dynamicFmtString
        - emptyDecl
        - emptyFallthrough
        - emptyStringTest
        - evalOrder
        - externalErrorReassign
        - filepathJoin
        - hexLiteral
        - httpNoBody
        - importShadow
        - indexAlloc
        - initClause
        - methodExprCall
        - nestingReduce
        - nilValReturn
        - preferFilepathJoin
        - rangeAppendAll
        - regexpPattern
        - redundantSprint
        - regexpSimplify
        - ruleguard
        - sliceClear
        - sortSlice
        - sprintfQuotedString
        - sqlQuery
        - stringConcatSimplify
        - stringXbytes
        - todoCommentWithoutDetail
        - tooManyResultsChecker
        - truncateCmp
        - typeAssertChain
        - typeDefFirst
        - unlabelStmt
        - weakCond
        - whyNoLint
      settings:
        ruleguard:
          failOn: all
          rules: ${base-path}/scripts/rules.go
    gosec:
      excludes:
        - G601
    govet:
      disable:
        - loopclosure
    importas:
      no-unaliased: true
    misspell:
      locale: US
      ignore-rules:
        - trialer
    nestif:
      min-complexity: 20
    revive:
      severity: warning
      rules:
        - name: atomic
        - name: bare-return
        - name: blank-imports
        - name: bool-literal-in-expr
        - name: call-to-gc
        - name: confusing-results
        - name: constant-logical-expr
        - name: context-as-argument
        - name: context-keys-type
        # - name: deep-exit
        - name: defer
        - name: dot-imports
        - name: duplicated-imports
        - name: early-return
        - name: empty-block
        - name: empty-lines
        - name: error-naming
        - name: error-return
        - name: error-strings
        - name: errorf
        - name: exported
        - name: flag-parameter
        - name: get-return
        - name: identical-branches
        - name: if-return
        - name: import-shadowing
        - name: increment-decrement
        - name: indent-error-flow
        - name: modifies-value-receiver
        - name: package-comments
        - name: range
        - name: receiver-naming
        - name: redefines-builtin-id
        - name: string-of-int
        - name: struct-tag
        - name: superfluous-else
        - name: time-naming
        - name: unconditional-recursion
        - name: unexported-naming
        - name: unexported-return
        - name: unhandled-error
        - name: unnecessary-stmt
        - name: unreachable-code
        - name: unused-parameter
        - name: unused-receiver
        - name: var-declaration
        - name: var-naming
        - name: waitgroup-by-value
    staticcheck:
      checks:
        - all
        - SA4006 # Detects redundant assignments
        - SA4009 # Detects redundant variable declarations
        - SA1019
  exclusions:
    generated: lax
    presets:
      - comments
      - common-false-positives
      - legacy
      - std-error-handling
    rules:
      - linters:
          - errcheck
          - exhaustruct
          - forcetypeassert
        path: _test\.go
      - linters:
          - exhaustruct
        path: scripts/*
      - linters:
          - ALL
        path: scripts/rules.go
    paths:
      - scripts/rules.go
      - coderd/database/dbmem
      - node_modules
      - .git
      - third_party$
      - builtin$
      - examples$
issues:
  max-issues-per-linter: 0
  max-same-issues: 0
  fix: true
formatters:
  enable:
    - goimports
    - gofmt
  exclusions:
    generated: lax
    paths:
      - scripts/rules.go
      - coderd/database/dbmem
      - node_modules
      - .git
      - third_party$
      - builtin$
      - examples$
