Module:No globals
Documentation for this module may be created at Module:No globals/doc
-- <pre> -------------------------------------------------------------------------------- --- No globals prevents nil global variables from being written to or read. -- This module greatly reduces the chance of errors from overriding globals. -- -- To use the module, add the following code below your module table -- definition: -- -- {{#tag:pre|require('Module:No globals')}}
 -- -- The @{require} function sets the `arg` global in the package library when -- loading a module - see the [source code](https://git.io/JfKu8) in Scribunto -- core. To ensure Scribunto can load modules, the `arg` global is whitelisted. -- -- @script getmetatable(_G) -- @alias mt -- @release stable -- @author [[wikipedia:User:Jackmcbarn|Jackmcbarn]] (Wikipedia) -- @author [[User:Dessamator|Dessamator]] -- @attribution [[wikipedia:Module:No globals|Wikipedia]] -- @todo Remove `name` exception in all metamethods. On Fandom, -- legacy Scribunto has a typo in the package library -- where `name` is accessed instead of `modname` - see -- the [source code](https://git.io/JfKzh). This bug was -- fixed in MediaWiki 1.23 -- (see [this commit](https://git.io/JUilh)). local mt = getmetatable(_G) or {} -- begin dev wikia change local siteVersion = mw.site.currentVersion local isNameDisallowed = tonumber(siteVersion:match('^%d%.%d+')) >= 1.23 -- end dev wikia change --- Read access restriction on @{_G} global table. -- @function mt.__index -- @param {table} t Global table - @{_G}. -- @param k Indexed key. -- @error[opt,28] {string} 'tried to read nil global $k' function mt.__index(t, k) -- begin dev wikia change if k ~= 'arg' and (isNameDisallowed or k ~= 'name') then -- end dev wikia change error('Tried to read nil global ' .. tostring(k), 2) end return nil end --- Write access restriction on @{_G} global table. -- @function mt.__newindex -- @param {table} t Global table - @{_G}. -- @param k Indexed key. -- @param v Value to be assigned. -- @error[opt,42] {string} 'tried to write global $k' function mt.__newindex(t, k, v) -- begin dev wikia change if k ~= 'arg' and (isNameDisallowed or k ~= 'name') then -- end dev wikia change error('Tried to write global ' .. tostring(k), 2) end rawset(t, k, v) end setmetatable(_G, mt)