@quenty/tie 10.6.0 → 10.7.0

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 (38) hide show
  1. package/CHANGELOG.md +19 -0
  2. package/README.md +4 -0
  3. package/package.json +16 -15
  4. package/src/Shared/Members/Methods/TieMethodDefinition.lua +44 -0
  5. package/src/Shared/{Implementation → Members/Methods}/TieMethodImplementation.lua +4 -5
  6. package/src/Shared/Members/Methods/TieMethodInterfaceUtils.lua +58 -0
  7. package/src/Shared/{Interface → Members/Properties}/TiePropertyChangedSignalConnection.lua +1 -1
  8. package/src/Shared/Members/Properties/TiePropertyDefinition.lua +58 -0
  9. package/src/Shared/{Interface → Members/Properties}/TiePropertyInterface.lua +42 -59
  10. package/src/Shared/Members/Signals/TieSignalConnection.lua +63 -0
  11. package/src/Shared/Members/Signals/TieSignalDefinition.lua +38 -0
  12. package/src/Shared/{Implementation → Members/Signals}/TieSignalImplementation.lua +29 -15
  13. package/src/Shared/Members/Signals/TieSignalInterface.lua +90 -0
  14. package/src/Shared/Members/TieMemberDefinition.lua +104 -0
  15. package/src/Shared/Members/TieMemberInterface.lua +94 -0
  16. package/src/Shared/Realms/TieRealmUtils.lua +41 -0
  17. package/src/Shared/{Definition/Types → Realms}/TieRealms.lua +3 -4
  18. package/src/Shared/Services/TieRealmService.lua +31 -0
  19. package/src/Shared/TieDefinition.lua +708 -0
  20. package/src/Shared/TieImplementation.lua +167 -0
  21. package/src/Shared/TieInterface.lua +129 -0
  22. package/src/Shared/{Encoding → Utils}/TieUtils.lua +4 -1
  23. package/test/modules/Server/Action/Action.lua +4 -7
  24. package/test/modules/Server/Door.lua +5 -10
  25. package/test/scripts/Server/ServerMain.server.lua +3 -3
  26. package/src/Shared/Definition/TieDefinition.lua +0 -507
  27. package/src/Shared/Definition/TieMethodDefinition.lua +0 -61
  28. package/src/Shared/Definition/TiePropertyDefinition.lua +0 -64
  29. package/src/Shared/Definition/TieSignalDefinition.lua +0 -59
  30. package/src/Shared/Definition/Types/TieRealmUtils.lua +0 -60
  31. package/src/Shared/Implementation/TieImplementation.lua +0 -129
  32. package/src/Shared/Interface/TieInterface.lua +0 -122
  33. package/src/Shared/Interface/TieInterfaceUtils.lua +0 -70
  34. package/src/Shared/Interface/TieMethodInterfaceUtils.lua +0 -43
  35. package/src/Shared/Interface/TieSignalConnection.lua +0 -89
  36. package/src/Shared/Interface/TieSignalInterface.lua +0 -61
  37. /package/src/Shared/{Implementation → Members/Properties}/TiePropertyImplementation.lua +0 -0
  38. /package/src/Shared/{Implementation → Members/Properties}/TiePropertyImplementationUtils.lua +0 -0
