I recently got into using strict Lua and I got this warning
'{ @metatable JovanMeta, Jovan}' could not be converted into '{| Modules: {| [string]: boolean |} |}'
the warning only happens when the module’s __call is fired in strict mode btw
--!strict
local ServerScriptService = game:GetService("ServerScriptService")
local ServerStorage = game:GetService("ServerStorage")
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local Promise = require(ReplicatedStorage.JovanClient.Modules.Promise)
local Modules = script.Modules
local Jovan = {}
local JovanMeta = {}
-- Types
export type table = {
[any] : any
}
-- Modules
Jovan.Modules = {
ss = ServerStorage,
sss = ServerScriptService,
}
-- Load
local services = game:GetChildren()
for i = 1, #services do
if pcall(function()
local t = services[i]
end) then
Jovan.Modules[services[i].ClassName:lower()] = services[i]
end
end
local moduletbl = Modules:GetChildren()
local sharedtbl = ReplicatedStorage.JovanClient.Modules:GetChildren()
for i = 1, #moduletbl do
if not moduletbl[i]:IsA("ModuleScript") then continue end
Jovan.Modules[moduletbl[i].Name:lower()] = require(moduletbl[i])
end
for i = 1, #sharedtbl do
if not sharedtbl[i]:IsA("ModuleScript") then continue end
Jovan.Modules[sharedtbl[i].Name:lower()] = require(sharedtbl[i])
end
-- Functions
local ImportTimeout = 5
-- @promise \
-- Import a Jovan library.
local function ImportPromise(self, Name : string)
local result
Name = Name:lower()
Promise.new(function(resolve, reject)
local now = os.clock()
if self.Modules[Name] then
resolve(self.Modules[Name])
else
repeat task.wait() until self.Modules[Name] or os.clock() - now >= ImportTimeout
if os.clock() - now >= ImportTimeout then
reject()
else resolve(self.Modules[Name]) end
end
end):andThen(function(body) result = body end)
return result
end
JovanMeta.__call = ImportPromise
-- Adds a module to the list of Jovan libraries.
function Jovan:AddModule(Name : string, module : table | ModuleScript)
local import = ((typeof(module) == table) and module) or require(module)
Modules[Name:lower()] = import
end
return setmetatable(Jovan, JovanMeta)