@quenty/templateprovider 11.18.2 → 11.18.3
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/CHANGELOG.md +8 -0
- package/package.json +16 -16
- package/src/Shared/Replication/Util/TemplateReplicationModes.lua +13 -4
- package/src/Shared/Replication/Util/TemplateReplicationModesUtils.lua +6 -1
- package/src/Shared/TaggedTemplateProvider.lua +1 -1
- package/src/Shared/TemplateProvider.lua +70 -41
package/CHANGELOG.md
CHANGED
|
@@ -3,6 +3,14 @@
|
|
|
3
3
|
All notable changes to this project will be documented in this file.
|
|
4
4
|
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
|
5
5
|
|
|
6
|
+
## [11.18.3](https://github.com/Quenty/NevermoreEngine/compare/@quenty/templateprovider@11.18.2...@quenty/templateprovider@11.18.3) (2025-04-10)
|
|
7
|
+
|
|
8
|
+
**Note:** Version bump only for package @quenty/templateprovider
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
|
|
6
14
|
## [11.18.2](https://github.com/Quenty/NevermoreEngine/compare/@quenty/templateprovider@11.18.0...@quenty/templateprovider@11.18.2) (2025-04-07)
|
|
7
15
|
|
|
8
16
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@quenty/templateprovider",
|
|
3
|
-
"version": "11.18.
|
|
3
|
+
"version": "11.18.3",
|
|
4
4
|
"description": "Base of a template retrieval system",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"Roblox",
|
|
@@ -25,24 +25,24 @@
|
|
|
25
25
|
"Quenty"
|
|
26
26
|
],
|
|
27
27
|
"dependencies": {
|
|
28
|
-
"@quenty/baseobject": "^10.8.
|
|
29
|
-
"@quenty/brio": "^14.17.
|
|
30
|
-
"@quenty/collectionserviceutils": "^8.17.
|
|
31
|
-
"@quenty/ducktype": "^5.8.
|
|
32
|
-
"@quenty/insertserviceutils": "^10.10.
|
|
33
|
-
"@quenty/instanceutils": "^13.17.
|
|
34
|
-
"@quenty/loader": "^10.8.
|
|
35
|
-
"@quenty/maid": "^3.4.
|
|
36
|
-
"@quenty/observablecollection": "^12.20.
|
|
37
|
-
"@quenty/promise": "^10.10.
|
|
38
|
-
"@quenty/promisemaid": "^5.10.
|
|
39
|
-
"@quenty/remoting": "^12.18.
|
|
40
|
-
"@quenty/rx": "^13.17.
|
|
28
|
+
"@quenty/baseobject": "^10.8.3",
|
|
29
|
+
"@quenty/brio": "^14.17.3",
|
|
30
|
+
"@quenty/collectionserviceutils": "^8.17.3",
|
|
31
|
+
"@quenty/ducktype": "^5.8.4",
|
|
32
|
+
"@quenty/insertserviceutils": "^10.10.4",
|
|
33
|
+
"@quenty/instanceutils": "^13.17.3",
|
|
34
|
+
"@quenty/loader": "^10.8.3",
|
|
35
|
+
"@quenty/maid": "^3.4.3",
|
|
36
|
+
"@quenty/observablecollection": "^12.20.3",
|
|
37
|
+
"@quenty/promise": "^10.10.4",
|
|
38
|
+
"@quenty/promisemaid": "^5.10.4",
|
|
39
|
+
"@quenty/remoting": "^12.18.3",
|
|
40
|
+
"@quenty/rx": "^13.17.3",
|
|
41
41
|
"@quenty/string": "^3.3.3",
|
|
42
|
-
"@quenty/table": "^3.7.
|
|
42
|
+
"@quenty/table": "^3.7.4"
|
|
43
43
|
},
|
|
44
44
|
"publishConfig": {
|
|
45
45
|
"access": "public"
|
|
46
46
|
},
|
|
47
|
-
"gitHead": "
|
|
47
|
+
"gitHead": "b06c070ae91d5dab7bd8de6e290ad2caabb15d8f"
|
|
48
48
|
}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
--!strict
|
|
1
2
|
--[=[
|
|
2
3
|
@class TemplateReplicationModes
|
|
3
4
|
]=]
|
|
@@ -6,8 +7,16 @@ local require = require(script.Parent.loader).load(script)
|
|
|
6
7
|
|
|
7
8
|
local Table = require("Table")
|
|
8
9
|
|
|
10
|
+
export type TemplateReplicationMode = "client" | "server" | "shared"
|
|
11
|
+
|
|
12
|
+
type TemplateReplicationModeMap = {
|
|
13
|
+
CLIENT: "client",
|
|
14
|
+
SERVER: "server",
|
|
15
|
+
SHARED: "shared",
|
|
16
|
+
}
|
|
17
|
+
|
|
9
18
|
return Table.readonly({
|
|
10
|
-
CLIENT = "client"
|
|
11
|
-
SERVER = "server"
|
|
12
|
-
SHARED = "shared"
|
|
13
|
-
})
|
|
19
|
+
CLIENT = "client",
|
|
20
|
+
SERVER = "server",
|
|
21
|
+
SHARED = "shared",
|
|
22
|
+
} :: TemplateReplicationModeMap)
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
--!strict
|
|
1
2
|
--[=[
|
|
2
3
|
@class TemplateReplicationModesUtils
|
|
3
4
|
]=]
|
|
@@ -5,11 +6,15 @@
|
|
|
5
6
|
local require = require(script.Parent.loader).load(script)
|
|
6
7
|
|
|
7
8
|
local RunService = game:GetService("RunService")
|
|
9
|
+
|
|
8
10
|
local TemplateReplicationModes = require("TemplateReplicationModes")
|
|
9
11
|
|
|
10
12
|
local TemplateReplicationModesUtils = {}
|
|
11
13
|
|
|
12
|
-
|
|
14
|
+
--[=[
|
|
15
|
+
Uses run service to infer the replication mode
|
|
16
|
+
]=]
|
|
17
|
+
function TemplateReplicationModesUtils.inferReplicationMode(): TemplateReplicationModes.TemplateReplicationMode
|
|
13
18
|
if not RunService:IsRunning() then
|
|
14
19
|
return TemplateReplicationModes.SHARED
|
|
15
20
|
end
|
|
@@ -11,7 +11,7 @@ local RxCollectionServiceUtils = require("RxCollectionServiceUtils")
|
|
|
11
11
|
|
|
12
12
|
local TaggedTemplateProvider = {}
|
|
13
13
|
|
|
14
|
-
function TaggedTemplateProvider.new(providerName: string, tagName: string)
|
|
14
|
+
function TaggedTemplateProvider.new(providerName: string, tagName: string): TemplateProvider.TemplateProvider
|
|
15
15
|
assert(type(providerName) == "string", "bad providerName")
|
|
16
16
|
assert(type(tagName) == "string", "Bad tagName")
|
|
17
17
|
|
|
@@ -72,24 +72,42 @@ TemplateProvider.ServiceName = "TemplateProvider"
|
|
|
72
72
|
TemplateProvider.__index = TemplateProvider
|
|
73
73
|
|
|
74
74
|
--[=[
|
|
75
|
-
@type
|
|
75
|
+
@type TemplateDeclaration Instance | Observable<Brio<Instance>> | table
|
|
76
76
|
@within TemplateProvider
|
|
77
77
|
]=]
|
|
78
|
+
export type TemplateDeclaration = Instance | Observable.Observable<Brio.Brio<Instance>> | { TemplateDeclaration }
|
|
79
|
+
|
|
80
|
+
export type TemplateProvider = typeof(setmetatable(
|
|
81
|
+
{} :: {
|
|
82
|
+
_serviceBag: _ServiceBag.ServiceBag,
|
|
83
|
+
_initialTemplates: TemplateDeclaration,
|
|
84
|
+
_maid: Maid.Maid,
|
|
85
|
+
_templateMapList: any, -- ObservableMapList.ObservableMapList<Instance>,
|
|
86
|
+
_unreplicatedTemplateMapList: any, -- ObservableMapList.ObservableMapList<Instance>,
|
|
87
|
+
_containerRootCountingMap: ObservableCountingMap.ObservableCountingMap<Instance>,
|
|
88
|
+
_remoting: Remoting.Remoting,
|
|
89
|
+
_tombstoneLookup: { [string]: Instance },
|
|
90
|
+
_pendingTemplatePromises: { [string]: Promise.Promise<Instance> },
|
|
91
|
+
_pendingTombstoneRequests: { [string]: Promise.Promise<Instance> },
|
|
92
|
+
_replicationMode: TemplateReplicationModes.TemplateReplicationMode,
|
|
93
|
+
},
|
|
94
|
+
{} :: typeof({ __index = TemplateProvider })
|
|
95
|
+
))
|
|
78
96
|
|
|
79
97
|
--[=[
|
|
80
98
|
Constructs a new [TemplateProvider].
|
|
81
99
|
|
|
82
100
|
@param providerName string
|
|
83
|
-
@param initialTemplates
|
|
101
|
+
@param initialTemplates TemplateDeclaration
|
|
84
102
|
]=]
|
|
85
|
-
function TemplateProvider.new(providerName: string, initialTemplates)
|
|
103
|
+
function TemplateProvider.new(providerName: string, initialTemplates: TemplateDeclaration): TemplateProvider
|
|
86
104
|
assert(type(providerName) == "string", "Bad providerName")
|
|
87
105
|
local self = setmetatable({}, TemplateProvider)
|
|
88
106
|
|
|
89
107
|
self.ServiceName = assert(providerName, "No providerName")
|
|
90
108
|
self._initialTemplates = initialTemplates
|
|
91
109
|
|
|
92
|
-
if not (self:
|
|
110
|
+
if not (self:_isValidTemplateDeclaration(self._initialTemplates) or self._initialTemplates == nil) then
|
|
93
111
|
error(
|
|
94
112
|
string.format(
|
|
95
113
|
"[TemplateProvider.%s] - Bad initialTemplates of type %s",
|
|
@@ -118,7 +136,7 @@ end
|
|
|
118
136
|
|
|
119
137
|
@param serviceBag ServiceBag
|
|
120
138
|
]=]
|
|
121
|
-
function TemplateProvider
|
|
139
|
+
function TemplateProvider.Init(self: TemplateProvider, serviceBag: _ServiceBag.ServiceBag)
|
|
122
140
|
assert(not self._serviceBag, "Already initialized")
|
|
123
141
|
self._serviceBag = assert(serviceBag, "No serviceBag")
|
|
124
142
|
self._maid = Maid.new()
|
|
@@ -135,7 +153,7 @@ function TemplateProvider:Init(serviceBag: _ServiceBag.ServiceBag)
|
|
|
135
153
|
self:_setupTemplateCache()
|
|
136
154
|
end
|
|
137
155
|
|
|
138
|
-
function TemplateProvider
|
|
156
|
+
function TemplateProvider._setupTemplateCache(self: TemplateProvider)
|
|
139
157
|
if self._replicationMode == TemplateReplicationModes.SERVER then
|
|
140
158
|
self._tombstoneLookup = {}
|
|
141
159
|
self._remoting = self._maid:Add(Remoting.Server.new(ReplicatedStorage, self.ServiceName .. "TemplateProvider"))
|
|
@@ -190,7 +208,7 @@ function TemplateProvider:_setupTemplateCache()
|
|
|
190
208
|
end))
|
|
191
209
|
end
|
|
192
210
|
|
|
193
|
-
function TemplateProvider
|
|
211
|
+
function TemplateProvider._handleContainer(self: TemplateProvider, containerMaid: Maid.Maid, container: Instance)
|
|
194
212
|
if
|
|
195
213
|
self._replicationMode == TemplateReplicationModes.SERVER
|
|
196
214
|
and not container:IsA("Camera")
|
|
@@ -234,7 +252,12 @@ function TemplateProvider:_handleContainer(containerMaid: Maid.Maid, container:
|
|
|
234
252
|
end))
|
|
235
253
|
end
|
|
236
254
|
|
|
237
|
-
function TemplateProvider
|
|
255
|
+
function TemplateProvider._replicateTombstones(
|
|
256
|
+
self: TemplateProvider,
|
|
257
|
+
topMaid: Maid.Maid,
|
|
258
|
+
unreplicatedParent,
|
|
259
|
+
replicatedParent
|
|
260
|
+
)
|
|
238
261
|
assert(self._replicationMode == TemplateReplicationModes.SERVER, "Only should be invoked on server")
|
|
239
262
|
|
|
240
263
|
-- Tombstone each child so the client knows what is replicated
|
|
@@ -274,7 +297,7 @@ end
|
|
|
274
297
|
@param templateName string
|
|
275
298
|
@return Observable<Instance>
|
|
276
299
|
]=]
|
|
277
|
-
function TemplateProvider
|
|
300
|
+
function TemplateProvider.ObserveTemplate(self: TemplateProvider, templateName: string): Observable.Observable<Instance>
|
|
278
301
|
assert(type(templateName) == "string", "Bad templateName")
|
|
279
302
|
|
|
280
303
|
return self._templateMapList:ObserveList(templateName):Pipe({
|
|
@@ -288,11 +311,13 @@ function TemplateProvider:ObserveTemplate(templateName: string): Observable.Obse
|
|
|
288
311
|
})
|
|
289
312
|
end
|
|
290
313
|
|
|
291
|
-
function TemplateProvider
|
|
314
|
+
function TemplateProvider.ObserveTemplateNamesBrio(self: TemplateProvider): Observable.Observable<Brio.Brio<string>>
|
|
292
315
|
return self._templateMapList:ObserveKeysBrio()
|
|
293
316
|
end
|
|
294
317
|
|
|
295
|
-
function TemplateProvider
|
|
318
|
+
function TemplateProvider.ObserveUnreplicatedTemplateNamesBrio(
|
|
319
|
+
self: TemplateProvider
|
|
320
|
+
): Observable.Observable<Brio.Brio<string>>
|
|
296
321
|
return self._unreplicatedTemplateMapList:ObserveKeysBrio()
|
|
297
322
|
end
|
|
298
323
|
|
|
@@ -302,7 +327,7 @@ end
|
|
|
302
327
|
@param templateName string
|
|
303
328
|
@return Instance?
|
|
304
329
|
]=]
|
|
305
|
-
function TemplateProvider
|
|
330
|
+
function TemplateProvider.GetTemplate(self: TemplateProvider, templateName: string): Instance?
|
|
306
331
|
assert(type(templateName) == "string", "Bad templateName")
|
|
307
332
|
|
|
308
333
|
return self._templateMapList:GetItemForKeyAtIndex(templateName, -1)
|
|
@@ -314,7 +339,7 @@ end
|
|
|
314
339
|
@param templateName string
|
|
315
340
|
@return Promise<Instance>
|
|
316
341
|
]=]
|
|
317
|
-
function TemplateProvider
|
|
342
|
+
function TemplateProvider.PromiseCloneTemplate(self: TemplateProvider, templateName: string): Promise.Promise<Instance>
|
|
318
343
|
assert(type(templateName) == "string", "Bad templateName")
|
|
319
344
|
|
|
320
345
|
return self:PromiseTemplate(templateName):Then(function(template)
|
|
@@ -328,7 +353,7 @@ end
|
|
|
328
353
|
@param templateName string
|
|
329
354
|
@return Promise<Instance>
|
|
330
355
|
]=]
|
|
331
|
-
function TemplateProvider
|
|
356
|
+
function TemplateProvider.PromiseTemplate(self: TemplateProvider, templateName: string): Promise.Promise<Instance>
|
|
332
357
|
assert(type(templateName) == "string", "Bad templateName")
|
|
333
358
|
|
|
334
359
|
local foundTemplate = self._templateMapList:GetItemForKeyAtIndex(templateName, -1)
|
|
@@ -433,7 +458,10 @@ function TemplateProvider:PromiseTemplate(templateName: string): Promise.Promise
|
|
|
433
458
|
return promiseTemplate
|
|
434
459
|
end
|
|
435
460
|
|
|
436
|
-
function TemplateProvider
|
|
461
|
+
function TemplateProvider._promiseReplicateTemplateFromTombstone(
|
|
462
|
+
self: TemplateProvider,
|
|
463
|
+
templateTombstone: Instance
|
|
464
|
+
): Promise.Promise<Instance>
|
|
437
465
|
assert(self._replicationMode == TemplateReplicationModes.CLIENT, "Bad replicationMode")
|
|
438
466
|
assert(typeof(templateTombstone) == "Instance", "Bad templateTombstone")
|
|
439
467
|
|
|
@@ -487,7 +515,7 @@ end
|
|
|
487
515
|
@param templateName string
|
|
488
516
|
@return Instance?
|
|
489
517
|
]=]
|
|
490
|
-
function TemplateProvider
|
|
518
|
+
function TemplateProvider.CloneTemplate(self: TemplateProvider, templateName: string): Instance?
|
|
491
519
|
assert(type(templateName) == "string", "Bad templateName")
|
|
492
520
|
|
|
493
521
|
local template = self._templateMapList:GetItemForKeyAtIndex(templateName, -1)
|
|
@@ -528,8 +556,8 @@ end
|
|
|
528
556
|
@param container Template
|
|
529
557
|
@return MaidTask
|
|
530
558
|
]=]
|
|
531
|
-
function TemplateProvider
|
|
532
|
-
assert(self:
|
|
559
|
+
function TemplateProvider.AddTemplates(self: TemplateProvider, container: TemplateDeclaration): () -> ()
|
|
560
|
+
assert(self:_isValidTemplateDeclaration(container), "Bad container")
|
|
533
561
|
|
|
534
562
|
if typeof(container) == "Instance" then
|
|
535
563
|
-- Always add this instance as we explicitly asked for it to be added as a root. This could be a
|
|
@@ -549,7 +577,7 @@ function TemplateProvider:AddTemplates(container): Maid.Maid
|
|
|
549
577
|
elseif type(container) == "table" then
|
|
550
578
|
local topMaid = Maid.new()
|
|
551
579
|
|
|
552
|
-
for _, value in container do
|
|
580
|
+
for _, value in container :: any do
|
|
553
581
|
if typeof(value) == "Instance" then
|
|
554
582
|
-- Always add these as we explicitly ask for this to be a root too.
|
|
555
583
|
topMaid:GiveTask(self._containerRootCountingMap:Add(value))
|
|
@@ -571,13 +599,15 @@ function TemplateProvider:AddTemplates(container): Maid.Maid
|
|
|
571
599
|
self._maid[topMaid] = nil
|
|
572
600
|
end)
|
|
573
601
|
|
|
574
|
-
return
|
|
602
|
+
return function()
|
|
603
|
+
self._maid[topMaid] = nil
|
|
604
|
+
end
|
|
575
605
|
else
|
|
576
606
|
error(string.format("[TemplateProvider.%s] - Bad container of type %s", self.ServiceName, typeof(container)))
|
|
577
607
|
end
|
|
578
608
|
end
|
|
579
609
|
|
|
580
|
-
function TemplateProvider
|
|
610
|
+
function TemplateProvider._addObservableTemplates(self: TemplateProvider, topMaid: Maid.Maid, observable)
|
|
581
611
|
topMaid:GiveTask(observable:Subscribe(function(result)
|
|
582
612
|
if Brio.isBrio(result) then
|
|
583
613
|
if result:IsDead() then
|
|
@@ -596,7 +626,7 @@ function TemplateProvider:_addObservableTemplates(topMaid: Maid.Maid, observable
|
|
|
596
626
|
end))
|
|
597
627
|
end
|
|
598
628
|
|
|
599
|
-
function TemplateProvider
|
|
629
|
+
function TemplateProvider._addInstanceTemplate(self: TemplateProvider, topMaid: Maid.Maid, template: Instance)
|
|
600
630
|
if self:_shouldAddChildrenAsTemplates(template) then
|
|
601
631
|
topMaid:GiveTask(self._containerRootCountingMap:Add(template))
|
|
602
632
|
end
|
|
@@ -628,7 +658,7 @@ end
|
|
|
628
658
|
@param templateName string
|
|
629
659
|
@return boolean
|
|
630
660
|
]=]
|
|
631
|
-
function TemplateProvider
|
|
661
|
+
function TemplateProvider.IsTemplateAvailable(self: TemplateProvider, templateName: string)
|
|
632
662
|
assert(type(templateName) == "string", "Bad templateName")
|
|
633
663
|
|
|
634
664
|
return self._templateMapList:GetItemForKeyAtIndex(templateName, -1) ~= nil
|
|
@@ -639,7 +669,7 @@ end
|
|
|
639
669
|
|
|
640
670
|
@return { Instance }
|
|
641
671
|
]=]
|
|
642
|
-
function TemplateProvider
|
|
672
|
+
function TemplateProvider.GetTemplateList(self: TemplateProvider): { Instance }
|
|
643
673
|
return self._templateMapList:GetListOfValuesAtListIndex(-1)
|
|
644
674
|
end
|
|
645
675
|
|
|
@@ -648,38 +678,37 @@ end
|
|
|
648
678
|
|
|
649
679
|
@return { Instance }
|
|
650
680
|
]=]
|
|
651
|
-
function TemplateProvider
|
|
652
|
-
return self._containerRootCountingMap:
|
|
681
|
+
function TemplateProvider.GetContainerList(self: TemplateProvider): { Instance }
|
|
682
|
+
return self._containerRootCountingMap:GetKeyList()
|
|
653
683
|
end
|
|
654
684
|
|
|
655
|
-
|
|
656
|
-
TemplateProvider.IsAvailable = assert(TemplateProvider.IsTemplateAvailable, "Missing method")
|
|
657
|
-
TemplateProvider.Get = assert(TemplateProvider.GetTemplate, "Missing method")
|
|
658
|
-
TemplateProvider.Clone = assert(TemplateProvider.CloneTemplate, "Missing method")
|
|
659
|
-
TemplateProvider.PromiseClone = assert(TemplateProvider.PromiseCloneTemplate, "Missing method")
|
|
660
|
-
TemplateProvider.GetAllTemplates = assert(TemplateProvider.GetTemplateList, "Missing method")
|
|
661
|
-
TemplateProvider.GetAll = assert(TemplateProvider.GetTemplateList, "Missing method")
|
|
662
|
-
|
|
663
|
-
function TemplateProvider:_cloneTemplate(template: Instance): Instance
|
|
685
|
+
function TemplateProvider._cloneTemplate(_self: TemplateProvider, template: Instance): Instance
|
|
664
686
|
local newItem = template:Clone()
|
|
665
687
|
newItem.Name = String.removePostfix(template.Name, "Template")
|
|
666
688
|
return newItem
|
|
667
689
|
end
|
|
668
690
|
|
|
669
|
-
function TemplateProvider
|
|
691
|
+
function TemplateProvider._shouldAddChildrenAsTemplates(_self: TemplateProvider, container: Instance): boolean
|
|
670
692
|
return container:IsA("Folder")
|
|
671
693
|
end
|
|
672
694
|
|
|
673
|
-
function TemplateProvider:
|
|
674
|
-
return typeof(container) == "Instance"
|
|
675
|
-
or Observable.isObservable(container)
|
|
676
|
-
or type(container) == "table"
|
|
695
|
+
function TemplateProvider._isValidTemplateDeclaration(_self: TemplateProvider, container: TemplateDeclaration): boolean
|
|
696
|
+
return typeof(container) == "Instance" or Observable.isObservable(container) or type(container) == "table"
|
|
677
697
|
end
|
|
678
698
|
|
|
699
|
+
-- Backwards compatibility
|
|
700
|
+
TemplateProvider.IsAvailable = assert(TemplateProvider.IsTemplateAvailable, "Missing method")
|
|
701
|
+
TemplateProvider.Get = assert(TemplateProvider.GetTemplate, "Missing method")
|
|
702
|
+
TemplateProvider.Clone = assert(TemplateProvider.CloneTemplate, "Missing method")
|
|
703
|
+
TemplateProvider.PromiseClone = assert(TemplateProvider.PromiseCloneTemplate, "Missing method")
|
|
704
|
+
TemplateProvider.GetAllTemplates = assert(TemplateProvider.GetTemplateList, "Missing method")
|
|
705
|
+
TemplateProvider.GetAll = assert(TemplateProvider.GetTemplateList, "Missing method")
|
|
706
|
+
|
|
707
|
+
|
|
679
708
|
--[=[
|
|
680
709
|
Cleans up the provider
|
|
681
710
|
]=]
|
|
682
|
-
function TemplateProvider
|
|
711
|
+
function TemplateProvider.Destroy(self: TemplateProvider)
|
|
683
712
|
self._maid:DoCleaning()
|
|
684
713
|
end
|
|
685
714
|
|