@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 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.2",
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.2",
29
- "@quenty/brio": "^14.17.2",
30
- "@quenty/collectionserviceutils": "^8.17.2",
31
- "@quenty/ducktype": "^5.8.3",
32
- "@quenty/insertserviceutils": "^10.10.3",
33
- "@quenty/instanceutils": "^13.17.2",
34
- "@quenty/loader": "^10.8.2",
35
- "@quenty/maid": "^3.4.2",
36
- "@quenty/observablecollection": "^12.20.2",
37
- "@quenty/promise": "^10.10.3",
38
- "@quenty/promisemaid": "^5.10.3",
39
- "@quenty/remoting": "^12.18.2",
40
- "@quenty/rx": "^13.17.2",
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.3"
42
+ "@quenty/table": "^3.7.4"
43
43
  },
44
44
  "publishConfig": {
45
45
  "access": "public"
46
46
  },
47
- "gitHead": "64def70499ec067077ee39f279936b620b217847"
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
- function TemplateReplicationModesUtils.inferReplicationMode()
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 Template Instance | Observable<Brio<Instance>> | table
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 Template
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:_isValidTemplate(self._initialTemplates) or self._initialTemplates == nil) then
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:Init(serviceBag: _ServiceBag.ServiceBag)
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:_setupTemplateCache()
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:_handleContainer(containerMaid: Maid.Maid, container: Instance)
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:_replicateTombstones(topMaid: Maid.Maid, unreplicatedParent, replicatedParent)
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:ObserveTemplate(templateName: string): Observable.Observable<Instance>
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:ObserveTemplateNamesBrio(): Observable.Observable<Brio.Brio<string>>
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:ObserveUnreplicatedTemplateNamesBrio(): Observable.Observable<Brio.Brio<string>>
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:GetTemplate(templateName: string): Instance?
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:PromiseCloneTemplate(templateName: string): Promise.Promise<Instance>
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:PromiseTemplate(templateName: string): Promise.Promise<Instance>
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:_promiseReplicateTemplateFromTombstone(templateTombstone: Instance): Promise.Promise<Instance>
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:CloneTemplate(templateName: string): Instance?
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:AddTemplates(container): Maid.Maid
532
- assert(self:_isValidTemplate(container), "Bad container")
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 topMaid
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:_addObservableTemplates(topMaid: Maid.Maid, observable)
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:_addInstanceTemplate(topMaid: Maid.Maid, template: Instance)
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:IsTemplateAvailable(templateName: string)
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:GetTemplateList(): { Instance }
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:GetContainerList(): { Instance }
652
- return self._containerRootCountingMap:GetList()
681
+ function TemplateProvider.GetContainerList(self: TemplateProvider): { Instance }
682
+ return self._containerRootCountingMap:GetKeyList()
653
683
  end
654
684
 
655
- -- Backwards compatibility
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:_shouldAddChildrenAsTemplates(container: Instance): boolean
691
+ function TemplateProvider._shouldAddChildrenAsTemplates(_self: TemplateProvider, container: Instance): boolean
670
692
  return container:IsA("Folder")
671
693
  end
672
694
 
673
- function TemplateProvider:_isValidTemplate(container): boolean
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:Destroy()
711
+ function TemplateProvider.Destroy(self: TemplateProvider)
683
712
  self._maid:DoCleaning()
684
713
  end
685
714