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,91 +1,91 @@
|
|
|
1
|
-
--!strict
|
|
2
|
-
--!nolint LocalUnused
|
|
3
|
-
--!nolint LocalShadow
|
|
4
|
-
local task = nil -- Disable usage of Roblox's task scheduler
|
|
5
|
-
|
|
6
|
-
--[[
|
|
7
|
-
Time-based contextual values, to allow for transparently passing values down
|
|
8
|
-
the call stack.
|
|
9
|
-
]]
|
|
10
|
-
|
|
11
|
-
local Package = script.Parent.Parent
|
|
12
|
-
local Types = require(Package.Types)
|
|
13
|
-
local External = require(Package.External)
|
|
14
|
-
-- Logging
|
|
15
|
-
local parseError = require(Package.Logging.parseError)
|
|
16
|
-
|
|
17
|
-
export type Self<T> = Types.Contextual<T> & {
|
|
18
|
-
_valuesNow: {[thread]: {value: T}},
|
|
19
|
-
_defaultValue: T
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
local class = {}
|
|
23
|
-
class.type = "Contextual"
|
|
24
|
-
|
|
25
|
-
local METATABLE = table.freeze {__index = class}
|
|
26
|
-
local WEAK_KEYS_METATABLE = table.freeze {__mode = "k"}
|
|
27
|
-
|
|
28
|
-
local function Contextual<T>(
|
|
29
|
-
defaultValue: T
|
|
30
|
-
): Types.Contextual<T>
|
|
31
|
-
local self: Self<T> = setmetatable(
|
|
32
|
-
{
|
|
33
|
-
-- if we held strong references to threads here, then if a thread was
|
|
34
|
-
-- killed before this contextual had a chance to finish executing its
|
|
35
|
-
-- callback, it would be held strongly in this table forever
|
|
36
|
-
_valuesNow = setmetatable({}, WEAK_KEYS_METATABLE),
|
|
37
|
-
_defaultValue = defaultValue
|
|
38
|
-
},
|
|
39
|
-
METATABLE
|
|
40
|
-
) :: any
|
|
41
|
-
|
|
42
|
-
return self
|
|
43
|
-
end
|
|
44
|
-
|
|
45
|
-
--[[
|
|
46
|
-
Returns the current value of this contextual.
|
|
47
|
-
]]
|
|
48
|
-
function class.now<T>(
|
|
49
|
-
self: Self<T>
|
|
50
|
-
): T
|
|
51
|
-
local thread = coroutine.running()
|
|
52
|
-
local value = self._valuesNow[thread]
|
|
53
|
-
if typeof(value) ~= "table" then
|
|
54
|
-
return self._defaultValue
|
|
55
|
-
else
|
|
56
|
-
return value.value
|
|
57
|
-
end
|
|
58
|
-
end
|
|
59
|
-
|
|
60
|
-
--[[
|
|
61
|
-
Temporarily assigns a value to this contextual.
|
|
62
|
-
]]
|
|
63
|
-
function class.is<T>(
|
|
64
|
-
self: Self<T>,
|
|
65
|
-
newValue: T
|
|
66
|
-
)
|
|
67
|
-
local methods = {}
|
|
68
|
-
|
|
69
|
-
function methods.during<T, A...>(
|
|
70
|
-
_: any, -- during is called with colon syntax but we don't care
|
|
71
|
-
callback: (A...) -> T,
|
|
72
|
-
...: A...
|
|
73
|
-
): T
|
|
74
|
-
local thread = coroutine.running()
|
|
75
|
-
local prevValue = self._valuesNow[thread]
|
|
76
|
-
-- Storing the value in this format allows us to distinguish storing
|
|
77
|
-
-- `nil` from not calling `:during()` at all.
|
|
78
|
-
self._valuesNow[thread] = { value = newValue }
|
|
79
|
-
local ok, value = xpcall(callback, parseError, ...)
|
|
80
|
-
self._valuesNow[thread] = prevValue
|
|
81
|
-
if not ok then
|
|
82
|
-
External.logError("callbackError", value :: any)
|
|
83
|
-
end
|
|
84
|
-
return value
|
|
85
|
-
end
|
|
86
|
-
|
|
87
|
-
return methods
|
|
88
|
-
end
|
|
89
|
-
|
|
90
|
-
table.freeze(class)
|
|
1
|
+
--!strict
|
|
2
|
+
--!nolint LocalUnused
|
|
3
|
+
--!nolint LocalShadow
|
|
4
|
+
local task = nil -- Disable usage of Roblox's task scheduler
|
|
5
|
+
|
|
6
|
+
--[[
|
|
7
|
+
Time-based contextual values, to allow for transparently passing values down
|
|
8
|
+
the call stack.
|
|
9
|
+
]]
|
|
10
|
+
|
|
11
|
+
local Package = script.Parent.Parent
|
|
12
|
+
local Types = require(Package.Types)
|
|
13
|
+
local External = require(Package.External)
|
|
14
|
+
-- Logging
|
|
15
|
+
local parseError = require(Package.Logging.parseError)
|
|
16
|
+
|
|
17
|
+
export type Self<T> = Types.Contextual<T> & {
|
|
18
|
+
_valuesNow: {[thread]: {value: T}},
|
|
19
|
+
_defaultValue: T
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
local class = {}
|
|
23
|
+
class.type = "Contextual"
|
|
24
|
+
|
|
25
|
+
local METATABLE = table.freeze {__index = class}
|
|
26
|
+
local WEAK_KEYS_METATABLE = table.freeze {__mode = "k"}
|
|
27
|
+
|
|
28
|
+
local function Contextual<T>(
|
|
29
|
+
defaultValue: T
|
|
30
|
+
): Types.Contextual<T>
|
|
31
|
+
local self: Self<T> = setmetatable(
|
|
32
|
+
{
|
|
33
|
+
-- if we held strong references to threads here, then if a thread was
|
|
34
|
+
-- killed before this contextual had a chance to finish executing its
|
|
35
|
+
-- callback, it would be held strongly in this table forever
|
|
36
|
+
_valuesNow = setmetatable({}, WEAK_KEYS_METATABLE),
|
|
37
|
+
_defaultValue = defaultValue
|
|
38
|
+
},
|
|
39
|
+
METATABLE
|
|
40
|
+
) :: any
|
|
41
|
+
|
|
42
|
+
return self
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
--[[
|
|
46
|
+
Returns the current value of this contextual.
|
|
47
|
+
]]
|
|
48
|
+
function class.now<T>(
|
|
49
|
+
self: Self<T>
|
|
50
|
+
): T
|
|
51
|
+
local thread = coroutine.running()
|
|
52
|
+
local value = self._valuesNow[thread]
|
|
53
|
+
if typeof(value) ~= "table" then
|
|
54
|
+
return self._defaultValue
|
|
55
|
+
else
|
|
56
|
+
return value.value
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
--[[
|
|
61
|
+
Temporarily assigns a value to this contextual.
|
|
62
|
+
]]
|
|
63
|
+
function class.is<T>(
|
|
64
|
+
self: Self<T>,
|
|
65
|
+
newValue: T
|
|
66
|
+
)
|
|
67
|
+
local methods = {}
|
|
68
|
+
|
|
69
|
+
function methods.during<T, A...>(
|
|
70
|
+
_: any, -- during is called with colon syntax but we don't care
|
|
71
|
+
callback: (A...) -> T,
|
|
72
|
+
...: A...
|
|
73
|
+
): T
|
|
74
|
+
local thread = coroutine.running()
|
|
75
|
+
local prevValue = self._valuesNow[thread]
|
|
76
|
+
-- Storing the value in this format allows us to distinguish storing
|
|
77
|
+
-- `nil` from not calling `:during()` at all.
|
|
78
|
+
self._valuesNow[thread] = { value = newValue }
|
|
79
|
+
local ok, value = xpcall(callback, parseError, ...)
|
|
80
|
+
self._valuesNow[thread] = prevValue
|
|
81
|
+
if not ok then
|
|
82
|
+
External.logError("callbackError", value :: any)
|
|
83
|
+
end
|
|
84
|
+
return value
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
return methods
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
table.freeze(class)
|
|
91
91
|
return Contextual
|
|
@@ -1,23 +1,23 @@
|
|
|
1
|
-
--!strict
|
|
2
|
-
--!nolint LocalUnused
|
|
3
|
-
--!nolint LocalShadow
|
|
4
|
-
local task = nil -- Disable usage of Roblox's task scheduler
|
|
5
|
-
|
|
6
|
-
--[[
|
|
7
|
-
A variant of xpcall() designed for inline usage, letting you define fallback
|
|
8
|
-
values based on caught errors.
|
|
9
|
-
]]
|
|
10
|
-
|
|
11
|
-
local Package = script.Parent.Parent
|
|
12
|
-
|
|
13
|
-
local function Safe<Success, Fail>(
|
|
14
|
-
callbacks: {
|
|
15
|
-
try: () -> Success,
|
|
16
|
-
fallback: (err: unknown) -> Fail
|
|
17
|
-
}
|
|
18
|
-
): Success | Fail
|
|
19
|
-
local _, value = xpcall(callbacks.try, callbacks.fallback)
|
|
20
|
-
return value
|
|
21
|
-
end
|
|
22
|
-
|
|
1
|
+
--!strict
|
|
2
|
+
--!nolint LocalUnused
|
|
3
|
+
--!nolint LocalShadow
|
|
4
|
+
local task = nil -- Disable usage of Roblox's task scheduler
|
|
5
|
+
|
|
6
|
+
--[[
|
|
7
|
+
A variant of xpcall() designed for inline usage, letting you define fallback
|
|
8
|
+
values based on caught errors.
|
|
9
|
+
]]
|
|
10
|
+
|
|
11
|
+
local Package = script.Parent.Parent
|
|
12
|
+
|
|
13
|
+
local function Safe<Success, Fail>(
|
|
14
|
+
callbacks: {
|
|
15
|
+
try: () -> Success,
|
|
16
|
+
fallback: (err: unknown) -> Fail
|
|
17
|
+
}
|
|
18
|
+
): Success | Fail
|
|
19
|
+
local _, value = xpcall(callbacks.try, callbacks.fallback)
|
|
20
|
+
return value
|
|
21
|
+
end
|
|
22
|
+
|
|
23
23
|
return Safe
|
|
@@ -1,29 +1,29 @@
|
|
|
1
|
-
--!strict
|
|
2
|
-
--!nolint LocalUnused
|
|
3
|
-
--!nolint LocalShadow
|
|
4
|
-
local task = nil -- Disable usage of Roblox's task scheduler
|
|
5
|
-
|
|
6
|
-
--[[
|
|
7
|
-
Implements the 'similarity test' used to determine whether two values have
|
|
8
|
-
a meaningful difference.
|
|
9
|
-
|
|
10
|
-
https://elttob.uk/Fusion/0.3/tutorials/best-practices/optimisation/#similarity
|
|
11
|
-
]]
|
|
12
|
-
|
|
13
|
-
local function isSimilar(
|
|
14
|
-
a: unknown,
|
|
15
|
-
b: unknown
|
|
16
|
-
): boolean
|
|
17
|
-
local typeA = typeof(a)
|
|
18
|
-
local isTable = typeA == "table"
|
|
19
|
-
local isUserdata = typeA == "userdata"
|
|
20
|
-
return
|
|
21
|
-
if not (isTable or isUserdata) then
|
|
22
|
-
a == b or a ~= a and b ~= b
|
|
23
|
-
elseif typeA == typeof(b) and (isUserdata or table.isfrozen(a :: any) or getmetatable(a :: any) ~= nil) then
|
|
24
|
-
a == b
|
|
25
|
-
else
|
|
26
|
-
false
|
|
27
|
-
end
|
|
28
|
-
|
|
29
|
-
return isSimilar
|
|
1
|
+
--!strict
|
|
2
|
+
--!nolint LocalUnused
|
|
3
|
+
--!nolint LocalShadow
|
|
4
|
+
local task = nil -- Disable usage of Roblox's task scheduler
|
|
5
|
+
|
|
6
|
+
--[[
|
|
7
|
+
Implements the 'similarity test' used to determine whether two values have
|
|
8
|
+
a meaningful difference.
|
|
9
|
+
|
|
10
|
+
https://elttob.uk/Fusion/0.3/tutorials/best-practices/optimisation/#similarity
|
|
11
|
+
]]
|
|
12
|
+
|
|
13
|
+
local function isSimilar(
|
|
14
|
+
a: unknown,
|
|
15
|
+
b: unknown
|
|
16
|
+
): boolean
|
|
17
|
+
local typeA = typeof(a)
|
|
18
|
+
local isTable = typeA == "table"
|
|
19
|
+
local isUserdata = typeA == "userdata"
|
|
20
|
+
return
|
|
21
|
+
if not (isTable or isUserdata) then
|
|
22
|
+
a == b or a ~= a and b ~= b
|
|
23
|
+
elseif typeA == typeof(b) and (isUserdata or table.isfrozen(a :: any) or getmetatable(a :: any) ~= nil) then
|
|
24
|
+
a == b
|
|
25
|
+
else
|
|
26
|
+
false
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
return isSimilar
|
|
@@ -1,35 +1,35 @@
|
|
|
1
|
-
--!strict
|
|
2
|
-
--!nolint LocalUnused
|
|
3
|
-
--!nolint LocalShadow
|
|
4
|
-
local task = nil -- Disable usage of Roblox's task scheduler
|
|
5
|
-
|
|
6
|
-
--[[
|
|
7
|
-
Attempts to merge a variadic number of tables together.
|
|
8
|
-
]]
|
|
9
|
-
|
|
10
|
-
local Package = script.Parent.Parent
|
|
11
|
-
local External = require(Package.External)
|
|
12
|
-
|
|
13
|
-
local function merge(
|
|
14
|
-
overwrite: boolean,
|
|
15
|
-
into: {[unknown]: unknown},
|
|
16
|
-
...: {[unknown]: unknown}
|
|
17
|
-
): {[unknown]: unknown}
|
|
18
|
-
local fromTables = {...}
|
|
19
|
-
if #fromTables < 1 then
|
|
20
|
-
return into
|
|
21
|
-
else
|
|
22
|
-
for _, fromTable in fromTables do
|
|
23
|
-
for key, value in fromTable do
|
|
24
|
-
if into[key] == nil then
|
|
25
|
-
into[key] = value
|
|
26
|
-
elseif not overwrite then
|
|
27
|
-
External.logError("mergeConflict", nil, tostring(key))
|
|
28
|
-
end
|
|
29
|
-
end
|
|
30
|
-
end
|
|
31
|
-
return into
|
|
32
|
-
end
|
|
33
|
-
end
|
|
34
|
-
|
|
35
|
-
return merge
|
|
1
|
+
--!strict
|
|
2
|
+
--!nolint LocalUnused
|
|
3
|
+
--!nolint LocalShadow
|
|
4
|
+
local task = nil -- Disable usage of Roblox's task scheduler
|
|
5
|
+
|
|
6
|
+
--[[
|
|
7
|
+
Attempts to merge a variadic number of tables together.
|
|
8
|
+
]]
|
|
9
|
+
|
|
10
|
+
local Package = script.Parent.Parent
|
|
11
|
+
local External = require(Package.External)
|
|
12
|
+
|
|
13
|
+
local function merge(
|
|
14
|
+
overwrite: boolean,
|
|
15
|
+
into: {[unknown]: unknown},
|
|
16
|
+
...: {[unknown]: unknown}
|
|
17
|
+
): {[unknown]: unknown}
|
|
18
|
+
local fromTables = {...}
|
|
19
|
+
if #fromTables < 1 then
|
|
20
|
+
return into
|
|
21
|
+
else
|
|
22
|
+
for _, fromTable in fromTables do
|
|
23
|
+
for key, value in fromTable do
|
|
24
|
+
if into[key] == nil then
|
|
25
|
+
into[key] = value
|
|
26
|
+
elseif not overwrite then
|
|
27
|
+
External.logError("mergeConflict", nil, tostring(key))
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
return into
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
return merge
|
|
@@ -1,35 +1,35 @@
|
|
|
1
|
-
--!strict
|
|
2
|
-
--!nolint LocalUnused
|
|
3
|
-
--!nolint LocalShadow
|
|
4
|
-
local task = nil -- Disable usage of Roblox's task scheduler
|
|
5
|
-
|
|
6
|
-
--[[
|
|
7
|
-
Returns the most specific custom name for the given object.
|
|
8
|
-
]]
|
|
9
|
-
|
|
10
|
-
local Package = script.Parent.Parent
|
|
11
|
-
-- Utility
|
|
12
|
-
local nicknames = require(Package.Utility.nicknames)
|
|
13
|
-
|
|
14
|
-
local function nameOf(
|
|
15
|
-
x: unknown,
|
|
16
|
-
defaultName: string
|
|
17
|
-
): string
|
|
18
|
-
local nickname = nicknames[x]
|
|
19
|
-
if typeof(nickname) == "string" then
|
|
20
|
-
return nickname
|
|
21
|
-
end
|
|
22
|
-
if typeof(x) == "table" then
|
|
23
|
-
local x = x :: {[any]: any}
|
|
24
|
-
if typeof(x.name) == "string" then
|
|
25
|
-
return x.name
|
|
26
|
-
elseif typeof(x.kind) == "string" then
|
|
27
|
-
return x.kind
|
|
28
|
-
elseif typeof(x.type) == "string" then
|
|
29
|
-
return x.type
|
|
30
|
-
end
|
|
31
|
-
end
|
|
32
|
-
return defaultName
|
|
33
|
-
end
|
|
34
|
-
|
|
1
|
+
--!strict
|
|
2
|
+
--!nolint LocalUnused
|
|
3
|
+
--!nolint LocalShadow
|
|
4
|
+
local task = nil -- Disable usage of Roblox's task scheduler
|
|
5
|
+
|
|
6
|
+
--[[
|
|
7
|
+
Returns the most specific custom name for the given object.
|
|
8
|
+
]]
|
|
9
|
+
|
|
10
|
+
local Package = script.Parent.Parent
|
|
11
|
+
-- Utility
|
|
12
|
+
local nicknames = require(Package.Utility.nicknames)
|
|
13
|
+
|
|
14
|
+
local function nameOf(
|
|
15
|
+
x: unknown,
|
|
16
|
+
defaultName: string
|
|
17
|
+
): string
|
|
18
|
+
local nickname = nicknames[x]
|
|
19
|
+
if typeof(nickname) == "string" then
|
|
20
|
+
return nickname
|
|
21
|
+
end
|
|
22
|
+
if typeof(x) == "table" then
|
|
23
|
+
local x = x :: {[any]: any}
|
|
24
|
+
if typeof(x.name) == "string" then
|
|
25
|
+
return x.name
|
|
26
|
+
elseif typeof(x.kind) == "string" then
|
|
27
|
+
return x.kind
|
|
28
|
+
elseif typeof(x.type) == "string" then
|
|
29
|
+
return x.type
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
return defaultName
|
|
33
|
+
end
|
|
34
|
+
|
|
35
35
|
return nameOf
|
|
@@ -1,14 +1,14 @@
|
|
|
1
|
-
--!strict
|
|
2
|
-
--!nolint LocalUnused
|
|
3
|
-
--!nolint LocalShadow
|
|
4
|
-
local task = nil -- Disable usage of Roblox's task scheduler
|
|
5
|
-
|
|
6
|
-
--[[
|
|
7
|
-
Never returns.
|
|
8
|
-
]]
|
|
9
|
-
|
|
10
|
-
local function never(): never
|
|
11
|
-
error("This codepath should not be reachable")
|
|
12
|
-
end
|
|
13
|
-
|
|
1
|
+
--!strict
|
|
2
|
+
--!nolint LocalUnused
|
|
3
|
+
--!nolint LocalShadow
|
|
4
|
+
local task = nil -- Disable usage of Roblox's task scheduler
|
|
5
|
+
|
|
6
|
+
--[[
|
|
7
|
+
Never returns.
|
|
8
|
+
]]
|
|
9
|
+
|
|
10
|
+
local function never(): never
|
|
11
|
+
error("This codepath should not be reachable")
|
|
12
|
+
end
|
|
13
|
+
|
|
14
14
|
return never
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
--!strict
|
|
2
|
-
--!nolint LocalUnused
|
|
3
|
-
--!nolint LocalShadow
|
|
4
|
-
local task = nil -- Disable usage of Roblox's task scheduler
|
|
5
|
-
|
|
6
|
-
--[[
|
|
7
|
-
Stores nicknames for values that don't support metatables, so that `nameOf`
|
|
8
|
-
can return values for them.
|
|
9
|
-
]]
|
|
10
|
-
|
|
1
|
+
--!strict
|
|
2
|
+
--!nolint LocalUnused
|
|
3
|
+
--!nolint LocalShadow
|
|
4
|
+
local task = nil -- Disable usage of Roblox's task scheduler
|
|
5
|
+
|
|
6
|
+
--[[
|
|
7
|
+
Stores nicknames for values that don't support metatables, so that `nameOf`
|
|
8
|
+
can return values for them.
|
|
9
|
+
]]
|
|
10
|
+
|
|
11
11
|
return setmetatable({}, {__mode = "k"})
|
|
@@ -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
|
-
Extended typeof, designed for identifying custom objects.
|
|
8
|
-
If given a table with a `type` string, returns that.
|
|
9
|
-
Otherwise, returns `typeof()` the argument.
|
|
10
|
-
]]
|
|
11
|
-
|
|
12
|
-
local function xtypeof(
|
|
13
|
-
x: unknown
|
|
14
|
-
): string
|
|
15
|
-
local typeString = typeof(x)
|
|
16
|
-
|
|
17
|
-
if typeString == "table" then
|
|
18
|
-
local x = x :: {type: unknown?}
|
|
19
|
-
if typeof(x.type) == "string" then
|
|
20
|
-
return x.type
|
|
21
|
-
end
|
|
22
|
-
end
|
|
23
|
-
|
|
24
|
-
return typeString
|
|
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
|
+
Extended typeof, designed for identifying custom objects.
|
|
8
|
+
If given a table with a `type` string, returns that.
|
|
9
|
+
Otherwise, returns `typeof()` the argument.
|
|
10
|
+
]]
|
|
11
|
+
|
|
12
|
+
local function xtypeof(
|
|
13
|
+
x: unknown
|
|
14
|
+
): string
|
|
15
|
+
local typeString = typeof(x)
|
|
16
|
+
|
|
17
|
+
if typeString == "table" then
|
|
18
|
+
local x = x :: {type: unknown?}
|
|
19
|
+
if typeof(x.type) == "string" then
|
|
20
|
+
return x.type
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
return typeString
|
|
25
|
+
end
|
|
26
|
+
|
|
27
27
|
return xtypeof
|