@@ -1,507 +0,0 @@
1
- --[=[
2
- @class TieDefinition
3
- ]=]
4
-
5
- local require = require(script.Parent.loader).load(script)
6
-
7
- local RunService = game:GetService("RunService")
8
-
9
- local Brio = require("Brio")
10
- local Maid = require("Maid")
11
- local Observable = require("Observable")
12
- local Rx = require("Rx")
13
- local RxBrioUtils = require("RxBrioUtils")
14
- local RxCollectionServiceUtils = require("RxCollectionServiceUtils")
15
- local RxInstanceUtils = require("RxInstanceUtils")
16
- local RxStateStackUtils = require("RxStateStackUtils")
17
- local String = require("String")
18
- local Symbol = require("Symbol")
19
- local Table = require("Table")
20
- local TieImplementation = require("TieImplementation")
21
- local TieInterface = require("TieInterface")
22
- local TieMethodDefinition = require("TieMethodDefinition")
23
- local TiePropertyDefinition = require("TiePropertyDefinition")
24
- local TieRealms = require("TieRealms")
25
- local TieSignalDefinition = require("TieSignalDefinition")
26
- local ValueObject = require("ValueObject")
27
-
28
- local UNSET_VALUE = Symbol.named("unsetValue")
29
-
30
- local TieDefinition = {}
31
- TieDefinition.ClassName = "TieDefinition"
32
- TieDefinition.__index = TieDefinition
33
-
34
- TieDefinition.Types = Table.readonly({
35
- METHOD = Symbol.named("method");
36
- SIGNAL = Symbol.named("signal");
37
- PROPERTY = Symbol.named("property"); -- will default to nil
38
- })
39
-
40
- TieDefinition.Realms = TieRealms
41
-
42
- function TieDefinition.new(definitionName, members, isSharedDefinition)
43
- local self = setmetatable({}, TieDefinition)
44
-
45
- self._definitionName = assert(definitionName, "No definitionName")
46
- self._memberMap = {}
47
-
48
- self._isSharedDefinition = isSharedDefinition
49
-
50
- self:_addMembers(members, TieDefinition.Realms.SHARED)
51
-
52
- return self
53
- end
54
-
55
- function TieDefinition:_addMembers(members, realm)
56
- for memberName, memberTypeOrDefaultValue in pairs(members) do
57
- if memberName == TieRealms.CLIENT then
58
- self:_addMembers(memberTypeOrDefaultValue, TieRealms.CLIENT)
59
- elseif memberName == TieRealms.SERVER then
60
- self:_addMembers(memberTypeOrDefaultValue, TieRealms.SERVER)
61
- else
62
- assert(type(memberName) == "string", "Bad memberName")
63
-
64
- self:_addMember(memberName, memberTypeOrDefaultValue, realm)
65
- end
66
- end
67
- end
68
-
69
- function TieDefinition:_addMember(memberName, memberTypeOrDefaultValue, realm)
70
- if memberTypeOrDefaultValue == TieDefinition.Types.METHOD then
71
- self._memberMap[memberName] = TieMethodDefinition.new(self, memberName, realm)
72
- elseif memberTypeOrDefaultValue == TieDefinition.Types.SIGNAL then
73
- self._memberMap[memberName] = TieSignalDefinition.new(self, memberName, realm)
74
- elseif memberTypeOrDefaultValue == TieDefinition.Types.PROPERTY then
75
- self._memberMap[memberName] = TiePropertyDefinition.new(self, memberName, nil, realm)
76
- else
77
- self._memberMap[memberName] = TiePropertyDefinition.new(self, memberName, memberTypeOrDefaultValue, realm)
78
- end
79
- end
80
-
81
- --[=[
82
- Gets all valid interfaces for this adornee
83
- @param adornee Instance
84
- @return { TieInterface }
85
- ]=]
86
- function TieDefinition:GetImplementations(adornee: Instance)
87
- assert(typeof(adornee) == "Instance", "Bad adornee")
88
-
89
- local implementations = {}
90
-
91
- local containerName = self:GetContainerName()
92
- for _, item in pairs(adornee:GetChildren()) do
93
- if item.Name == containerName then
94
- if self:IsImplementation(item) then
95
- table.insert(implementations, TieInterface.new(self, item, nil))
96
- end
97
- end
98
- end
99
-
100
- return implementations
101
- end
102
-
103
- --[=[
104
- Observes all the children implementations for this adornee
105
-
106
- @param adornee Instance
107
- @return Observable<Brio<TieInterface>>
108
- ]=]
109
- function TieDefinition:ObserveChildrenBrio(adornee: Instance)
110
- return RxInstanceUtils.observeChildrenBrio(adornee):Pipe({
111
- RxBrioUtils.flatMapBrio(function(child)
112
- return self:ObserveBrio(child)
113
- end)
114
- })
115
- end
116
-
117
- --[=[
118
- Promises the implementation
119
-
120
- @param adornee Adornee
121
- @return Promise<TieInterface>
122
- ]=]
123
- function TieDefinition:Promise(adornee)
124
- assert(typeof(adornee) == "Instance", "Bad adornee")
125
-
126
- -- TODO: Support cancellation cleanup here.
127
-
128
- return Rx.toPromise(self:Observe(adornee):Pipe({
129
- Rx.where(function(value)
130
- return value ~= nil
131
- end)
132
- }))
133
- end
134
-
135
- --[=[
136
- Gets all valid interfaces for this adornee's children
137
-
138
- @param adornee Instance
139
- @return { TieInterface }
140
- ]=]
141
- function TieDefinition:GetChildren(adornee: Instance)
142
- assert(typeof(adornee) == "Instance", "Bad adornee")
143
-
144
- local implementations = {}
145
-
146
- -- TODO: Make this faster
147
- for _, item in pairs(adornee:GetChildren()) do
148
- for _, option in pairs(self:GetImplementations(item)) do
149
- table.insert(implementations, option)
150
- end
151
- end
152
-
153
- return implementations
154
- end
155
-
156
- --[=[
157
- Finds the implementation on the adornee. Alais for [FindFirstImplementation]
158
-
159
- @param adornee Adornee
160
- @return TieInterface | nil
161
- ]=]
162
- function TieDefinition:Find(adornee: Instance)
163
- return self:FindFirstImplementation(adornee)
164
- end
165
-
166
- --[=[
167
- Observes all implementations that are tagged with the given tag name
168
-
169
- @param tagName string
170
- @return TieInterface | nil
171
- ]=]
172
- function TieDefinition:ObserveAllTaggedBrio(tagName)
173
- assert(type(tagName) == "string", "Bad tagName")
174
-
175
- return RxCollectionServiceUtils.observeTaggedBrio(tagName):Pipe({
176
- RxBrioUtils.flatMapBrio(function(instance)
177
- return self:ObserveBrio(instance)
178
- end)
179
- })
180
- end
181
-
182
- --[=[
183
- Finds the first valid interfaces for this adornee
184
- @param adornee Instance
185
- @return TieInterface
186
- ]=]
187
- function TieDefinition:FindFirstImplementation(adornee: Instance)
188
- assert(typeof(adornee) == "Instance", "Bad adornee")
189
-
190
- local containerName = self:GetContainerName()
191
- for _, item in pairs(adornee:GetChildren()) do
192
- if item.Name == containerName then
193
- if self:IsImplementation(item) then
194
- return TieInterface.new(self, item, nil)
195
- end
196
- end
197
- end
198
-
199
- return nil
200
- end
201
-
202
- --[=[
203
- Returns true if the adornee implements the interface, and false otherwise.
204
- @param adornee Instance
205
- @return boolean
206
- ]=]
207
- function TieDefinition:HasImplementation(adornee: Instance)
208
- assert(typeof(adornee) == "Instance", "Bad adornee")
209
-
210
- local folder = adornee:FindFirstChild(self:GetContainerName())
211
- if not folder then
212
- return false
213
- end
214
-
215
- return self:IsImplementation(folder)
216
- end
217
-
218
- --[=[
219
- Observes whether the adornee implements the interface.
220
- @param adornee Instance
221
- @return Observable<boolean>>
222
- ]=]
223
- function TieDefinition:ObserveIsImplemented(adornee: Instance): boolean
224
- assert(typeof(adornee) == "Instance", "Bad adornee")
225
-
226
- return self:ObserveLastImplementationBrio(adornee)
227
- :Pipe({
228
- RxBrioUtils.map(function(result)
229
- return result and true or false
230
- end);
231
- RxBrioUtils.emitOnDeath(false);
232
- Rx.defaultsTo(false);
233
- Rx.distinct();
234
- })
235
- end
236
-
237
- --[=[
238
- Observes whether the folder is a valid implementation
239
- @param folder Instance
240
- @return Observable<boolean>>
241
- ]=]
242
- function TieDefinition:ObserveIsImplementation(folder: Folder)
243
- return self:_observeImplementation(folder)
244
- :Pipe({
245
- RxBrioUtils.map(function(result)
246
- return result and true or false
247
- end);
248
- RxBrioUtils.emitOnDeath(false);
249
- Rx.defaultsTo(false);
250
- Rx.distinct();
251
- })
252
- end
253
-
254
- --[=[
255
- Observes whether the folder is a valid implementation on the given adornee
256
- @param folder Instance
257
- @param adornee Instance
258
- @return Observable<boolean>>
259
- ]=]
260
- function TieDefinition:ObserveIsImplementedOn(folder: Folder, adornee: Instance)
261
- assert(typeof(folder) == "Instance", "Bad folder")
262
- assert(typeof(adornee) == "Instance", "Bad adornee")
263
-
264
- return RxInstanceUtils.observePropertyBrio(folder, "Parent", function(parent)
265
- return parent == adornee
266
- end):Pipe({
267
- RxBrioUtils.switchMapBrio(function()
268
- return self:_observeImplementation(folder)
269
- end);
270
- RxBrioUtils.map(function(result)
271
- return result and true or false
272
- end);
273
- RxBrioUtils.emitOnDeath(false);
274
- Rx.defaultsTo(false);
275
- Rx.distinct();
276
- })
277
- end
278
-
279
- --[=[
280
- Observes a valid implementation wrapped in a brio if it exists.
281
- @param adornee Instance
282
- @return Observable<Brio<TieImplementation<T>>>
283
- ]=]
284
- function TieDefinition:ObserveLastImplementationBrio(adornee: Instance)
285
- assert(typeof(adornee) == "Instance", "Bad adornee")
286
-
287
- return RxInstanceUtils.observeLastNamedChildBrio(adornee, "Folder", self:GetContainerName())
288
- :Pipe({
289
- RxBrioUtils.switchMapBrio(function(folder)
290
- return self:_observeImplementation(folder)
291
- end);
292
- RxBrioUtils.onlyLastBrioSurvives();
293
- })
294
- end
295
-
296
- function TieDefinition:ObserveBrio(adornee: Instance)
297
- return self:ObserveLastImplementationBrio(adornee)
298
- end
299
-
300
- --[=[
301
- Observes a valid implementation if it exists, or nil
302
-
303
- @param adornee Instance
304
- @return Observable<TieImplementation<T> | nil>>
305
- ]=]
306
- function TieDefinition:ObserveLastImplementation(adornee: Instance)
307
- assert(typeof(adornee) == "Instance", "Bad adornee")
308
-
309
- return self:ObserveLastImplementationBrio(adornee):Pipe({
310
- RxStateStackUtils.topOfStack();
311
- })
312
- end
313
-
314
- function TieDefinition:Observe(adornee: Instance)
315
- return self:ObserveLastImplementation(adornee)
316
- end
317
-
318
- --[=[
319
- Observes valid implementations wrapped in a brio if it exists.
320
- @param adornee Instance
321
- @return Observable<Brio<TieImplementation<T>>>
322
- ]=]
323
- function TieDefinition:ObserveImplementationsBrio(adornee: Instance)
324
- assert(typeof(adornee) == "Instance", "Bad adornee")
325
-
326
- return RxInstanceUtils.observeChildrenOfNameBrio(adornee, "Folder", self:GetContainerName())
327
- :Pipe({
328
- RxBrioUtils.flatMapBrio(function(folder)
329
- return self:_observeImplementation(folder)
330
- end)
331
- })
332
- end
333
-
334
- function TieDefinition:_observeImplementation(folder)
335
- return Observable.new(function(sub)
336
- -- Bind to all children, instead of individually. This is a
337
- -- performance gain.
338
-
339
- local maid = Maid.new()
340
-
341
- local update
342
- do
343
- local isImplemented = maid:Add(ValueObject.new(UNSET_VALUE))
344
-
345
- maid:GiveTask(isImplemented.Changed:Connect(function()
346
- maid._brio = nil
347
-
348
- if not sub:IsPending() then
349
- return
350
- end
351
-
352
- if isImplemented.Value then
353
- local brio = Brio.new(TieInterface.new(self, folder, nil))
354
- sub:Fire(brio)
355
- maid._brio = brio
356
- else
357
- maid._brio = nil
358
- end
359
- end))
360
-
361
- function update()
362
- isImplemented.Value = self:IsImplementation(folder)
363
- end
364
- end
365
-
366
- maid:GiveTask(folder.ChildAdded:Connect(function(child)
367
- maid[child] = child:GetPropertyChangedSignal("Name"):Connect(update)
368
- update()
369
- end))
370
-
371
- for memberName, member in pairs(self:GetMemberMap()) do
372
- if not member:IsAllowed() then
373
- continue
374
- end
375
-
376
- if member.ClassName == "TiePropertyDefinition" then
377
- maid:GiveTask(folder:GetAttributeChangedSignal(memberName):Connect(update))
378
- end
379
- end
380
-
381
- maid:GiveTask(folder.ChildRemoved:Connect(function(child)
382
- maid[child] = nil
383
- update()
384
- end))
385
-
386
- for _, child in pairs(folder:GetChildren()) do
387
- maid[child] = child:GetPropertyChangedSignal("Name"):Connect(update)
388
- end
389
-
390
- update()
391
-
392
- return maid
393
- end)
394
- end
395
-
396
- --[=[
397
- Ensures implementation of the object, binding table values and Lua OOP objects
398
- to Roblox objects that can be invoked generally.
399
-
400
- ```lua
401
-
402
- ```
403
-
404
- @param adornee Instance -- Adornee to implement interface on
405
- @param implementer table? -- Table with all interface values or nil
406
- @return TieImplementation<T>
407
- ]=]
408
- function TieDefinition:Implement(adornee: Instance, implementer)
409
- assert(typeof(adornee) == "Instance", "Bad adornee")
410
- assert(type(implementer) == "table" or implementer == nil, "Bad implementer")
411
-
412
- return TieImplementation.new(self, adornee, implementer)
413
- end
414
-
415
- --[=[
416
- Gets an interface to the tie definition. Not this can be done
417
- on any Roblox instance. If the instance does not implement the interface,
418
- invoking interface methods, or querying the interface will result
419
- in errors.
420
-
421
- @param adornee Instance -- Adornee to get interface on
422
- @return TieInterface<T>
423
- ]=]
424
- function TieDefinition:Get(adornee: Instance)
425
- assert(typeof(adornee) == "Instance", "Bad adornee")
426
-
427
- return TieInterface.new(self, nil, adornee)
428
- end
429
-
430
- --[=[
431
- Gets the name of the definition
432
- @return string
433
- ]=]
434
- function TieDefinition:GetName(): string
435
- return self._definitionName
436
- end
437
-
438
- function TieDefinition:GetContainerNameForServer()
439
- return self._definitionName
440
- end
441
-
442
- function TieDefinition:GetContainerName(): string
443
- if RunService:IsClient() and not self._isSharedDefinition then
444
- return self._definitionName .. "Client"
445
- else
446
- return self._definitionName
447
- end
448
- end
449
-
450
- function TieDefinition:GetMemberMap()
451
- return self._memberMap
452
- end
453
-
454
- --[=[
455
- Returns true if the folder is an implementation
456
-
457
- @param folder Folder
458
- @return boolean
459
- ]=]
460
- function TieDefinition:IsImplementation(folder)
461
- assert(typeof(folder) == "Instance", "Bad folder")
462
-
463
- local attributes = folder:GetAttributes()
464
- local children = {}
465
- for _, item in pairs(folder:GetChildren()) do
466
- children[item.Name] = item
467
- end
468
-
469
- for memberName, member in pairs(self:GetMemberMap()) do
470
- if not member:IsRequired() then
471
- continue
472
- end
473
-
474
- local found = children[memberName]
475
- if not found then
476
- if member.ClassName == "TiePropertyDefinition" then
477
- if attributes[memberName] == nil then
478
- return false
479
- else
480
- continue
481
- end
482
- end
483
-
484
- return false
485
- end
486
-
487
- if member.ClassName == "TieMethodDefinition" then
488
- if not found:IsA("BindableFunction") then
489
- return false
490
- end
491
- elseif member.ClassName == "TieSignalDefinition" then
492
- if not found:IsA("BindableEvent") then
493
- return false
494
- end
495
- elseif member.ClassName == "TiePropertyDefinition" then
496
- if not (found:IsA("BindableFunction") or String.endsWith(found.ClassName, "Value")) then
497
- return false
498
- end
499
- else
500
- error("[TieDefinition.IsImplementation] - Unknown member type")
501
- end
502
- end
503
-
504
- return true
505
- end
506
-
507
- return TieDefinition
@@ -1,61 +0,0 @@
1
- --[=[
2
- @class TieMethodDefinition
3
- ]=]
4
-
5
- local require = require(script.Parent.loader).load(script)
6
-
7
- local TieMethodImplementation = require("TieMethodImplementation")
8
- local TieMethodInterfaceUtils = require("TieMethodInterfaceUtils")
9
- local TieRealmUtils = require("TieRealmUtils")
10
-
11
- local TieMethodDefinition = {}
12
- TieMethodDefinition.ClassName = "TieMethodDefinition"
13
- TieMethodDefinition.__index = TieMethodDefinition
14
-
15
- function TieMethodDefinition.new(tieDefinition, methodName, realm)
16
- local self = setmetatable({}, TieMethodDefinition)
17
-
18
- self._tieDefinition = assert(tieDefinition, "No tieDefinition")
19
- self._methodName = assert(methodName, "No methodName")
20
- self._tieRealm = assert(realm, "No realm")
21
- self._isRequired = TieRealmUtils.isRequired(self._tieRealm)
22
- self._isAllowed = TieRealmUtils.isAllowed(self._tieRealm)
23
-
24
- return self
25
- end
26
-
27
- function TieMethodDefinition:IsRequired()
28
- return self._isRequired
29
- end
30
-
31
- function TieMethodDefinition:IsAllowed()
32
- return self._isAllowed
33
- end
34
-
35
- function TieMethodDefinition:Implement(folder, initialValue, actualSelf)
36
- assert(typeof(folder) == "Instance", "Bad folder")
37
- assert(actualSelf, "No actualSelf")
38
-
39
- return TieMethodImplementation.new(self, folder, initialValue, actualSelf)
40
- end
41
-
42
- function TieMethodDefinition:GetInterface(folder: Folder, aliasSelf)
43
- assert(typeof(folder) == "Instance", "Bad folder")
44
- assert(aliasSelf, "No aliasSelf")
45
-
46
- return TieMethodInterfaceUtils.get(aliasSelf, self._tieDefinition, self, folder, nil)
47
- end
48
-
49
- function TieMethodDefinition:GetTieRealm()
50
- return self._tieRealm
51
- end
52
-
53
- function TieMethodDefinition:GetTieDefinition()
54
- return self._tieDefinition
55
- end
56
-
57
- function TieMethodDefinition:GetMemberName()
58
- return self._methodName
59
- end
60
-
61
- return TieMethodDefinition
@@ -1,64 +0,0 @@
1
- --[=[
2
- @class TiePropertyDefinition
3
- ]=]
4
-
5
- local require = require(script.Parent.loader).load(script)
6
-
7
- local TiePropertyImplementation = require("TiePropertyImplementation")
8
- local TiePropertyInterface = require("TiePropertyInterface")
9
- local TieRealmUtils = require("TieRealmUtils")
10
-
11
- local TiePropertyDefinition = {}
12
- TiePropertyDefinition.ClassName = "TiePropertyDefinition"
13
- TiePropertyDefinition.__index = TiePropertyDefinition
14
-
15
- function TiePropertyDefinition.new(tieDefinition, propertyName: string, defaultValue: any, realm)
16
- local self = setmetatable({}, TiePropertyDefinition)
17
-
18
- self._tieDefinition = assert(tieDefinition, "No tieDefinition")
19
- self._propertyName = assert(propertyName, "No propertyName")
20
- self._defaultValue = defaultValue
21
- self._tieRealm = assert(realm, "No realm")
22
- self._isRequired = TieRealmUtils.isRequired(self._tieRealm)
23
- self._isAllowed = TieRealmUtils.isAllowed(self._tieRealm)
24
-
25
- return self
26
- end
27
-
28
- function TiePropertyDefinition:GetTieDefinition()
29
- return self._tieDefinition
30
- end
31
-
32
- function TiePropertyDefinition:GetDefaultValue()
33
- return self._defaultValue
34
- end
35
-
36
- function TiePropertyDefinition:IsRequired(): boolean
37
- return self._isRequired
38
- end
39
-
40
- function TiePropertyDefinition:IsAllowed(): boolean
41
- return self._isAllowed
42
- end
43
-
44
- function TiePropertyDefinition:GetTieRealm()
45
- return self._tieRealm
46
- end
47
-
48
- function TiePropertyDefinition:Implement(folder: Folder, initialValue)
49
- assert(typeof(folder) == "Instance", "Bad folder")
50
-
51
- return TiePropertyImplementation.new(self, folder, initialValue)
52
- end
53
-
54
- function TiePropertyDefinition:GetInterface(folder: Folder)
55
- assert(typeof(folder) == "Instance", "Bad folder")
56
-
57
- return TiePropertyInterface.new(folder, nil, self)
58
- end
59
-
60
- function TiePropertyDefinition:GetMemberName(): string
61
- return self._propertyName
62
- end
63
-
64
- return TiePropertyDefinition
@@ -1,59 +0,0 @@
1
- --[=[
2
- @class TieSignalDefinition
3
- ]=]
4
-
5
- local require = require(script.Parent.loader).load(script)
6
-
7
- local TieSignalImplementation = require("TieSignalImplementation")
8
- local TieSignalInterface = require("TieSignalInterface")
9
- local TieRealmUtils = require("TieRealmUtils")
10
-
11
- local TieSignalDefinition = {}
12
- TieSignalDefinition.ClassName = "TieSignalDefinition"
13
- TieSignalDefinition.__index = TieSignalDefinition
14
-
15
- function TieSignalDefinition.new(tieDefinition, signalName, realm)
16
- local self = setmetatable({}, TieSignalDefinition)
17
-
18
- self._tieDefinition = assert(tieDefinition, "No tieDefinition")
19
- self._signalName = assert(signalName, "No signalName")
20
- self._tieRealm = assert(realm, "No realm")
21
- self._isRequired = TieRealmUtils.isRequired(self._tieRealm)
22
- self._isAllowed = TieRealmUtils.isAllowed(self._tieRealm)
23
-
24
- return self
25
- end
26
-
27
- function TieSignalDefinition:GetTieDefinition()
28
- return self._tieDefinition
29
- end
30
-
31
- function TieSignalDefinition:IsRequired()
32
- return self._isRequired
33
- end
34
-
35
- function TieSignalDefinition:IsAllowed()
36
- return self._isAllowed
37
- end
38
-
39
- function TieSignalDefinition:GetTieRealm()
40
- return self._tieRealm
41
- end
42
-
43
- function TieSignalDefinition:Implement(folder, initialValue)
44
- assert(typeof(folder) == "Instance", "Bad folder")
45
-
46
- return TieSignalImplementation.new(self, folder, initialValue)
47
- end
48
-
49
- function TieSignalDefinition:GetInterface(folder: Folder)
50
- assert(typeof(folder) == "Instance", "Bad folder")
51
-
52
- return TieSignalInterface.new(folder, nil, self)
53
- end
54
-
55
- function TieSignalDefinition:GetMemberName()
56
- return self._signalName
57
- end
58
-
59
- return TieSignalDefinition