Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

restricted_module_paths

What it does

Checks for restricted module paths in any expression context, preventing usage of specific module paths wherever they appear in code.

Why this is bad

Some module paths may be deprecated, internal-only, or have better alternatives that should be used instead. This lint helps enforce coding standards and prevents usage of restricted APIs.

Configuration

restricted_paths - A map of restricted module paths to their respective error messages.

[config.restricted_module_paths.restricted_paths]
"OldLibrary.Utils.deprecatedFunction" = "OldLibrary.Utils.deprecatedFunction has been deprecated. Use NewLibrary.Utils.modernFunction instead."

Example

local deprecatedFunction = OldLibrary.Utils.deprecatedFunction

OldLibrary.Utils.deprecatedFunction()

fn(OldLibrary.Utils.deprecatedFunction)

local config = { callback = OldLibrary.Utils.deprecatedFunction }

function getHandler()
    return OldLibrary.Utils.deprecatedFunction
end

local nested = { deep = { handler = OldLibrary.Utils.deprecatedFunction } }

local handler = condition and OldLibrary.Utils.deprecatedFunction or nil

local required = require(OldLibrary.Utils.deprecatedFunction)

global = OldLibrary.Utils.deprecatedFunction

Remarks

The lint detects restricted module paths in various expression contexts:

  • Assignments: local deprecatedFunction = OldLibrary.Utils.deprecatedFunction
  • Function calls: OldLibrary.Utils.deprecatedFunction()
  • Function arguments: fn(OldLibrary.Utils.deprecatedFunction)
  • Table constructors: local config = { callback = OldLibrary.Utils.deprecatedFunction }
  • Return statements: return OldLibrary.Utils.deprecatedFunction
  • Nested table structures: local nested = { deep = { handler = OldLibrary.Utils.deprecatedFunction } }
  • Conditional expressions: local handler = condition and OldLibrary.Utils.deprecatedFunction or nil
  • Require statements: local required = require(OldLibrary.Utils.deprecatedFunction)
  • Global assignments: global = OldLibrary.Utils.deprecatedFunction

It does not check:

  • String require statements: require("Module.SubModule")
  • String literals: "Module.SubModule.function"

The lint performs exact string matching on the full module path, so "OldLibrary.Utils.deprecatedFunction" will match exactly but not "OldLibrary.Utils.deprecatedFunctionExtended".