roblox-opencode 1.0.0 → 1.0.2
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 +877 -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 +1618 -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,45 +1,45 @@
|
|
|
1
|
-
--!strict
|
|
2
|
-
--!nolint LocalUnused
|
|
3
|
-
--!nolint LocalShadow
|
|
4
|
-
local task = nil -- Disable usage of Roblox's task scheduler
|
|
5
|
-
|
|
6
|
-
--[[
|
|
7
|
-
Creates an empty scope with the same metatables as the original scope. Used
|
|
8
|
-
for preserving access to constructors when creating inner scopes.
|
|
9
|
-
|
|
10
|
-
This is the internal version of the function, which does not implement
|
|
11
|
-
external debugging hooks.
|
|
12
|
-
]]
|
|
13
|
-
local Package = script.Parent.Parent
|
|
14
|
-
local Types = require(Package.Types)
|
|
15
|
-
local merge = require(Package.Utility.merge)
|
|
16
|
-
local scopePool = require(Package.Memory.scopePool)
|
|
17
|
-
|
|
18
|
-
-- This return type is technically a lie, but it's required for useful type
|
|
19
|
-
-- checking behaviour.
|
|
20
|
-
local function deriveScopeImpl<T>(
|
|
21
|
-
existing: Types.Scope<T>,
|
|
22
|
-
methods: {[unknown]: unknown}?,
|
|
23
|
-
...: {[unknown]: unknown}
|
|
24
|
-
): any
|
|
25
|
-
local metatable = getmetatable(existing)
|
|
26
|
-
if methods ~= nil then
|
|
27
|
-
metatable = table.clone(metatable)
|
|
28
|
-
metatable.__index = merge(
|
|
29
|
-
true, {},
|
|
30
|
-
metatable.__index,
|
|
31
|
-
merge(
|
|
32
|
-
false, {},
|
|
33
|
-
methods,
|
|
34
|
-
...
|
|
35
|
-
)
|
|
36
|
-
)
|
|
37
|
-
end
|
|
38
|
-
local scope = setmetatable(
|
|
39
|
-
scopePool.reuseAny() :: any or {},
|
|
40
|
-
metatable
|
|
41
|
-
)
|
|
42
|
-
return scope
|
|
43
|
-
end
|
|
44
|
-
|
|
1
|
+
--!strict
|
|
2
|
+
--!nolint LocalUnused
|
|
3
|
+
--!nolint LocalShadow
|
|
4
|
+
local task = nil -- Disable usage of Roblox's task scheduler
|
|
5
|
+
|
|
6
|
+
--[[
|
|
7
|
+
Creates an empty scope with the same metatables as the original scope. Used
|
|
8
|
+
for preserving access to constructors when creating inner scopes.
|
|
9
|
+
|
|
10
|
+
This is the internal version of the function, which does not implement
|
|
11
|
+
external debugging hooks.
|
|
12
|
+
]]
|
|
13
|
+
local Package = script.Parent.Parent
|
|
14
|
+
local Types = require(Package.Types)
|
|
15
|
+
local merge = require(Package.Utility.merge)
|
|
16
|
+
local scopePool = require(Package.Memory.scopePool)
|
|
17
|
+
|
|
18
|
+
-- This return type is technically a lie, but it's required for useful type
|
|
19
|
+
-- checking behaviour.
|
|
20
|
+
local function deriveScopeImpl<T>(
|
|
21
|
+
existing: Types.Scope<T>,
|
|
22
|
+
methods: {[unknown]: unknown}?,
|
|
23
|
+
...: {[unknown]: unknown}
|
|
24
|
+
): any
|
|
25
|
+
local metatable = getmetatable(existing)
|
|
26
|
+
if methods ~= nil then
|
|
27
|
+
metatable = table.clone(metatable)
|
|
28
|
+
metatable.__index = merge(
|
|
29
|
+
true, {},
|
|
30
|
+
metatable.__index,
|
|
31
|
+
merge(
|
|
32
|
+
false, {},
|
|
33
|
+
methods,
|
|
34
|
+
...
|
|
35
|
+
)
|
|
36
|
+
)
|
|
37
|
+
end
|
|
38
|
+
local scope = setmetatable(
|
|
39
|
+
scopePool.reuseAny() :: any or {},
|
|
40
|
+
metatable
|
|
41
|
+
)
|
|
42
|
+
return scope
|
|
43
|
+
end
|
|
44
|
+
|
|
45
45
|
return (deriveScopeImpl :: any) :: Types.DeriveScopeConstructor
|
|
@@ -1,79 +1,79 @@
|
|
|
1
|
-
--!strict
|
|
2
|
-
--!nolint LocalUnused
|
|
3
|
-
--!nolint LocalShadow
|
|
4
|
-
local task = nil -- Disable usage of Roblox's task scheduler
|
|
5
|
-
|
|
6
|
-
--[[
|
|
7
|
-
Cleans up the tasks passed in as the arguments.
|
|
8
|
-
A task can be any of the following:
|
|
9
|
-
|
|
10
|
-
- an Instance - will be destroyed
|
|
11
|
-
- an RBXScriptConnection - will be disconnected
|
|
12
|
-
- a function - will be run
|
|
13
|
-
- a table with a `Destroy` or `destroy` function - will be called
|
|
14
|
-
- an array - `cleanup` will be called on each item
|
|
15
|
-
]]
|
|
16
|
-
local Package = script.Parent.Parent
|
|
17
|
-
local Types = require(Package.Types)
|
|
18
|
-
local External = require(Package.External)
|
|
19
|
-
local scopePool = require(Package.Memory.scopePool)
|
|
20
|
-
local poisonScope = require(Package.Memory.poisonScope)
|
|
21
|
-
|
|
22
|
-
local alreadyDestroying: {[Types.Task]: true} = {}
|
|
23
|
-
|
|
24
|
-
local function doCleanup(
|
|
25
|
-
task: Types.Task
|
|
26
|
-
): ()
|
|
27
|
-
if alreadyDestroying[task] then
|
|
28
|
-
return External.logError("destroyedTwice")
|
|
29
|
-
end
|
|
30
|
-
alreadyDestroying[task] = true
|
|
31
|
-
|
|
32
|
-
-- case 1: Instance
|
|
33
|
-
if typeof(task) == "Instance" then
|
|
34
|
-
task:Destroy()
|
|
35
|
-
|
|
36
|
-
-- case 2: RBXScriptConnection
|
|
37
|
-
elseif typeof(task) == "RBXScriptConnection" then
|
|
38
|
-
task:Disconnect()
|
|
39
|
-
|
|
40
|
-
-- case 3: callback
|
|
41
|
-
elseif typeof(task) == "function" then
|
|
42
|
-
task()
|
|
43
|
-
|
|
44
|
-
elseif typeof(task) == "table" then
|
|
45
|
-
local task = (task :: any) :: {Destroy: (...unknown) -> (...unknown)?, destroy: (...unknown) -> (...unknown)?}
|
|
46
|
-
|
|
47
|
-
-- case 4: destroy() function
|
|
48
|
-
if typeof(task.destroy) == "function" then
|
|
49
|
-
local task = (task :: any) :: {destroy: (...unknown) -> (...unknown)}
|
|
50
|
-
task:destroy()
|
|
51
|
-
|
|
52
|
-
-- case 5: Destroy() function
|
|
53
|
-
elseif typeof(task.Destroy) == "function" then
|
|
54
|
-
local task = (task :: any) :: {Destroy: (...unknown) -> (...unknown)}
|
|
55
|
-
task:Destroy()
|
|
56
|
-
|
|
57
|
-
-- case 6: table of tasks with an array part
|
|
58
|
-
elseif task[1] ~= nil then
|
|
59
|
-
local task = task :: {Types.Task}
|
|
60
|
-
|
|
61
|
-
-- It is important to iterate backwards through the table, since
|
|
62
|
-
-- objects are added in order of construction.
|
|
63
|
-
for index = #task, 1, -1 do
|
|
64
|
-
doCleanup(task[index])
|
|
65
|
-
task[index] = nil
|
|
66
|
-
end
|
|
67
|
-
|
|
68
|
-
if External.isTimeCritical() then
|
|
69
|
-
scopePool.giveIfEmpty(task)
|
|
70
|
-
else
|
|
71
|
-
poisonScope(task, "`doCleanup()` was previously called on this scope. Ensure you are not reusing scopes after cleanup.")
|
|
72
|
-
end
|
|
73
|
-
end
|
|
74
|
-
end
|
|
75
|
-
|
|
76
|
-
alreadyDestroying[task] = nil
|
|
77
|
-
end
|
|
78
|
-
|
|
1
|
+
--!strict
|
|
2
|
+
--!nolint LocalUnused
|
|
3
|
+
--!nolint LocalShadow
|
|
4
|
+
local task = nil -- Disable usage of Roblox's task scheduler
|
|
5
|
+
|
|
6
|
+
--[[
|
|
7
|
+
Cleans up the tasks passed in as the arguments.
|
|
8
|
+
A task can be any of the following:
|
|
9
|
+
|
|
10
|
+
- an Instance - will be destroyed
|
|
11
|
+
- an RBXScriptConnection - will be disconnected
|
|
12
|
+
- a function - will be run
|
|
13
|
+
- a table with a `Destroy` or `destroy` function - will be called
|
|
14
|
+
- an array - `cleanup` will be called on each item
|
|
15
|
+
]]
|
|
16
|
+
local Package = script.Parent.Parent
|
|
17
|
+
local Types = require(Package.Types)
|
|
18
|
+
local External = require(Package.External)
|
|
19
|
+
local scopePool = require(Package.Memory.scopePool)
|
|
20
|
+
local poisonScope = require(Package.Memory.poisonScope)
|
|
21
|
+
|
|
22
|
+
local alreadyDestroying: {[Types.Task]: true} = {}
|
|
23
|
+
|
|
24
|
+
local function doCleanup(
|
|
25
|
+
task: Types.Task
|
|
26
|
+
): ()
|
|
27
|
+
if alreadyDestroying[task] then
|
|
28
|
+
return External.logError("destroyedTwice")
|
|
29
|
+
end
|
|
30
|
+
alreadyDestroying[task] = true
|
|
31
|
+
|
|
32
|
+
-- case 1: Instance
|
|
33
|
+
if typeof(task) == "Instance" then
|
|
34
|
+
task:Destroy()
|
|
35
|
+
|
|
36
|
+
-- case 2: RBXScriptConnection
|
|
37
|
+
elseif typeof(task) == "RBXScriptConnection" then
|
|
38
|
+
task:Disconnect()
|
|
39
|
+
|
|
40
|
+
-- case 3: callback
|
|
41
|
+
elseif typeof(task) == "function" then
|
|
42
|
+
task()
|
|
43
|
+
|
|
44
|
+
elseif typeof(task) == "table" then
|
|
45
|
+
local task = (task :: any) :: {Destroy: (...unknown) -> (...unknown)?, destroy: (...unknown) -> (...unknown)?}
|
|
46
|
+
|
|
47
|
+
-- case 4: destroy() function
|
|
48
|
+
if typeof(task.destroy) == "function" then
|
|
49
|
+
local task = (task :: any) :: {destroy: (...unknown) -> (...unknown)}
|
|
50
|
+
task:destroy()
|
|
51
|
+
|
|
52
|
+
-- case 5: Destroy() function
|
|
53
|
+
elseif typeof(task.Destroy) == "function" then
|
|
54
|
+
local task = (task :: any) :: {Destroy: (...unknown) -> (...unknown)}
|
|
55
|
+
task:Destroy()
|
|
56
|
+
|
|
57
|
+
-- case 6: table of tasks with an array part
|
|
58
|
+
elseif task[1] ~= nil then
|
|
59
|
+
local task = task :: {Types.Task}
|
|
60
|
+
|
|
61
|
+
-- It is important to iterate backwards through the table, since
|
|
62
|
+
-- objects are added in order of construction.
|
|
63
|
+
for index = #task, 1, -1 do
|
|
64
|
+
doCleanup(task[index])
|
|
65
|
+
task[index] = nil
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
if External.isTimeCritical() then
|
|
69
|
+
scopePool.giveIfEmpty(task)
|
|
70
|
+
else
|
|
71
|
+
poisonScope(task, "`doCleanup()` was previously called on this scope. Ensure you are not reusing scopes after cleanup.")
|
|
72
|
+
end
|
|
73
|
+
end
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
alreadyDestroying[task] = nil
|
|
77
|
+
end
|
|
78
|
+
|
|
79
79
|
return doCleanup
|
|
@@ -1,34 +1,34 @@
|
|
|
1
|
-
--!strict
|
|
2
|
-
--!nolint LocalUnused
|
|
3
|
-
--!nolint LocalShadow
|
|
4
|
-
local task = nil -- Disable usage of Roblox's task scheduler
|
|
5
|
-
|
|
6
|
-
--[[
|
|
7
|
-
Derives a new scope that's destroyed exactly once, whether by the user or by
|
|
8
|
-
the scope that it's inside of.
|
|
9
|
-
]]
|
|
10
|
-
local Package = script.Parent.Parent
|
|
11
|
-
local Types = require(Package.Types)
|
|
12
|
-
local ExternalDebug = require(Package.ExternalDebug)
|
|
13
|
-
local deriveScopeImpl = require(Package.Memory.deriveScopeImpl)
|
|
14
|
-
|
|
15
|
-
local function innerScope<T>(
|
|
16
|
-
existing: Types.Scope<T>,
|
|
17
|
-
...: {[unknown]: unknown}
|
|
18
|
-
): any
|
|
19
|
-
local new = deriveScopeImpl(existing, ...)
|
|
20
|
-
table.insert(existing, new)
|
|
21
|
-
table.insert(
|
|
22
|
-
new,
|
|
23
|
-
function()
|
|
24
|
-
local index = table.find(existing, new)
|
|
25
|
-
if index ~= nil then
|
|
26
|
-
table.remove(existing, index)
|
|
27
|
-
end
|
|
28
|
-
end
|
|
29
|
-
)
|
|
30
|
-
ExternalDebug.trackScope(new)
|
|
31
|
-
return new
|
|
32
|
-
end
|
|
33
|
-
|
|
1
|
+
--!strict
|
|
2
|
+
--!nolint LocalUnused
|
|
3
|
+
--!nolint LocalShadow
|
|
4
|
+
local task = nil -- Disable usage of Roblox's task scheduler
|
|
5
|
+
|
|
6
|
+
--[[
|
|
7
|
+
Derives a new scope that's destroyed exactly once, whether by the user or by
|
|
8
|
+
the scope that it's inside of.
|
|
9
|
+
]]
|
|
10
|
+
local Package = script.Parent.Parent
|
|
11
|
+
local Types = require(Package.Types)
|
|
12
|
+
local ExternalDebug = require(Package.ExternalDebug)
|
|
13
|
+
local deriveScopeImpl = require(Package.Memory.deriveScopeImpl)
|
|
14
|
+
|
|
15
|
+
local function innerScope<T>(
|
|
16
|
+
existing: Types.Scope<T>,
|
|
17
|
+
...: {[unknown]: unknown}
|
|
18
|
+
): any
|
|
19
|
+
local new = deriveScopeImpl(existing, ...)
|
|
20
|
+
table.insert(existing, new)
|
|
21
|
+
table.insert(
|
|
22
|
+
new,
|
|
23
|
+
function()
|
|
24
|
+
local index = table.find(existing, new)
|
|
25
|
+
if index ~= nil then
|
|
26
|
+
table.remove(existing, index)
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
)
|
|
30
|
+
ExternalDebug.trackScope(new)
|
|
31
|
+
return new
|
|
32
|
+
end
|
|
33
|
+
|
|
34
34
|
return (innerScope :: any) :: Types.DeriveScopeConstructor
|
|
@@ -1,18 +1,18 @@
|
|
|
1
|
-
--!strict
|
|
2
|
-
--!nolint LocalUnused
|
|
3
|
-
--!nolint LocalShadow
|
|
4
|
-
local task = nil -- Disable usage of Roblox's task scheduler
|
|
5
|
-
|
|
6
|
-
local Package = script.Parent.Parent
|
|
7
|
-
local Types = require(Package.Types)
|
|
8
|
-
local External = require(Package.External)
|
|
9
|
-
local doCleanup = require(Package.Memory.doCleanup)
|
|
10
|
-
|
|
11
|
-
local function legacyCleanup(
|
|
12
|
-
value: Types.Task
|
|
13
|
-
)
|
|
14
|
-
External.logWarn("cleanupWasRenamed")
|
|
15
|
-
return doCleanup(value)
|
|
16
|
-
end
|
|
17
|
-
|
|
1
|
+
--!strict
|
|
2
|
+
--!nolint LocalUnused
|
|
3
|
+
--!nolint LocalShadow
|
|
4
|
+
local task = nil -- Disable usage of Roblox's task scheduler
|
|
5
|
+
|
|
6
|
+
local Package = script.Parent.Parent
|
|
7
|
+
local Types = require(Package.Types)
|
|
8
|
+
local External = require(Package.External)
|
|
9
|
+
local doCleanup = require(Package.Memory.doCleanup)
|
|
10
|
+
|
|
11
|
+
local function legacyCleanup(
|
|
12
|
+
value: Types.Task
|
|
13
|
+
)
|
|
14
|
+
External.logWarn("cleanupWasRenamed")
|
|
15
|
+
return doCleanup(value)
|
|
16
|
+
end
|
|
17
|
+
|
|
18
18
|
return legacyCleanup
|
|
@@ -1,17 +1,17 @@
|
|
|
1
|
-
--!strict
|
|
2
|
-
--!nolint LocalUnused
|
|
3
|
-
--!nolint LocalShadow
|
|
4
|
-
local task = nil -- Disable usage of Roblox's task scheduler
|
|
5
|
-
|
|
6
|
-
--[[
|
|
7
|
-
Returns true if the given value is not automatically memory managed, and
|
|
8
|
-
requires manual cleanup.
|
|
9
|
-
]]
|
|
10
|
-
|
|
11
|
-
local function needsDestruction(
|
|
12
|
-
x: unknown
|
|
13
|
-
): boolean
|
|
14
|
-
return typeof(x) == "Instance"
|
|
15
|
-
end
|
|
16
|
-
|
|
1
|
+
--!strict
|
|
2
|
+
--!nolint LocalUnused
|
|
3
|
+
--!nolint LocalShadow
|
|
4
|
+
local task = nil -- Disable usage of Roblox's task scheduler
|
|
5
|
+
|
|
6
|
+
--[[
|
|
7
|
+
Returns true if the given value is not automatically memory managed, and
|
|
8
|
+
requires manual cleanup.
|
|
9
|
+
]]
|
|
10
|
+
|
|
11
|
+
local function needsDestruction(
|
|
12
|
+
x: unknown
|
|
13
|
+
): boolean
|
|
14
|
+
return typeof(x) == "Instance"
|
|
15
|
+
end
|
|
16
|
+
|
|
17
17
|
return needsDestruction
|
|
@@ -1,34 +1,34 @@
|
|
|
1
|
-
--!strict
|
|
2
|
-
--!nolint LocalUnused
|
|
3
|
-
--!nolint LocalShadow
|
|
4
|
-
local task = nil -- Disable usage of Roblox's task scheduler
|
|
5
|
-
|
|
6
|
-
--[[
|
|
7
|
-
'Poisons' the given scope; if the scope is used again, then it will cause
|
|
8
|
-
the program to crash.
|
|
9
|
-
]]
|
|
10
|
-
local Package = script.Parent.Parent
|
|
11
|
-
local Types = require(Package.Types)
|
|
12
|
-
local External = require(Package.External)
|
|
13
|
-
|
|
14
|
-
local function poisonScope(
|
|
15
|
-
scope: Types.Scope,
|
|
16
|
-
context: string
|
|
17
|
-
): ()
|
|
18
|
-
local mt = getmetatable(scope)
|
|
19
|
-
if typeof(mt) == "table" and mt._FUSION_POISONED then
|
|
20
|
-
return
|
|
21
|
-
end
|
|
22
|
-
table.clear(scope)
|
|
23
|
-
setmetatable(scope :: any, {
|
|
24
|
-
_FUSION_POISONED = true,
|
|
25
|
-
__index = function()
|
|
26
|
-
External.logError("poisonedScope", nil, context)
|
|
27
|
-
end,
|
|
28
|
-
__newindex = function()
|
|
29
|
-
External.logError("poisonedScope", nil, context)
|
|
30
|
-
end
|
|
31
|
-
})
|
|
32
|
-
end
|
|
33
|
-
|
|
1
|
+
--!strict
|
|
2
|
+
--!nolint LocalUnused
|
|
3
|
+
--!nolint LocalShadow
|
|
4
|
+
local task = nil -- Disable usage of Roblox's task scheduler
|
|
5
|
+
|
|
6
|
+
--[[
|
|
7
|
+
'Poisons' the given scope; if the scope is used again, then it will cause
|
|
8
|
+
the program to crash.
|
|
9
|
+
]]
|
|
10
|
+
local Package = script.Parent.Parent
|
|
11
|
+
local Types = require(Package.Types)
|
|
12
|
+
local External = require(Package.External)
|
|
13
|
+
|
|
14
|
+
local function poisonScope(
|
|
15
|
+
scope: Types.Scope,
|
|
16
|
+
context: string
|
|
17
|
+
): ()
|
|
18
|
+
local mt = getmetatable(scope)
|
|
19
|
+
if typeof(mt) == "table" and mt._FUSION_POISONED then
|
|
20
|
+
return
|
|
21
|
+
end
|
|
22
|
+
table.clear(scope)
|
|
23
|
+
setmetatable(scope :: any, {
|
|
24
|
+
_FUSION_POISONED = true,
|
|
25
|
+
__index = function()
|
|
26
|
+
External.logError("poisonedScope", nil, context)
|
|
27
|
+
end,
|
|
28
|
+
__newindex = function()
|
|
29
|
+
External.logError("poisonedScope", nil, context)
|
|
30
|
+
end
|
|
31
|
+
})
|
|
32
|
+
end
|
|
33
|
+
|
|
34
34
|
return poisonScope
|
|
@@ -1,55 +1,55 @@
|
|
|
1
|
-
--!strict
|
|
2
|
-
--!nolint LocalUnused
|
|
3
|
-
--!nolint LocalShadow
|
|
4
|
-
local task = nil -- Disable usage of Roblox's task scheduler
|
|
5
|
-
|
|
6
|
-
local Package = script.Parent.Parent
|
|
7
|
-
local Types = require(Package.Types)
|
|
8
|
-
local poisonScope = require(Package.Memory.poisonScope)
|
|
9
|
-
local ExternalDebug = require(Package.ExternalDebug)
|
|
10
|
-
|
|
11
|
-
local ENABLE_POOLING = false
|
|
12
|
-
local MAX_POOL_SIZE = 16 -- TODO: need to test what an ideal number for this is
|
|
13
|
-
|
|
14
|
-
local pool = {}
|
|
15
|
-
local poolSize = 0
|
|
16
|
-
|
|
17
|
-
return {
|
|
18
|
-
giveIfEmpty = function<S>(
|
|
19
|
-
scope: Types.Scope<S>
|
|
20
|
-
): Types.Scope<S>?
|
|
21
|
-
if next(scope) == nil then
|
|
22
|
-
ExternalDebug.untrackScope(scope)
|
|
23
|
-
if ENABLE_POOLING and poolSize < MAX_POOL_SIZE then
|
|
24
|
-
poolSize += 1
|
|
25
|
-
pool[poolSize] = scope
|
|
26
|
-
else
|
|
27
|
-
poisonScope(scope, "previously passed to the internal scope pool, which indicates a Fusion bug.")
|
|
28
|
-
end
|
|
29
|
-
return nil
|
|
30
|
-
else
|
|
31
|
-
return scope
|
|
32
|
-
end
|
|
33
|
-
end,
|
|
34
|
-
clearAndGive = function(
|
|
35
|
-
scope: Types.Scope<unknown>
|
|
36
|
-
)
|
|
37
|
-
ExternalDebug.untrackScope(scope)
|
|
38
|
-
table.clear(scope)
|
|
39
|
-
if ENABLE_POOLING and poolSize < MAX_POOL_SIZE then
|
|
40
|
-
poolSize += 1
|
|
41
|
-
pool[poolSize] = scope :: any
|
|
42
|
-
else
|
|
43
|
-
poisonScope(scope, "previously passed to the internal scope pool, which indicates a Fusion bug.")
|
|
44
|
-
end
|
|
45
|
-
end,
|
|
46
|
-
reuseAny = function(): Types.Scope<unknown>
|
|
47
|
-
if poolSize == 0 then
|
|
48
|
-
return nil :: any
|
|
49
|
-
else
|
|
50
|
-
local scope = pool[poolSize]
|
|
51
|
-
poolSize -= 1
|
|
52
|
-
return scope
|
|
53
|
-
end
|
|
54
|
-
end
|
|
1
|
+
--!strict
|
|
2
|
+
--!nolint LocalUnused
|
|
3
|
+
--!nolint LocalShadow
|
|
4
|
+
local task = nil -- Disable usage of Roblox's task scheduler
|
|
5
|
+
|
|
6
|
+
local Package = script.Parent.Parent
|
|
7
|
+
local Types = require(Package.Types)
|
|
8
|
+
local poisonScope = require(Package.Memory.poisonScope)
|
|
9
|
+
local ExternalDebug = require(Package.ExternalDebug)
|
|
10
|
+
|
|
11
|
+
local ENABLE_POOLING = false
|
|
12
|
+
local MAX_POOL_SIZE = 16 -- TODO: need to test what an ideal number for this is
|
|
13
|
+
|
|
14
|
+
local pool = {}
|
|
15
|
+
local poolSize = 0
|
|
16
|
+
|
|
17
|
+
return {
|
|
18
|
+
giveIfEmpty = function<S>(
|
|
19
|
+
scope: Types.Scope<S>
|
|
20
|
+
): Types.Scope<S>?
|
|
21
|
+
if next(scope) == nil then
|
|
22
|
+
ExternalDebug.untrackScope(scope)
|
|
23
|
+
if ENABLE_POOLING and poolSize < MAX_POOL_SIZE then
|
|
24
|
+
poolSize += 1
|
|
25
|
+
pool[poolSize] = scope
|
|
26
|
+
else
|
|
27
|
+
poisonScope(scope, "previously passed to the internal scope pool, which indicates a Fusion bug.")
|
|
28
|
+
end
|
|
29
|
+
return nil
|
|
30
|
+
else
|
|
31
|
+
return scope
|
|
32
|
+
end
|
|
33
|
+
end,
|
|
34
|
+
clearAndGive = function(
|
|
35
|
+
scope: Types.Scope<unknown>
|
|
36
|
+
)
|
|
37
|
+
ExternalDebug.untrackScope(scope)
|
|
38
|
+
table.clear(scope)
|
|
39
|
+
if ENABLE_POOLING and poolSize < MAX_POOL_SIZE then
|
|
40
|
+
poolSize += 1
|
|
41
|
+
pool[poolSize] = scope :: any
|
|
42
|
+
else
|
|
43
|
+
poisonScope(scope, "previously passed to the internal scope pool, which indicates a Fusion bug.")
|
|
44
|
+
end
|
|
45
|
+
end,
|
|
46
|
+
reuseAny = function(): Types.Scope<unknown>
|
|
47
|
+
if poolSize == 0 then
|
|
48
|
+
return nil :: any
|
|
49
|
+
else
|
|
50
|
+
local scope = pool[poolSize]
|
|
51
|
+
poolSize -= 1
|
|
52
|
+
return scope
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
55
|
}
|
|
@@ -1,27 +1,27 @@
|
|
|
1
|
-
--!strict
|
|
2
|
-
--!nolint LocalUnused
|
|
3
|
-
--!nolint LocalShadow
|
|
4
|
-
local task = nil -- Disable usage of Roblox's task scheduler
|
|
5
|
-
|
|
6
|
-
--[[
|
|
7
|
-
Creates cleanup tables with access to constructors as methods.
|
|
8
|
-
]]
|
|
9
|
-
|
|
10
|
-
local Package = script.Parent.Parent
|
|
11
|
-
local Types = require(Package.Types)
|
|
12
|
-
local ExternalDebug = require(Package.ExternalDebug)
|
|
13
|
-
local merge = require(Package.Utility.merge)
|
|
14
|
-
local scopePool = require(Package.Memory.scopePool)
|
|
15
|
-
|
|
16
|
-
local function scoped(
|
|
17
|
-
...: {[unknown]: unknown}
|
|
18
|
-
): any
|
|
19
|
-
local scope = setmetatable(
|
|
20
|
-
scopePool.reuseAny() :: any or {},
|
|
21
|
-
{__index = merge(false, {}, ...)}
|
|
22
|
-
) :: any
|
|
23
|
-
ExternalDebug.trackScope(scope)
|
|
24
|
-
return scope
|
|
25
|
-
end
|
|
26
|
-
|
|
1
|
+
--!strict
|
|
2
|
+
--!nolint LocalUnused
|
|
3
|
+
--!nolint LocalShadow
|
|
4
|
+
local task = nil -- Disable usage of Roblox's task scheduler
|
|
5
|
+
|
|
6
|
+
--[[
|
|
7
|
+
Creates cleanup tables with access to constructors as methods.
|
|
8
|
+
]]
|
|
9
|
+
|
|
10
|
+
local Package = script.Parent.Parent
|
|
11
|
+
local Types = require(Package.Types)
|
|
12
|
+
local ExternalDebug = require(Package.ExternalDebug)
|
|
13
|
+
local merge = require(Package.Utility.merge)
|
|
14
|
+
local scopePool = require(Package.Memory.scopePool)
|
|
15
|
+
|
|
16
|
+
local function scoped(
|
|
17
|
+
...: {[unknown]: unknown}
|
|
18
|
+
): any
|
|
19
|
+
local scope = setmetatable(
|
|
20
|
+
scopePool.reuseAny() :: any or {},
|
|
21
|
+
{__index = merge(false, {}, ...)}
|
|
22
|
+
) :: any
|
|
23
|
+
ExternalDebug.trackScope(scope)
|
|
24
|
+
return scope
|
|
25
|
+
end
|
|
26
|
+
|
|
27
27
|
return (scoped :: any) :: Types.ScopedConstructor
|