-- Compiled with roblox-ts v2.1.1 -- Types --[[ * * @param {*} target * @param {PropertyKey} propertyKey * @returns {string} ]] local getKeyId = function(target, propertyKey) return if propertyKey == nil then tostring(target) else tostring(target) .. ("." .. tostring(propertyKey)) end --[[ * * Gets all the keys in the map as an Array. * * @param {ReadonlyMap} map - The map to get the keys from * @returns {Array} ]] local getMapKeys = function(map) -- ▼ ReadonlyMap.size ▼ local _size = 0 for _ in map do _size += 1 end -- ▲ ReadonlyMap.size ▲ local result = table.create(_size) local _map = map local _arg0 = function(_, key) local _key = key table.insert(result, _key) end for _k, _v in _map do _arg0(_v, _k, _map) end return result end --[[ * * Represents a Reflector class that provides * reflection capabiltiies. * * @class Reflector * @classdesc The Reflector class allows introspetion and dynamic manipulation of objects and classes. ]] local Reflector do Reflector = setmetatable({}, { __tostring = function() return "Reflector" end, }) Reflector.__index = Reflector function Reflector.new(...) local self = setmetatable({}, Reflector) return self:constructor(...) or self end function Reflector:constructor() end function Reflector:defineMetadata(targetOrMetadataKey, metadataKeyOrValue, metadataValue, propertyKey) -- Decide which way to define metadata based on overloads. local _condition = metadataValue == nil and propertyKey == nil if _condition then local _targetOrMetadataKey = targetOrMetadataKey _condition = type(_targetOrMetadataKey) == "string" end if _condition then -- It's declared the declarative way local metadataKey = targetOrMetadataKey local metadataValue = metadataKeyOrValue -- Create a @decorator return function(target, propertyKey, _descriptor) local metadataStore = Reflector:createOrGetMetadataStore(target) local keyId = getKeyId(target, propertyKey) local hasMetadata = Reflector:hasMetadata(target, metadataKey, propertyKey) if not hasMetadata then metadataStore[keyId] = {} end metadataStore[keyId][metadataKey] = metadataValue end end -- Declared in the imperative ways local target = targetOrMetadataKey local metadataKey = metadataKeyOrValue local metadataStore = Reflector:createOrGetMetadataStore(target) local keyId = getKeyId(target, propertyKey) local hasMetadata = Reflector:hasMetadata(target, metadataKey, propertyKey) if not hasMetadata then metadataStore[keyId] = {} end local _exp = metadataStore[keyId] local _metadataValue = metadataValue _exp[metadataKey] = _metadataValue end function Reflector:getMetadataKeys(target, propertyKey) local metadataStore = Reflector:getMetadataStore(target) if metadataStore == nil then return nil end local keyId = getKeyId(target, propertyKey) local metadata = metadataStore[keyId] if not metadata then return nil end return getMapKeys(metadata) end function Reflector:hasMetadata(target, metadataKey, propertyKey) local metadataStore = Reflector:getMetadataStore(target) if metadataStore == nil then return false end local keyId = getKeyId(target, propertyKey) if not (metadataStore[keyId] ~= nil) then return false end local _exp = metadataStore[keyId] local _metadataKey = metadataKey if _exp[_metadataKey] == nil then return false end return true end function Reflector:getMetadata(target, metadataKey, propertyKey) local metadataStore = Reflector:getMetadataStore(target) if metadataStore == nil then return nil end local keyId = getKeyId(target, propertyKey) if metadataStore[keyId] ~= nil then local _exp = metadataStore[keyId] local _metadataKey = metadataKey return _exp[_metadataKey] end return nil end function Reflector:getMetadataStore(target) if target == nil then return nil end if target and target.__metadataStore == nil then return nil end return target.__metadataStore end function Reflector:createOrGetMetadataStore(target) if target and target.__metadataStore == nil then target.__metadataStore = {} end return target.__metadataStore end end return { default = Reflector, }