roblox-opencode 1.0.0 → 1.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +112 -122
- package/commands/setup-game.md +108 -108
- package/commands/sync-check.md +53 -53
- package/core/roblox-core.md +93 -93
- package/dist/server.js +189 -167
- package/package.json +35 -35
- package/skills/roblox-analytics/SKILL.md +277 -277
- package/skills/roblox-analytics/references/event-batcher.luau +75 -75
- package/skills/roblox-animation-vfx/SKILL.md +1325 -1325
- package/skills/roblox-architecture/SKILL.md +863 -863
- package/skills/roblox-architecture/references/combat-systems.md +1381 -1381
- package/skills/roblox-code-review/SKILL.md +686 -686
- package/skills/roblox-data/SKILL.md +889 -889
- package/skills/roblox-data/references/inventory-systems.md +1729 -1729
- package/skills/roblox-debug/SKILL.md +98 -98
- package/skills/roblox-gui/SKILL.md +1103 -1103
- package/skills/roblox-gui-fusion/SKILL.md +150 -150
- package/skills/roblox-gui-fusion/references/inventory.luau +427 -427
- package/skills/roblox-gui-fusion/references/settings-menu.luau +579 -579
- package/skills/roblox-gui-fusion/references/shop.luau +411 -411
- package/skills/roblox-luau-mastery/SKILL.md +1519 -1519
- package/skills/roblox-monetization/SKILL.md +1084 -1084
- package/skills/roblox-monetization/references/process-receipt.luau +131 -131
- package/skills/roblox-networking/SKILL.md +669 -669
- package/skills/roblox-networking/references/remote-validator.luau +193 -193
- package/skills/roblox-publish-checklist/SKILL.md +127 -127
- package/skills/roblox-runtime/SKILL.md +753 -753
- package/skills/roblox-sharp-edges/SKILL.md +294 -294
- package/skills/roblox-sync/SKILL.md +126 -126
- package/skills/roblox-testing/SKILL.md +943 -943
- package/skills/roblox-tooling/SKILL.md +149 -149
- package/vendor/LICENSES/ProfileStore-LICENSE +201 -201
- package/vendor/LICENSES/RbxUtil-LICENSE +7 -7
- package/vendor/LICENSES/promise-LICENSE +20 -20
- package/vendor/LICENSES/t-LICENSE +21 -21
- package/vendor/LICENSES/testez-LICENSE +200 -200
- package/vendor/README.md +83 -83
- package/vendor/fusion/Animation/ExternalTime.luau +83 -83
- package/vendor/fusion/Animation/Spring.luau +321 -321
- package/vendor/fusion/Animation/Stopwatch.luau +127 -127
- package/vendor/fusion/Animation/Tween.luau +187 -187
- package/vendor/fusion/Animation/getTweenDuration.luau +27 -27
- package/vendor/fusion/Animation/getTweenRatio.luau +47 -47
- package/vendor/fusion/Animation/lerpType.luau +163 -163
- package/vendor/fusion/Animation/packType.luau +99 -99
- package/vendor/fusion/Animation/springCoefficients.luau +80 -80
- package/vendor/fusion/Animation/unpackType.luau +102 -102
- package/vendor/fusion/Colour/Oklab.luau +70 -70
- package/vendor/fusion/Colour/sRGB.luau +54 -54
- package/vendor/fusion/External.luau +167 -167
- package/vendor/fusion/ExternalDebug.luau +69 -69
- package/vendor/fusion/Graph/Observer.luau +113 -113
- package/vendor/fusion/Graph/castToGraph.luau +28 -28
- package/vendor/fusion/Graph/change.luau +80 -80
- package/vendor/fusion/Graph/depend.luau +32 -32
- package/vendor/fusion/Graph/evaluate.luau +55 -55
- package/vendor/fusion/Instances/Attribute.luau +57 -57
- package/vendor/fusion/Instances/AttributeChange.luau +46 -46
- package/vendor/fusion/Instances/AttributeOut.luau +63 -63
- package/vendor/fusion/Instances/Child.luau +21 -21
- package/vendor/fusion/Instances/Children.luau +147 -147
- package/vendor/fusion/Instances/Hydrate.luau +32 -32
- package/vendor/fusion/Instances/New.luau +52 -52
- package/vendor/fusion/Instances/OnChange.luau +49 -49
- package/vendor/fusion/Instances/OnEvent.luau +53 -53
- package/vendor/fusion/Instances/Out.luau +69 -69
- package/vendor/fusion/Instances/applyInstanceProps.luau +148 -148
- package/vendor/fusion/Instances/defaultProps.luau +194 -194
- package/vendor/fusion/LICENSE +21 -21
- package/vendor/fusion/Logging/formatError.luau +48 -48
- package/vendor/fusion/Logging/messages.luau +51 -51
- package/vendor/fusion/Logging/parseError.luau +24 -24
- package/vendor/fusion/Memory/checkLifetime.luau +133 -133
- package/vendor/fusion/Memory/deriveScope.luau +23 -23
- package/vendor/fusion/Memory/deriveScopeImpl.luau +44 -44
- package/vendor/fusion/Memory/doCleanup.luau +78 -78
- package/vendor/fusion/Memory/innerScope.luau +33 -33
- package/vendor/fusion/Memory/legacyCleanup.luau +17 -17
- package/vendor/fusion/Memory/needsDestruction.luau +16 -16
- package/vendor/fusion/Memory/poisonScope.luau +33 -33
- package/vendor/fusion/Memory/scopePool.luau +54 -54
- package/vendor/fusion/Memory/scoped.luau +26 -26
- package/vendor/fusion/Memory/whichLivesLonger.luau +74 -74
- package/vendor/fusion/RobloxExternal.luau +97 -97
- package/vendor/fusion/State/Computed.luau +138 -138
- package/vendor/fusion/State/For/Disassembly.luau +210 -210
- package/vendor/fusion/State/For/ForTypes.luau +30 -30
- package/vendor/fusion/State/For/init.luau +109 -109
- package/vendor/fusion/State/ForKeys.luau +93 -93
- package/vendor/fusion/State/ForPairs.luau +96 -96
- package/vendor/fusion/State/ForValues.luau +93 -93
- package/vendor/fusion/State/Value.luau +87 -87
- package/vendor/fusion/State/castToState.luau +25 -25
- package/vendor/fusion/State/peek.luau +30 -30
- package/vendor/fusion/Types.luau +314 -314
- package/vendor/fusion/Utility/Contextual.luau +90 -90
- package/vendor/fusion/Utility/Safe.luau +22 -22
- package/vendor/fusion/Utility/isSimilar.luau +29 -29
- package/vendor/fusion/Utility/merge.luau +35 -35
- package/vendor/fusion/Utility/nameOf.luau +34 -34
- package/vendor/fusion/Utility/never.luau +13 -13
- package/vendor/fusion/Utility/nicknames.luau +10 -10
- package/vendor/fusion/Utility/xtypeof.luau +26 -26
- package/vendor/fusion/init.luau +82 -82
- package/vendor/profilestore/init.luau +2242 -2242
- package/vendor/promise/init.luau +1982 -1982
- package/vendor/rbxutil/buffer-util/Buffer.test.luau +25 -25
- package/vendor/rbxutil/buffer-util/BufferReader.luau +228 -228
- package/vendor/rbxutil/buffer-util/BufferWriter.luau +269 -269
- package/vendor/rbxutil/buffer-util/DataTypeBuffer.luau +223 -223
- package/vendor/rbxutil/buffer-util/Types.luau +60 -60
- package/vendor/rbxutil/buffer-util/index.d.ts +153 -153
- package/vendor/rbxutil/buffer-util/init.luau +41 -41
- package/vendor/rbxutil/buffer-util/package.json +16 -16
- package/vendor/rbxutil/buffer-util/wally.toml +9 -9
- package/vendor/rbxutil/comm/Client/ClientComm.luau +232 -232
- package/vendor/rbxutil/comm/Client/ClientRemoteProperty.luau +156 -156
- package/vendor/rbxutil/comm/Client/ClientRemoteSignal.luau +109 -109
- package/vendor/rbxutil/comm/Client/init.luau +135 -135
- package/vendor/rbxutil/comm/Server/RemoteProperty.luau +295 -295
- package/vendor/rbxutil/comm/Server/RemoteSignal.luau +211 -211
- package/vendor/rbxutil/comm/Server/ServerComm.luau +211 -211
- package/vendor/rbxutil/comm/Server/init.luau +140 -140
- package/vendor/rbxutil/comm/Types.luau +18 -18
- package/vendor/rbxutil/comm/Util.luau +27 -27
- package/vendor/rbxutil/comm/init.luau +35 -35
- package/vendor/rbxutil/comm/wally.toml +13 -13
- package/vendor/rbxutil/component/init.luau +759 -759
- package/vendor/rbxutil/component/init.test.luau +311 -311
- package/vendor/rbxutil/component/wally.toml +14 -14
- package/vendor/rbxutil/concur/init.luau +542 -542
- package/vendor/rbxutil/concur/init.test.luau +364 -364
- package/vendor/rbxutil/concur/wally.toml +8 -8
- package/vendor/rbxutil/enum-list/init.luau +101 -101
- package/vendor/rbxutil/enum-list/init.test.luau +91 -91
- package/vendor/rbxutil/enum-list/wally.toml +8 -8
- package/vendor/rbxutil/find/index.d.ts +20 -20
- package/vendor/rbxutil/find/init.luau +44 -44
- package/vendor/rbxutil/find/package.json +17 -17
- package/vendor/rbxutil/find/wally.toml +8 -8
- package/vendor/rbxutil/input/Gamepad.luau +559 -559
- package/vendor/rbxutil/input/Keyboard.luau +124 -124
- package/vendor/rbxutil/input/Mouse.luau +278 -278
- package/vendor/rbxutil/input/PreferredInput.luau +91 -91
- package/vendor/rbxutil/input/Touch.luau +120 -120
- package/vendor/rbxutil/input/init.luau +33 -33
- package/vendor/rbxutil/input/wally.toml +12 -12
- package/vendor/rbxutil/loader/index.d.ts +15 -15
- package/vendor/rbxutil/loader/init.luau +137 -137
- package/vendor/rbxutil/loader/wally.toml +8 -8
- package/vendor/rbxutil/log/index.d.ts +38 -38
- package/vendor/rbxutil/log/init.luau +746 -746
- package/vendor/rbxutil/log/wally.toml +8 -8
- package/vendor/rbxutil/net/init.luau +190 -190
- package/vendor/rbxutil/net/wally.toml +8 -8
- package/vendor/rbxutil/option/index.d.ts +44 -44
- package/vendor/rbxutil/option/init.luau +489 -489
- package/vendor/rbxutil/option/init.test.luau +342 -342
- package/vendor/rbxutil/option/wally.toml +8 -8
- package/vendor/rbxutil/pid/index.d.ts +53 -53
- package/vendor/rbxutil/pid/init.luau +195 -195
- package/vendor/rbxutil/pid/package.json +16 -16
- package/vendor/rbxutil/pid/wally.toml +9 -9
- package/vendor/rbxutil/quaternion/index.d.ts +117 -117
- package/vendor/rbxutil/quaternion/init.luau +570 -570
- package/vendor/rbxutil/quaternion/package.json +16 -16
- package/vendor/rbxutil/quaternion/wally.toml +9 -9
- package/vendor/rbxutil/query/index.d.ts +43 -43
- package/vendor/rbxutil/query/init.luau +117 -117
- package/vendor/rbxutil/query/package.json +18 -18
- package/vendor/rbxutil/query/wally.toml +9 -9
- package/vendor/rbxutil/sequent/index.d.ts +28 -28
- package/vendor/rbxutil/sequent/init.luau +340 -340
- package/vendor/rbxutil/sequent/package.json +16 -16
- package/vendor/rbxutil/sequent/wally.toml +9 -9
- package/vendor/rbxutil/ser/init.luau +175 -175
- package/vendor/rbxutil/ser/init.test.luau +50 -50
- package/vendor/rbxutil/ser/wally.toml +11 -11
- package/vendor/rbxutil/shake/index.d.ts +36 -36
- package/vendor/rbxutil/shake/init.luau +532 -532
- package/vendor/rbxutil/shake/init.test.luau +267 -267
- package/vendor/rbxutil/shake/package.json +16 -16
- package/vendor/rbxutil/shake/wally.toml +9 -9
- package/vendor/rbxutil/signal/index.d.ts +100 -100
- package/vendor/rbxutil/signal/init.luau +432 -432
- package/vendor/rbxutil/signal/init.test.luau +190 -190
- package/vendor/rbxutil/signal/package.json +17 -17
- package/vendor/rbxutil/signal/wally.toml +9 -9
- package/vendor/rbxutil/silo/TableWatcher.luau +65 -65
- package/vendor/rbxutil/silo/Util.luau +55 -55
- package/vendor/rbxutil/silo/init.luau +338 -338
- package/vendor/rbxutil/silo/init.test.luau +215 -215
- package/vendor/rbxutil/silo/wally.toml +8 -8
- package/vendor/rbxutil/spring/index.d.ts +40 -40
- package/vendor/rbxutil/spring/init.luau +97 -97
- package/vendor/rbxutil/spring/package.json +17 -17
- package/vendor/rbxutil/spring/wally.toml +8 -8
- package/vendor/rbxutil/stream/index.d.ts +88 -88
- package/vendor/rbxutil/stream/init.luau +597 -597
- package/vendor/rbxutil/stream/package.json +18 -18
- package/vendor/rbxutil/stream/wally.toml +9 -9
- package/vendor/rbxutil/streamable/Streamable.luau +202 -202
- package/vendor/rbxutil/streamable/StreamableUtil.luau +80 -80
- package/vendor/rbxutil/streamable/init.luau +8 -8
- package/vendor/rbxutil/streamable/wally.toml +12 -12
- package/vendor/rbxutil/symbol/init.luau +56 -56
- package/vendor/rbxutil/symbol/init.test.luau +37 -37
- package/vendor/rbxutil/symbol/wally.toml +8 -8
- package/vendor/rbxutil/table-util/init.luau +938 -938
- package/vendor/rbxutil/table-util/init.test.luau +439 -439
- package/vendor/rbxutil/task-queue/index.d.ts +27 -27
- package/vendor/rbxutil/task-queue/init.luau +97 -97
- package/vendor/rbxutil/task-queue/wally.toml +8 -8
- package/vendor/rbxutil/timer/index.d.ts +81 -81
- package/vendor/rbxutil/timer/init.luau +249 -249
- package/vendor/rbxutil/timer/init.test.luau +73 -73
- package/vendor/rbxutil/timer/wally.toml +11 -11
- package/vendor/rbxutil/tree/index.d.ts +15 -15
- package/vendor/rbxutil/tree/init.luau +137 -137
- package/vendor/rbxutil/tree/wally.toml +8 -8
- package/vendor/rbxutil/trove/index.d.ts +46 -46
- package/vendor/rbxutil/trove/init.luau +787 -787
- package/vendor/rbxutil/trove/init.test.luau +203 -203
- package/vendor/rbxutil/trove/wally.toml +8 -8
- package/vendor/rbxutil/typed-remote/init.luau +196 -196
- package/vendor/rbxutil/typed-remote/wally.toml +8 -8
- package/vendor/rbxutil/wait-for/index.d.ts +17 -17
- package/vendor/rbxutil/wait-for/init.luau +257 -257
- package/vendor/rbxutil/wait-for/init.test.luau +182 -182
- package/vendor/rbxutil/wait-for/wally.toml +11 -11
- package/vendor/t/t.lua +1350 -1350
- package/vendor/testez/Context.lua +26 -26
- package/vendor/testez/Expectation.lua +311 -311
- package/vendor/testez/ExpectationContext.lua +38 -38
- package/vendor/testez/LifecycleHooks.lua +89 -89
- package/vendor/testez/Reporters/TeamCityReporter.lua +101 -101
- package/vendor/testez/Reporters/TextReporter.lua +105 -105
- package/vendor/testez/Reporters/TextReporterQuiet.lua +96 -96
- package/vendor/testez/TestBootstrap.lua +146 -146
- package/vendor/testez/TestEnum.lua +27 -27
- package/vendor/testez/TestPlan.lua +304 -304
- package/vendor/testez/TestPlanner.lua +39 -39
- package/vendor/testez/TestResults.lua +111 -111
- package/vendor/testez/TestRunner.lua +188 -188
- package/vendor/testez/TestSession.lua +243 -243
- package/vendor/testez/init.lua +39 -39
|
@@ -1,137 +1,137 @@
|
|
|
1
|
-
--[=[
|
|
2
|
-
@class Loader
|
|
3
|
-
|
|
4
|
-
The Loader module will require all children or descendant ModuleScripts. There are also
|
|
5
|
-
some utility functions included, which assist with loading and starting modules in
|
|
6
|
-
single-script environments.
|
|
7
|
-
|
|
8
|
-
For example, here is a loader that loads all ModuleScripts under a folder that end with
|
|
9
|
-
the name Service, and then calls all of their OnStart methods:
|
|
10
|
-
```lua
|
|
11
|
-
local MyModules = ReplicatedStorage.MyModules
|
|
12
|
-
Loader.SpawnAll(
|
|
13
|
-
Loader.LoadDescendants(MyModules, Loader.MatchesName("Service$")),
|
|
14
|
-
"OnStart"
|
|
15
|
-
)
|
|
16
|
-
```
|
|
17
|
-
]=]
|
|
18
|
-
local Loader = {}
|
|
19
|
-
|
|
20
|
-
--[=[
|
|
21
|
-
@within Loader
|
|
22
|
-
@type PredicateFn (module: ModuleScript) -> boolean
|
|
23
|
-
Predicate function type.
|
|
24
|
-
]=]
|
|
25
|
-
type PredicateFn = (module: ModuleScript) -> boolean
|
|
26
|
-
|
|
27
|
-
--[=[
|
|
28
|
-
Requires all children ModuleScripts.
|
|
29
|
-
|
|
30
|
-
If a `predicate` function is provided, then the module will only
|
|
31
|
-
be loaded if the predicate returns `true` for the the given
|
|
32
|
-
ModuleScript.
|
|
33
|
-
|
|
34
|
-
```lua
|
|
35
|
-
-- Load all ModuleScripts directly under MyModules:
|
|
36
|
-
Loader.LoadChildren(ReplicatedStorage.MyModules)
|
|
37
|
-
|
|
38
|
-
-- Load all ModuleScripts directly under MyModules if they have names ending in 'Service':
|
|
39
|
-
Loader.LoadChildren(ReplicatedStorage.MyModules, function(moduleScript)
|
|
40
|
-
return moduleScript.Name:match("Service$") ~= nil
|
|
41
|
-
end)
|
|
42
|
-
```
|
|
43
|
-
]=]
|
|
44
|
-
function Loader.LoadChildren(parent: Instance, predicate: PredicateFn?): { [string]: any }
|
|
45
|
-
local modules: { [string]: any } = {}
|
|
46
|
-
for _, child in parent:GetChildren() do
|
|
47
|
-
if child:IsA("ModuleScript") then
|
|
48
|
-
if predicate and not predicate(child) then
|
|
49
|
-
continue
|
|
50
|
-
end
|
|
51
|
-
local m = require(child)
|
|
52
|
-
modules[child.Name] = m
|
|
53
|
-
end
|
|
54
|
-
end
|
|
55
|
-
return modules
|
|
56
|
-
end
|
|
57
|
-
|
|
58
|
-
--[=[
|
|
59
|
-
Requires all descendant ModuleScripts.
|
|
60
|
-
|
|
61
|
-
If a `predicate` function is provided, then the module will only
|
|
62
|
-
be loaded if the predicate returns `true` for the the given
|
|
63
|
-
ModuleScript.
|
|
64
|
-
|
|
65
|
-
```lua
|
|
66
|
-
-- Load all ModuleScripts under MyModules:
|
|
67
|
-
Loader.LoadDescendants(ReplicatedStorage.MyModules)
|
|
68
|
-
|
|
69
|
-
-- Load all ModuleScripts under MyModules if they have names ending in 'Service':
|
|
70
|
-
Loader.LoadDescendants(ReplicatedStorage.MyModules, function(moduleScript)
|
|
71
|
-
return moduleScript.Name:match("Service$") ~= nil
|
|
72
|
-
end)
|
|
73
|
-
]=]
|
|
74
|
-
function Loader.LoadDescendants(parent: Instance, predicate: PredicateFn?): { [string]: any }
|
|
75
|
-
local modules: { [string]: any } = {}
|
|
76
|
-
for _, descendant in parent:GetDescendants() do
|
|
77
|
-
if descendant:IsA("ModuleScript") then
|
|
78
|
-
if predicate and not predicate(descendant) then
|
|
79
|
-
continue
|
|
80
|
-
end
|
|
81
|
-
local m = require(descendant)
|
|
82
|
-
modules[descendant.Name] = m
|
|
83
|
-
end
|
|
84
|
-
end
|
|
85
|
-
return modules
|
|
86
|
-
end
|
|
87
|
-
|
|
88
|
-
--[=[
|
|
89
|
-
A commonly-used predicate in the `LoadChildren` and `LoadDescendants`
|
|
90
|
-
functions is one to match names. Therefore, the `MatchesName` utility
|
|
91
|
-
function provides a quick way to create such predicates.
|
|
92
|
-
|
|
93
|
-
```lua
|
|
94
|
-
Loader.LoadDescendants(ReplicatedStorage.MyModules, Loader.MatchesName("Service$"))
|
|
95
|
-
```
|
|
96
|
-
]=]
|
|
97
|
-
function Loader.MatchesName(matchName: string): (module: ModuleScript) -> boolean
|
|
98
|
-
return function(moduleScript: ModuleScript): boolean
|
|
99
|
-
return moduleScript.Name:match(matchName) ~= nil
|
|
100
|
-
end
|
|
101
|
-
end
|
|
102
|
-
|
|
103
|
-
--[=[
|
|
104
|
-
Utility function for spawning a specific method in all given modules.
|
|
105
|
-
If a module does not contain the specified method, it is simply
|
|
106
|
-
skipped. Methods are called with `task.spawn` internally.
|
|
107
|
-
|
|
108
|
-
For example, if the modules are expected to have an `OnStart()` method,
|
|
109
|
-
then `SpawnAll()` could be used to start all of them directly after
|
|
110
|
-
they have been loaded:
|
|
111
|
-
|
|
112
|
-
```lua
|
|
113
|
-
local MyModules = ReplicatedStorage.MyModules
|
|
114
|
-
|
|
115
|
-
-- Load all modules under MyModules and then call their OnStart methods:
|
|
116
|
-
Loader.SpawnAll(Loader.LoadDescendants(MyModules), "OnStart")
|
|
117
|
-
|
|
118
|
-
-- Same as above, but only loads modules with names that end with Service:
|
|
119
|
-
Loader.SpawnAll(
|
|
120
|
-
Loader.LoadDescendants(MyModules, Loader.MatchesName("Service$")),
|
|
121
|
-
"OnStart"
|
|
122
|
-
)
|
|
123
|
-
```
|
|
124
|
-
]=]
|
|
125
|
-
function Loader.SpawnAll(loadedModules: { [string]: any }, methodName: string)
|
|
126
|
-
for name, mod in loadedModules do
|
|
127
|
-
local method = mod[methodName]
|
|
128
|
-
if type(method) == "function" then
|
|
129
|
-
task.spawn(function()
|
|
130
|
-
debug.setmemorycategory(name)
|
|
131
|
-
method(mod)
|
|
132
|
-
end)
|
|
133
|
-
end
|
|
134
|
-
end
|
|
135
|
-
end
|
|
136
|
-
|
|
137
|
-
return Loader
|
|
1
|
+
--[=[
|
|
2
|
+
@class Loader
|
|
3
|
+
|
|
4
|
+
The Loader module will require all children or descendant ModuleScripts. There are also
|
|
5
|
+
some utility functions included, which assist with loading and starting modules in
|
|
6
|
+
single-script environments.
|
|
7
|
+
|
|
8
|
+
For example, here is a loader that loads all ModuleScripts under a folder that end with
|
|
9
|
+
the name Service, and then calls all of their OnStart methods:
|
|
10
|
+
```lua
|
|
11
|
+
local MyModules = ReplicatedStorage.MyModules
|
|
12
|
+
Loader.SpawnAll(
|
|
13
|
+
Loader.LoadDescendants(MyModules, Loader.MatchesName("Service$")),
|
|
14
|
+
"OnStart"
|
|
15
|
+
)
|
|
16
|
+
```
|
|
17
|
+
]=]
|
|
18
|
+
local Loader = {}
|
|
19
|
+
|
|
20
|
+
--[=[
|
|
21
|
+
@within Loader
|
|
22
|
+
@type PredicateFn (module: ModuleScript) -> boolean
|
|
23
|
+
Predicate function type.
|
|
24
|
+
]=]
|
|
25
|
+
type PredicateFn = (module: ModuleScript) -> boolean
|
|
26
|
+
|
|
27
|
+
--[=[
|
|
28
|
+
Requires all children ModuleScripts.
|
|
29
|
+
|
|
30
|
+
If a `predicate` function is provided, then the module will only
|
|
31
|
+
be loaded if the predicate returns `true` for the the given
|
|
32
|
+
ModuleScript.
|
|
33
|
+
|
|
34
|
+
```lua
|
|
35
|
+
-- Load all ModuleScripts directly under MyModules:
|
|
36
|
+
Loader.LoadChildren(ReplicatedStorage.MyModules)
|
|
37
|
+
|
|
38
|
+
-- Load all ModuleScripts directly under MyModules if they have names ending in 'Service':
|
|
39
|
+
Loader.LoadChildren(ReplicatedStorage.MyModules, function(moduleScript)
|
|
40
|
+
return moduleScript.Name:match("Service$") ~= nil
|
|
41
|
+
end)
|
|
42
|
+
```
|
|
43
|
+
]=]
|
|
44
|
+
function Loader.LoadChildren(parent: Instance, predicate: PredicateFn?): { [string]: any }
|
|
45
|
+
local modules: { [string]: any } = {}
|
|
46
|
+
for _, child in parent:GetChildren() do
|
|
47
|
+
if child:IsA("ModuleScript") then
|
|
48
|
+
if predicate and not predicate(child) then
|
|
49
|
+
continue
|
|
50
|
+
end
|
|
51
|
+
local m = require(child)
|
|
52
|
+
modules[child.Name] = m
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
return modules
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
--[=[
|
|
59
|
+
Requires all descendant ModuleScripts.
|
|
60
|
+
|
|
61
|
+
If a `predicate` function is provided, then the module will only
|
|
62
|
+
be loaded if the predicate returns `true` for the the given
|
|
63
|
+
ModuleScript.
|
|
64
|
+
|
|
65
|
+
```lua
|
|
66
|
+
-- Load all ModuleScripts under MyModules:
|
|
67
|
+
Loader.LoadDescendants(ReplicatedStorage.MyModules)
|
|
68
|
+
|
|
69
|
+
-- Load all ModuleScripts under MyModules if they have names ending in 'Service':
|
|
70
|
+
Loader.LoadDescendants(ReplicatedStorage.MyModules, function(moduleScript)
|
|
71
|
+
return moduleScript.Name:match("Service$") ~= nil
|
|
72
|
+
end)
|
|
73
|
+
]=]
|
|
74
|
+
function Loader.LoadDescendants(parent: Instance, predicate: PredicateFn?): { [string]: any }
|
|
75
|
+
local modules: { [string]: any } = {}
|
|
76
|
+
for _, descendant in parent:GetDescendants() do
|
|
77
|
+
if descendant:IsA("ModuleScript") then
|
|
78
|
+
if predicate and not predicate(descendant) then
|
|
79
|
+
continue
|
|
80
|
+
end
|
|
81
|
+
local m = require(descendant)
|
|
82
|
+
modules[descendant.Name] = m
|
|
83
|
+
end
|
|
84
|
+
end
|
|
85
|
+
return modules
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
--[=[
|
|
89
|
+
A commonly-used predicate in the `LoadChildren` and `LoadDescendants`
|
|
90
|
+
functions is one to match names. Therefore, the `MatchesName` utility
|
|
91
|
+
function provides a quick way to create such predicates.
|
|
92
|
+
|
|
93
|
+
```lua
|
|
94
|
+
Loader.LoadDescendants(ReplicatedStorage.MyModules, Loader.MatchesName("Service$"))
|
|
95
|
+
```
|
|
96
|
+
]=]
|
|
97
|
+
function Loader.MatchesName(matchName: string): (module: ModuleScript) -> boolean
|
|
98
|
+
return function(moduleScript: ModuleScript): boolean
|
|
99
|
+
return moduleScript.Name:match(matchName) ~= nil
|
|
100
|
+
end
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
--[=[
|
|
104
|
+
Utility function for spawning a specific method in all given modules.
|
|
105
|
+
If a module does not contain the specified method, it is simply
|
|
106
|
+
skipped. Methods are called with `task.spawn` internally.
|
|
107
|
+
|
|
108
|
+
For example, if the modules are expected to have an `OnStart()` method,
|
|
109
|
+
then `SpawnAll()` could be used to start all of them directly after
|
|
110
|
+
they have been loaded:
|
|
111
|
+
|
|
112
|
+
```lua
|
|
113
|
+
local MyModules = ReplicatedStorage.MyModules
|
|
114
|
+
|
|
115
|
+
-- Load all modules under MyModules and then call their OnStart methods:
|
|
116
|
+
Loader.SpawnAll(Loader.LoadDescendants(MyModules), "OnStart")
|
|
117
|
+
|
|
118
|
+
-- Same as above, but only loads modules with names that end with Service:
|
|
119
|
+
Loader.SpawnAll(
|
|
120
|
+
Loader.LoadDescendants(MyModules, Loader.MatchesName("Service$")),
|
|
121
|
+
"OnStart"
|
|
122
|
+
)
|
|
123
|
+
```
|
|
124
|
+
]=]
|
|
125
|
+
function Loader.SpawnAll(loadedModules: { [string]: any }, methodName: string)
|
|
126
|
+
for name, mod in loadedModules do
|
|
127
|
+
local method = mod[methodName]
|
|
128
|
+
if type(method) == "function" then
|
|
129
|
+
task.spawn(function()
|
|
130
|
+
debug.setmemorycategory(name)
|
|
131
|
+
method(mod)
|
|
132
|
+
end)
|
|
133
|
+
end
|
|
134
|
+
end
|
|
135
|
+
end
|
|
136
|
+
|
|
137
|
+
return Loader
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
[package]
|
|
2
|
-
name = "sleitnick/loader"
|
|
3
|
-
description = "Requires all modules within a given instance"
|
|
4
|
-
version = "2.0.0"
|
|
5
|
-
license = "MIT"
|
|
6
|
-
authors = ["Stephen Leitnick"]
|
|
7
|
-
registry = "https://github.com/UpliftGames/wally-index"
|
|
8
|
-
realm = "shared"
|
|
1
|
+
[package]
|
|
2
|
+
name = "sleitnick/loader"
|
|
3
|
+
description = "Requires all modules within a given instance"
|
|
4
|
+
version = "2.0.0"
|
|
5
|
+
license = "MIT"
|
|
6
|
+
authors = ["Stephen Leitnick"]
|
|
7
|
+
registry = "https://github.com/UpliftGames/wally-index"
|
|
8
|
+
realm = "shared"
|
|
@@ -1,38 +1,38 @@
|
|
|
1
|
-
declare namespace Log {
|
|
2
|
-
type Level = number;
|
|
3
|
-
type TimeUnit = number;
|
|
4
|
-
|
|
5
|
-
interface Constructor {
|
|
6
|
-
readonly Level: Record<"Trace" | "Debug" | "Info" | "Warning" | "Error" | "Fatal", number>;
|
|
7
|
-
readonly TimeUnit: Record<
|
|
8
|
-
"Milliseconds" | "Seconds" | "Minutes" | "Hours" | "Days" | "Weeks" | "Months" | "Years",
|
|
9
|
-
number
|
|
10
|
-
>;
|
|
11
|
-
|
|
12
|
-
new (): Log;
|
|
13
|
-
}
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
interface LogItem {
|
|
17
|
-
Every(n: number): this;
|
|
18
|
-
AtMostEvery(n: number, timeUnit: Log.TimeUnit): this;
|
|
19
|
-
Throw(): this;
|
|
20
|
-
Log(message: string, customData?: unknown): void;
|
|
21
|
-
Assert(condition: boolean, ...args: unknown[]): void;
|
|
22
|
-
Wrap(): (...args: Parameters<LogItem["Log"]>) => void;
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
interface Log {
|
|
26
|
-
At(level: Log.Level): LogItem;
|
|
27
|
-
AtTrace(): LogItem;
|
|
28
|
-
AtDebug(): LogItem;
|
|
29
|
-
AtInfo(): LogItem;
|
|
30
|
-
AtWarning(): LogItem;
|
|
31
|
-
AtError(): LogItem;
|
|
32
|
-
AtFatal(): LogItem;
|
|
33
|
-
Assert(condition: boolean, ...args: unknown[]): void;
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
declare const Log: Log.Constructor;
|
|
37
|
-
|
|
38
|
-
export = Log;
|
|
1
|
+
declare namespace Log {
|
|
2
|
+
type Level = number;
|
|
3
|
+
type TimeUnit = number;
|
|
4
|
+
|
|
5
|
+
interface Constructor {
|
|
6
|
+
readonly Level: Record<"Trace" | "Debug" | "Info" | "Warning" | "Error" | "Fatal", number>;
|
|
7
|
+
readonly TimeUnit: Record<
|
|
8
|
+
"Milliseconds" | "Seconds" | "Minutes" | "Hours" | "Days" | "Weeks" | "Months" | "Years",
|
|
9
|
+
number
|
|
10
|
+
>;
|
|
11
|
+
|
|
12
|
+
new (): Log;
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
interface LogItem {
|
|
17
|
+
Every(n: number): this;
|
|
18
|
+
AtMostEvery(n: number, timeUnit: Log.TimeUnit): this;
|
|
19
|
+
Throw(): this;
|
|
20
|
+
Log(message: string, customData?: unknown): void;
|
|
21
|
+
Assert(condition: boolean, ...args: unknown[]): void;
|
|
22
|
+
Wrap(): (...args: Parameters<LogItem["Log"]>) => void;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
interface Log {
|
|
26
|
+
At(level: Log.Level): LogItem;
|
|
27
|
+
AtTrace(): LogItem;
|
|
28
|
+
AtDebug(): LogItem;
|
|
29
|
+
AtInfo(): LogItem;
|
|
30
|
+
AtWarning(): LogItem;
|
|
31
|
+
AtError(): LogItem;
|
|
32
|
+
AtFatal(): LogItem;
|
|
33
|
+
Assert(condition: boolean, ...args: unknown[]): void;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
declare const Log: Log.Constructor;
|
|
37
|
+
|
|
38
|
+
export = Log;
|