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.
Files changed (246) hide show
  1. package/README.md +112 -122
  2. package/commands/setup-game.md +108 -108
  3. package/commands/sync-check.md +53 -53
  4. package/core/roblox-core.md +93 -93
  5. package/dist/server.js +189 -167
  6. package/package.json +35 -35
  7. package/skills/roblox-analytics/SKILL.md +277 -277
  8. package/skills/roblox-analytics/references/event-batcher.luau +75 -75
  9. package/skills/roblox-animation-vfx/SKILL.md +1325 -1325
  10. package/skills/roblox-architecture/SKILL.md +863 -863
  11. package/skills/roblox-architecture/references/combat-systems.md +1381 -1381
  12. package/skills/roblox-code-review/SKILL.md +686 -686
  13. package/skills/roblox-data/SKILL.md +889 -889
  14. package/skills/roblox-data/references/inventory-systems.md +1729 -1729
  15. package/skills/roblox-debug/SKILL.md +98 -98
  16. package/skills/roblox-gui/SKILL.md +1103 -1103
  17. package/skills/roblox-gui-fusion/SKILL.md +150 -150
  18. package/skills/roblox-gui-fusion/references/inventory.luau +427 -427
  19. package/skills/roblox-gui-fusion/references/settings-menu.luau +579 -579
  20. package/skills/roblox-gui-fusion/references/shop.luau +411 -411
  21. package/skills/roblox-luau-mastery/SKILL.md +1519 -1519
  22. package/skills/roblox-monetization/SKILL.md +1084 -1084
  23. package/skills/roblox-monetization/references/process-receipt.luau +131 -131
  24. package/skills/roblox-networking/SKILL.md +669 -669
  25. package/skills/roblox-networking/references/remote-validator.luau +193 -193
  26. package/skills/roblox-publish-checklist/SKILL.md +127 -127
  27. package/skills/roblox-runtime/SKILL.md +753 -753
  28. package/skills/roblox-sharp-edges/SKILL.md +294 -294
  29. package/skills/roblox-sync/SKILL.md +126 -126
  30. package/skills/roblox-testing/SKILL.md +943 -943
  31. package/skills/roblox-tooling/SKILL.md +149 -149
  32. package/vendor/LICENSES/ProfileStore-LICENSE +201 -201
  33. package/vendor/LICENSES/RbxUtil-LICENSE +7 -7
  34. package/vendor/LICENSES/promise-LICENSE +20 -20
  35. package/vendor/LICENSES/t-LICENSE +21 -21
  36. package/vendor/LICENSES/testez-LICENSE +200 -200
  37. package/vendor/README.md +83 -83
  38. package/vendor/fusion/Animation/ExternalTime.luau +83 -83
  39. package/vendor/fusion/Animation/Spring.luau +321 -321
  40. package/vendor/fusion/Animation/Stopwatch.luau +127 -127
  41. package/vendor/fusion/Animation/Tween.luau +187 -187
  42. package/vendor/fusion/Animation/getTweenDuration.luau +27 -27
  43. package/vendor/fusion/Animation/getTweenRatio.luau +47 -47
  44. package/vendor/fusion/Animation/lerpType.luau +163 -163
  45. package/vendor/fusion/Animation/packType.luau +99 -99
  46. package/vendor/fusion/Animation/springCoefficients.luau +80 -80
  47. package/vendor/fusion/Animation/unpackType.luau +102 -102
  48. package/vendor/fusion/Colour/Oklab.luau +70 -70
  49. package/vendor/fusion/Colour/sRGB.luau +54 -54
  50. package/vendor/fusion/External.luau +167 -167
  51. package/vendor/fusion/ExternalDebug.luau +69 -69
  52. package/vendor/fusion/Graph/Observer.luau +113 -113
  53. package/vendor/fusion/Graph/castToGraph.luau +28 -28
  54. package/vendor/fusion/Graph/change.luau +80 -80
  55. package/vendor/fusion/Graph/depend.luau +32 -32
  56. package/vendor/fusion/Graph/evaluate.luau +55 -55
  57. package/vendor/fusion/Instances/Attribute.luau +57 -57
  58. package/vendor/fusion/Instances/AttributeChange.luau +46 -46
  59. package/vendor/fusion/Instances/AttributeOut.luau +63 -63
  60. package/vendor/fusion/Instances/Child.luau +21 -21
  61. package/vendor/fusion/Instances/Children.luau +147 -147
  62. package/vendor/fusion/Instances/Hydrate.luau +32 -32
  63. package/vendor/fusion/Instances/New.luau +52 -52
  64. package/vendor/fusion/Instances/OnChange.luau +49 -49
  65. package/vendor/fusion/Instances/OnEvent.luau +53 -53
  66. package/vendor/fusion/Instances/Out.luau +69 -69
  67. package/vendor/fusion/Instances/applyInstanceProps.luau +148 -148
  68. package/vendor/fusion/Instances/defaultProps.luau +194 -194
  69. package/vendor/fusion/LICENSE +21 -21
  70. package/vendor/fusion/Logging/formatError.luau +48 -48
  71. package/vendor/fusion/Logging/messages.luau +51 -51
  72. package/vendor/fusion/Logging/parseError.luau +24 -24
  73. package/vendor/fusion/Memory/checkLifetime.luau +133 -133
  74. package/vendor/fusion/Memory/deriveScope.luau +23 -23
  75. package/vendor/fusion/Memory/deriveScopeImpl.luau +44 -44
  76. package/vendor/fusion/Memory/doCleanup.luau +78 -78
  77. package/vendor/fusion/Memory/innerScope.luau +33 -33
  78. package/vendor/fusion/Memory/legacyCleanup.luau +17 -17
  79. package/vendor/fusion/Memory/needsDestruction.luau +16 -16
  80. package/vendor/fusion/Memory/poisonScope.luau +33 -33
  81. package/vendor/fusion/Memory/scopePool.luau +54 -54
  82. package/vendor/fusion/Memory/scoped.luau +26 -26
  83. package/vendor/fusion/Memory/whichLivesLonger.luau +74 -74
  84. package/vendor/fusion/RobloxExternal.luau +97 -97
  85. package/vendor/fusion/State/Computed.luau +138 -138
  86. package/vendor/fusion/State/For/Disassembly.luau +210 -210
  87. package/vendor/fusion/State/For/ForTypes.luau +30 -30
  88. package/vendor/fusion/State/For/init.luau +109 -109
  89. package/vendor/fusion/State/ForKeys.luau +93 -93
  90. package/vendor/fusion/State/ForPairs.luau +96 -96
  91. package/vendor/fusion/State/ForValues.luau +93 -93
  92. package/vendor/fusion/State/Value.luau +87 -87
  93. package/vendor/fusion/State/castToState.luau +25 -25
  94. package/vendor/fusion/State/peek.luau +30 -30
  95. package/vendor/fusion/Types.luau +314 -314
  96. package/vendor/fusion/Utility/Contextual.luau +90 -90
  97. package/vendor/fusion/Utility/Safe.luau +22 -22
  98. package/vendor/fusion/Utility/isSimilar.luau +29 -29
  99. package/vendor/fusion/Utility/merge.luau +35 -35
  100. package/vendor/fusion/Utility/nameOf.luau +34 -34
  101. package/vendor/fusion/Utility/never.luau +13 -13
  102. package/vendor/fusion/Utility/nicknames.luau +10 -10
  103. package/vendor/fusion/Utility/xtypeof.luau +26 -26
  104. package/vendor/fusion/init.luau +82 -82
  105. package/vendor/profilestore/init.luau +2242 -2242
  106. package/vendor/promise/init.luau +1982 -1982
  107. package/vendor/rbxutil/buffer-util/Buffer.test.luau +25 -25
  108. package/vendor/rbxutil/buffer-util/BufferReader.luau +228 -228
  109. package/vendor/rbxutil/buffer-util/BufferWriter.luau +269 -269
  110. package/vendor/rbxutil/buffer-util/DataTypeBuffer.luau +223 -223
  111. package/vendor/rbxutil/buffer-util/Types.luau +60 -60
  112. package/vendor/rbxutil/buffer-util/index.d.ts +153 -153
  113. package/vendor/rbxutil/buffer-util/init.luau +41 -41
  114. package/vendor/rbxutil/buffer-util/package.json +16 -16
  115. package/vendor/rbxutil/buffer-util/wally.toml +9 -9
  116. package/vendor/rbxutil/comm/Client/ClientComm.luau +232 -232
  117. package/vendor/rbxutil/comm/Client/ClientRemoteProperty.luau +156 -156
  118. package/vendor/rbxutil/comm/Client/ClientRemoteSignal.luau +109 -109
  119. package/vendor/rbxutil/comm/Client/init.luau +135 -135
  120. package/vendor/rbxutil/comm/Server/RemoteProperty.luau +295 -295
  121. package/vendor/rbxutil/comm/Server/RemoteSignal.luau +211 -211
  122. package/vendor/rbxutil/comm/Server/ServerComm.luau +211 -211
  123. package/vendor/rbxutil/comm/Server/init.luau +140 -140
  124. package/vendor/rbxutil/comm/Types.luau +18 -18
  125. package/vendor/rbxutil/comm/Util.luau +27 -27
  126. package/vendor/rbxutil/comm/init.luau +35 -35
  127. package/vendor/rbxutil/comm/wally.toml +13 -13
  128. package/vendor/rbxutil/component/init.luau +759 -759
  129. package/vendor/rbxutil/component/init.test.luau +311 -311
  130. package/vendor/rbxutil/component/wally.toml +14 -14
  131. package/vendor/rbxutil/concur/init.luau +542 -542
  132. package/vendor/rbxutil/concur/init.test.luau +364 -364
  133. package/vendor/rbxutil/concur/wally.toml +8 -8
  134. package/vendor/rbxutil/enum-list/init.luau +101 -101
  135. package/vendor/rbxutil/enum-list/init.test.luau +91 -91
  136. package/vendor/rbxutil/enum-list/wally.toml +8 -8
  137. package/vendor/rbxutil/find/index.d.ts +20 -20
  138. package/vendor/rbxutil/find/init.luau +44 -44
  139. package/vendor/rbxutil/find/package.json +17 -17
  140. package/vendor/rbxutil/find/wally.toml +8 -8
  141. package/vendor/rbxutil/input/Gamepad.luau +559 -559
  142. package/vendor/rbxutil/input/Keyboard.luau +124 -124
  143. package/vendor/rbxutil/input/Mouse.luau +278 -278
  144. package/vendor/rbxutil/input/PreferredInput.luau +91 -91
  145. package/vendor/rbxutil/input/Touch.luau +120 -120
  146. package/vendor/rbxutil/input/init.luau +33 -33
  147. package/vendor/rbxutil/input/wally.toml +12 -12
  148. package/vendor/rbxutil/loader/index.d.ts +15 -15
  149. package/vendor/rbxutil/loader/init.luau +137 -137
  150. package/vendor/rbxutil/loader/wally.toml +8 -8
  151. package/vendor/rbxutil/log/index.d.ts +38 -38
  152. package/vendor/rbxutil/log/init.luau +746 -746
  153. package/vendor/rbxutil/log/wally.toml +8 -8
  154. package/vendor/rbxutil/net/init.luau +190 -190
  155. package/vendor/rbxutil/net/wally.toml +8 -8
  156. package/vendor/rbxutil/option/index.d.ts +44 -44
  157. package/vendor/rbxutil/option/init.luau +489 -489
  158. package/vendor/rbxutil/option/init.test.luau +342 -342
  159. package/vendor/rbxutil/option/wally.toml +8 -8
  160. package/vendor/rbxutil/pid/index.d.ts +53 -53
  161. package/vendor/rbxutil/pid/init.luau +195 -195
  162. package/vendor/rbxutil/pid/package.json +16 -16
  163. package/vendor/rbxutil/pid/wally.toml +9 -9
  164. package/vendor/rbxutil/quaternion/index.d.ts +117 -117
  165. package/vendor/rbxutil/quaternion/init.luau +570 -570
  166. package/vendor/rbxutil/quaternion/package.json +16 -16
  167. package/vendor/rbxutil/quaternion/wally.toml +9 -9
  168. package/vendor/rbxutil/query/index.d.ts +43 -43
  169. package/vendor/rbxutil/query/init.luau +117 -117
  170. package/vendor/rbxutil/query/package.json +18 -18
  171. package/vendor/rbxutil/query/wally.toml +9 -9
  172. package/vendor/rbxutil/sequent/index.d.ts +28 -28
  173. package/vendor/rbxutil/sequent/init.luau +340 -340
  174. package/vendor/rbxutil/sequent/package.json +16 -16
  175. package/vendor/rbxutil/sequent/wally.toml +9 -9
  176. package/vendor/rbxutil/ser/init.luau +175 -175
  177. package/vendor/rbxutil/ser/init.test.luau +50 -50
  178. package/vendor/rbxutil/ser/wally.toml +11 -11
  179. package/vendor/rbxutil/shake/index.d.ts +36 -36
  180. package/vendor/rbxutil/shake/init.luau +532 -532
  181. package/vendor/rbxutil/shake/init.test.luau +267 -267
  182. package/vendor/rbxutil/shake/package.json +16 -16
  183. package/vendor/rbxutil/shake/wally.toml +9 -9
  184. package/vendor/rbxutil/signal/index.d.ts +100 -100
  185. package/vendor/rbxutil/signal/init.luau +432 -432
  186. package/vendor/rbxutil/signal/init.test.luau +190 -190
  187. package/vendor/rbxutil/signal/package.json +17 -17
  188. package/vendor/rbxutil/signal/wally.toml +9 -9
  189. package/vendor/rbxutil/silo/TableWatcher.luau +65 -65
  190. package/vendor/rbxutil/silo/Util.luau +55 -55
  191. package/vendor/rbxutil/silo/init.luau +338 -338
  192. package/vendor/rbxutil/silo/init.test.luau +215 -215
  193. package/vendor/rbxutil/silo/wally.toml +8 -8
  194. package/vendor/rbxutil/spring/index.d.ts +40 -40
  195. package/vendor/rbxutil/spring/init.luau +97 -97
  196. package/vendor/rbxutil/spring/package.json +17 -17
  197. package/vendor/rbxutil/spring/wally.toml +8 -8
  198. package/vendor/rbxutil/stream/index.d.ts +88 -88
  199. package/vendor/rbxutil/stream/init.luau +597 -597
  200. package/vendor/rbxutil/stream/package.json +18 -18
  201. package/vendor/rbxutil/stream/wally.toml +9 -9
  202. package/vendor/rbxutil/streamable/Streamable.luau +202 -202
  203. package/vendor/rbxutil/streamable/StreamableUtil.luau +80 -80
  204. package/vendor/rbxutil/streamable/init.luau +8 -8
  205. package/vendor/rbxutil/streamable/wally.toml +12 -12
  206. package/vendor/rbxutil/symbol/init.luau +56 -56
  207. package/vendor/rbxutil/symbol/init.test.luau +37 -37
  208. package/vendor/rbxutil/symbol/wally.toml +8 -8
  209. package/vendor/rbxutil/table-util/init.luau +938 -938
  210. package/vendor/rbxutil/table-util/init.test.luau +439 -439
  211. package/vendor/rbxutil/task-queue/index.d.ts +27 -27
  212. package/vendor/rbxutil/task-queue/init.luau +97 -97
  213. package/vendor/rbxutil/task-queue/wally.toml +8 -8
  214. package/vendor/rbxutil/timer/index.d.ts +81 -81
  215. package/vendor/rbxutil/timer/init.luau +249 -249
  216. package/vendor/rbxutil/timer/init.test.luau +73 -73
  217. package/vendor/rbxutil/timer/wally.toml +11 -11
  218. package/vendor/rbxutil/tree/index.d.ts +15 -15
  219. package/vendor/rbxutil/tree/init.luau +137 -137
  220. package/vendor/rbxutil/tree/wally.toml +8 -8
  221. package/vendor/rbxutil/trove/index.d.ts +46 -46
  222. package/vendor/rbxutil/trove/init.luau +787 -787
  223. package/vendor/rbxutil/trove/init.test.luau +203 -203
  224. package/vendor/rbxutil/trove/wally.toml +8 -8
  225. package/vendor/rbxutil/typed-remote/init.luau +196 -196
  226. package/vendor/rbxutil/typed-remote/wally.toml +8 -8
  227. package/vendor/rbxutil/wait-for/index.d.ts +17 -17
  228. package/vendor/rbxutil/wait-for/init.luau +257 -257
  229. package/vendor/rbxutil/wait-for/init.test.luau +182 -182
  230. package/vendor/rbxutil/wait-for/wally.toml +11 -11
  231. package/vendor/t/t.lua +1350 -1350
  232. package/vendor/testez/Context.lua +26 -26
  233. package/vendor/testez/Expectation.lua +311 -311
  234. package/vendor/testez/ExpectationContext.lua +38 -38
  235. package/vendor/testez/LifecycleHooks.lua +89 -89
  236. package/vendor/testez/Reporters/TeamCityReporter.lua +101 -101
  237. package/vendor/testez/Reporters/TextReporter.lua +105 -105
  238. package/vendor/testez/Reporters/TextReporterQuiet.lua +96 -96
  239. package/vendor/testez/TestBootstrap.lua +146 -146
  240. package/vendor/testez/TestEnum.lua +27 -27
  241. package/vendor/testez/TestPlan.lua +304 -304
  242. package/vendor/testez/TestPlanner.lua +39 -39
  243. package/vendor/testez/TestResults.lua +111 -111
  244. package/vendor/testez/TestRunner.lua +188 -188
  245. package/vendor/testez/TestSession.lua +243 -243
  246. 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