@quenty/loader 10.8.0 → 10.8.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/CHANGELOG.md CHANGED
@@ -3,6 +3,17 @@
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
+ ## [10.8.1](https://github.com/Quenty/NevermoreEngine/compare/@quenty/loader@10.8.0...@quenty/loader@10.8.1) (2025-04-05)
7
+
8
+
9
+ ### Bug Fixes
10
+
11
+ * Add types to packages ([2374fb2](https://github.com/Quenty/NevermoreEngine/commit/2374fb2b043cfbe0e9b507b3316eec46a4e353a0))
12
+
13
+
14
+
15
+
16
+
6
17
  # [10.8.0](https://github.com/Quenty/NevermoreEngine/compare/@quenty/loader@10.7.1...@quenty/loader@10.8.0) (2025-02-18)
7
18
 
8
19
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@quenty/loader",
3
- "version": "10.8.0",
3
+ "version": "10.8.1",
4
4
  "description": "A simple module loader for Roblox",
5
5
  "keywords": [
6
6
  "Roblox",
@@ -26,5 +26,5 @@
26
26
  "publishConfig": {
27
27
  "access": "public"
28
28
  },
29
- "gitHead": "184a407d8d7366c39009444c3c9a7023cb176471"
29
+ "gitHead": "78c3ac0ab08dd18085b6e6e6e4f745e76ed99f68"
30
30
  }
@@ -1,3 +1,4 @@
1
+ --!strict
1
2
  --[=[
2
3
  Very inefficient search utility function to find dependencies
3
4
  organized in node_modules structure.
@@ -20,18 +21,30 @@ local DependencyUtils = {}
20
21
  @param requestedReplicationType ReplicationType
21
22
  @return ModuleScript?
22
23
  ]=]
23
- function DependencyUtils.findDependency(requester, moduleName, requestedReplicationType)
24
+ function DependencyUtils.findDependency(
25
+ requester,
26
+ moduleName: string,
27
+ requestedReplicationType: ReplicationType.ReplicationType
28
+ ): ModuleScript?
24
29
  assert(typeof(requester) == "Instance", "Bad requester")
25
30
  assert(type(moduleName) == "string", "Bad moduleName")
26
31
  assert(ReplicationTypeUtils.isReplicationType(requestedReplicationType), "Bad requestedReplicationType")
27
32
 
28
33
  for packageInst in DependencyUtils.iterPackages(requester) do
29
- for module, replicationType in DependencyUtils.iterModules(packageInst, ReplicationType.SHARED) do
34
+ for module: ModuleScript, replicationType: ReplicationType.ReplicationType in
35
+ DependencyUtils.iterModules(packageInst, ReplicationType.SHARED)
36
+ do
30
37
  if module.Name == moduleName then
31
38
  if ReplicationTypeUtils.isAllowed(replicationType, requestedReplicationType) then
32
39
  return module
33
40
  else
34
- error(string.format("[DependencyUtils] - %q is not allowed in %q", moduleName, requestedReplicationType))
41
+ error(
42
+ string.format(
43
+ "[DependencyUtils] - %q is not allowed in %q",
44
+ moduleName,
45
+ requestedReplicationType
46
+ )
47
+ )
35
48
  end
36
49
  end
37
50
  end
@@ -40,20 +53,24 @@ function DependencyUtils.findDependency(requester, moduleName, requestedReplicat
40
53
  return nil
41
54
  end
42
55
 
43
- function DependencyUtils.iterModules(packageInst, ancestorReplicationType)
56
+ function DependencyUtils.iterModules(
57
+ packageInst: Instance,
58
+ ancestorReplicationType: ReplicationType.ReplicationType
59
+ ): () -> (ModuleScript, ReplicationType.ReplicationType)
44
60
  assert(typeof(packageInst) == "Instance", "Bad packageInst")
45
61
  assert(ReplicationTypeUtils.isReplicationType(ancestorReplicationType), "Bad ancestorReplicationType")
46
62
 
47
- return coroutine.wrap(function()
63
+ return coroutine.wrap(function(): any
48
64
  if packageInst:IsA("ModuleScript") then
49
65
  coroutine.yield(packageInst, ancestorReplicationType)
50
66
  return
51
67
  end
52
68
 
53
69
  -- Iterate over the package contents
54
- for _, item in pairs(packageInst:GetChildren()) do
55
- local itemName = item.Name
56
- local itemReplicationType = ReplicationTypeUtils.getFolderReplicationType(itemName, ancestorReplicationType)
70
+ for _, item in packageInst:GetChildren() do
71
+ local itemName: string = item.Name
72
+ local itemReplicationType: ReplicationType.ReplicationType =
73
+ ReplicationTypeUtils.getFolderReplicationType(itemName, ancestorReplicationType)
57
74
 
58
75
  if itemName ~= "node_modules" then
59
76
  for result, resultReplicationType in DependencyUtils.iterModules(item, itemReplicationType) do
@@ -61,13 +78,15 @@ function DependencyUtils.iterModules(packageInst, ancestorReplicationType)
61
78
  end
62
79
  end
63
80
  end
64
- end)
81
+
82
+ return
83
+ end) :: any
65
84
  end
66
85
 
67
- function DependencyUtils.iterPackages(requester)
86
+ function DependencyUtils.iterPackages(requester: Instance): () -> Instance
68
87
  assert(typeof(requester) == "Instance", "Bad requester")
69
88
 
70
- return coroutine.wrap(function()
89
+ return coroutine.wrap(function(): any
71
90
  for nodeModules in DependencyUtils.iterNodeModulesUp(requester) do
72
91
  coroutine.yield(nodeModules.Parent)
73
92
 
@@ -75,35 +94,39 @@ function DependencyUtils.iterPackages(requester)
75
94
  coroutine.yield(packageInst)
76
95
  end
77
96
  end
97
+
98
+ return
78
99
  end)
79
100
  end
80
101
 
81
- function DependencyUtils.iterNodeModulesUp(module)
102
+ function DependencyUtils.iterNodeModulesUp(module: Instance): () -> Instance
82
103
  assert(typeof(module) == "Instance", "Bad module")
83
104
 
84
- return coroutine.wrap(function()
105
+ return coroutine.wrap(function(): any
85
106
  local found = module:FindFirstChild("node_modules")
86
107
  if found and found:IsA("Folder") then
87
108
  coroutine.yield(found)
88
109
  end
89
110
 
90
- local current = module.Parent
111
+ local current: Instance? = module.Parent
91
112
  while current do
92
113
  found = current:FindFirstChild("node_modules")
93
114
  if found and found:IsA("Folder") then
94
115
  coroutine.yield(found)
95
116
  end
96
- current = current.Parent
117
+ current = current.Parent :: Instance?
97
118
  end
119
+
120
+ return
98
121
  end)
99
122
  end
100
123
 
101
- function DependencyUtils.iterPackagesInModuleModules(nodeModules)
102
- return coroutine.wrap(function()
103
- for _, item in pairs(nodeModules:GetChildren()) do
124
+ function DependencyUtils.iterPackagesInModuleModules(nodeModules: Instance): () -> Instance
125
+ return coroutine.wrap(function(): any
126
+ for _, item in nodeModules:GetChildren() do
104
127
  if item:IsA("Folder") then
105
128
  if DependencyUtils.isPackageGroup(item.Name) then
106
- for _, child in pairs(item:GetChildren()) do
129
+ for _, child in item:GetChildren() do
107
130
  if child:IsA("ModuleScript") or child:IsA("Folder") then
108
131
  coroutine.yield(child)
109
132
  elseif child:IsA("ObjectValue") then
@@ -137,10 +160,12 @@ function DependencyUtils.iterPackagesInModuleModules(nodeModules)
137
160
  end
138
161
  end
139
162
  end
163
+
164
+ return
140
165
  end)
141
166
  end
142
167
 
143
- function DependencyUtils.isPackageGroup(itemName)
168
+ function DependencyUtils.isPackageGroup(itemName: string): boolean
144
169
  return string.sub(itemName, 1, 1) == "@"
145
170
  end
146
171
 
@@ -1,3 +1,4 @@
1
+ --!strict
1
2
  --[=[
2
3
  For each package, track subdependent packages and packages
3
4
 
@@ -14,7 +15,29 @@ local PackageTracker = {}
14
15
  PackageTracker.ClassName = "PackageTracker"
15
16
  PackageTracker.__index = PackageTracker
16
17
 
17
- function PackageTracker.new(packageTrackerProvider, packageRoot)
18
+ export type ModuleScriptInfo = {
19
+ moduleScript: ModuleScript,
20
+ replicationType: ReplicationType.ReplicationType,
21
+ }
22
+
23
+ export type PackageTrackerProvider = {
24
+ FindPackageTracker: (self: PackageTrackerProvider, instance: Instance) -> PackageTracker?,
25
+ AddPackageRoot: (self: PackageTrackerProvider, instance: Instance) -> PackageTracker,
26
+ }
27
+
28
+ export type PackageTracker = typeof(setmetatable(
29
+ {} :: {
30
+ _maid: Maid.Maid,
31
+ _packageTrackerProvider: PackageTrackerProvider,
32
+ _packageRoot: Instance,
33
+ _subpackagesMap: { [string]: Instance },
34
+ _subpackagesTrackerList: { PackageTracker },
35
+ _packageModuleScriptMap: { [string]: ModuleScriptInfo },
36
+ },
37
+ PackageTracker
38
+ ))
39
+
40
+ function PackageTracker.new(packageTrackerProvider: PackageTrackerProvider, packageRoot: Instance): PackageTracker
18
41
  assert(packageTrackerProvider, "No packageTrackerProvider")
19
42
  assert(typeof(packageRoot) == "Instance", "Bad packageRoot")
20
43
 
@@ -24,23 +47,33 @@ function PackageTracker.new(packageTrackerProvider, packageRoot)
24
47
  self._packageTrackerProvider = assert(packageTrackerProvider, "No packageTrackerProvider")
25
48
  self._packageRoot = assert(packageRoot, "No packageRoot")
26
49
 
27
- self._subpackagesMap = {}
28
- self._subpackagesTrackerList = {}
29
- self._packageModuleScriptMap = {}
50
+ self._subpackagesMap = {} :: { [string]: Instance }
51
+ self._subpackagesTrackerList = {} :: { PackageTracker }
52
+ self._packageModuleScriptMap = {} :: { [string]: ModuleScriptInfo }
30
53
 
31
54
  return self
32
55
  end
33
56
 
34
- function PackageTracker:StartTracking()
57
+ function PackageTracker.StartTracking(self: PackageTracker)
58
+ local moduleScript: ModuleScript? = nil
35
59
  if self._packageRoot:IsA("ModuleScript") then
60
+ moduleScript = self._packageRoot
61
+ end
62
+
63
+ if moduleScript ~= nil then
36
64
  -- Module script children don't get to be observed
37
- self._maid:GiveTask(self:_trackModuleScript(self._packageRoot, ReplicationType.SHARED))
65
+ self._maid:GiveTask(self:_trackModuleScript(moduleScript, ReplicationType.SHARED))
38
66
  else
39
- self._maid:GiveTask(self:_trackChildren(self._packageRoot, ReplicationType.SHARED))
67
+ local root = self._packageRoot :: Instance
68
+ self._maid:GiveTask(self:_trackChildren(root, ReplicationType.SHARED))
40
69
  end
41
70
  end
42
71
 
43
- function PackageTracker:ResolveDependency(request, replicationType)
72
+ function PackageTracker.ResolveDependency(
73
+ self: PackageTracker,
74
+ request: string,
75
+ replicationType: ReplicationType.ReplicationType
76
+ ): ModuleScript?
44
77
  local packageModuleScript = self:FindPackageModuleScript(request, replicationType)
45
78
  if packageModuleScript then
46
79
  return packageModuleScript
@@ -59,7 +92,11 @@ function PackageTracker:ResolveDependency(request, replicationType)
59
92
  return nil
60
93
  end
61
94
 
62
- function PackageTracker:FindImplicitParentModuleScript(request, replicationType)
95
+ function PackageTracker.FindImplicitParentModuleScript(
96
+ self: PackageTracker,
97
+ request: string,
98
+ replicationType: ReplicationType.ReplicationType
99
+ ): ModuleScript?
63
100
  assert(type(request) == "string", "Bad request")
64
101
  assert(ReplicationTypeUtils.isReplicationType(replicationType), "Bad replicationType")
65
102
 
@@ -80,10 +117,14 @@ function PackageTracker:FindImplicitParentModuleScript(request, replicationType)
80
117
  return subpackageModuleScript
81
118
  end
82
119
 
83
- return parentProvider:FindImplicitParentModuleScript(request, replicationType)
120
+ return parentProvider:FindImplicitParentModuleScript(request, replicationType) :: ModuleScript?
84
121
  end
85
122
 
86
- function PackageTracker:FindPackageModuleScript(moduleScriptName, replicationType)
123
+ function PackageTracker.FindPackageModuleScript(
124
+ self: PackageTracker,
125
+ moduleScriptName: string,
126
+ replicationType: ReplicationType.ReplicationType
127
+ ): ModuleScript?
87
128
  assert(type(moduleScriptName) == "string", "Bad moduleScriptName")
88
129
  assert(ReplicationTypeUtils.isReplicationType(replicationType), "Bad replicationType")
89
130
 
@@ -100,11 +141,15 @@ function PackageTracker:FindPackageModuleScript(moduleScriptName, replicationTyp
100
141
  end
101
142
  end
102
143
 
103
- function PackageTracker:FindSubpackageModuleScript(moduleScriptName, replicationType)
144
+ function PackageTracker.FindSubpackageModuleScript(
145
+ self: PackageTracker,
146
+ moduleScriptName: string,
147
+ replicationType: ReplicationType.ReplicationType
148
+ ): ModuleScript?
104
149
  assert(type(moduleScriptName) == "string", "Bad moduleScriptName")
105
150
  assert(ReplicationTypeUtils.isReplicationType(replicationType), "Bad replicationType")
106
151
 
107
- for _, packageTracker in pairs(self._subpackagesTrackerList) do
152
+ for _, packageTracker in self._subpackagesTrackerList do
108
153
  local found = packageTracker._packageModuleScriptMap[moduleScriptName]
109
154
  if found then
110
155
  if ReplicationTypeUtils.isAllowed(found.replicationType, replicationType) then
@@ -118,16 +163,22 @@ function PackageTracker:FindSubpackageModuleScript(moduleScriptName, replication
118
163
  return nil
119
164
  end
120
165
 
121
- function PackageTracker:_trackChildrenAndReplicationType(parent, ancestorReplicationType)
166
+ function PackageTracker._trackChildrenAndReplicationType(
167
+ self: PackageTracker,
168
+ parent: Instance,
169
+ ancestorReplicationType: ReplicationType.ReplicationType
170
+ )
122
171
  assert(typeof(parent) == "Instance", "Bad parent")
123
172
  assert(ReplicationTypeUtils.isReplicationType(ancestorReplicationType), "Bad ancestorReplicationType")
124
173
 
125
174
  local maid = Maid.new()
126
175
 
127
- local lastReplicationType = ReplicationTypeUtils.getFolderReplicationType(parent.Name, ancestorReplicationType)
176
+ local lastReplicationType: ReplicationType.ReplicationType =
177
+ ReplicationTypeUtils.getFolderReplicationType(parent.Name, ancestorReplicationType)
128
178
 
129
179
  maid:GiveTask(parent:GetPropertyChangedSignal("Name"):Connect(function()
130
- local newReplicationType = ReplicationTypeUtils.getFolderReplicationType(parent.Name, ancestorReplicationType)
180
+ local newReplicationType: ReplicationType.ReplicationType =
181
+ ReplicationTypeUtils.getFolderReplicationType(parent.Name, ancestorReplicationType)
131
182
  if newReplicationType ~= lastReplicationType then
132
183
  maid._current = self:_trackChildren(parent, newReplicationType)
133
184
  lastReplicationType = newReplicationType
@@ -139,7 +190,11 @@ function PackageTracker:_trackChildrenAndReplicationType(parent, ancestorReplica
139
190
  return maid
140
191
  end
141
192
 
142
- function PackageTracker:_trackChildren(parent, ancestorReplicationType)
193
+ function PackageTracker._trackChildren(
194
+ self: PackageTracker,
195
+ parent: Instance,
196
+ ancestorReplicationType: ReplicationType.ReplicationType
197
+ ): Maid.Maid
143
198
  assert(typeof(parent) == "Instance", "Bad parent")
144
199
  assert(ReplicationTypeUtils.isReplicationType(ancestorReplicationType), "Bad ancestorReplicationType")
145
200
 
@@ -149,16 +204,21 @@ function PackageTracker:_trackChildren(parent, ancestorReplicationType)
149
204
  self:_handleChildAdded(maid, child, ancestorReplicationType)
150
205
  end))
151
206
  maid:GiveTask(parent.ChildRemoved:Connect(function(child)
152
- self:_handleChildRemoved(maid, child, ancestorReplicationType)
207
+ self:_handleChildRemoved(maid, child)
153
208
  end))
154
- for _, child in pairs(parent:GetChildren()) do
209
+ for _, child in parent:GetChildren() do
155
210
  self:_handleChildAdded(maid, child, ancestorReplicationType)
156
211
  end
157
212
 
158
213
  return maid
159
214
  end
160
215
 
161
- function PackageTracker:_handleChildAdded(parentMaid, child, ancestorReplicationType)
216
+ function PackageTracker._handleChildAdded(
217
+ self: PackageTracker,
218
+ parentMaid: Maid.Maid,
219
+ child: Instance,
220
+ ancestorReplicationType: ReplicationType.ReplicationType
221
+ )
162
222
  assert(Maid.isMaid(parentMaid), "Bad maid")
163
223
  assert(typeof(child) == "Instance", "Bad child")
164
224
  assert(ReplicationTypeUtils.isReplicationType(ancestorReplicationType), "Bad ancestorReplicationType")
@@ -170,15 +230,18 @@ function PackageTracker:_handleChildAdded(parentMaid, child, ancestorReplication
170
230
  end
171
231
  end
172
232
 
173
- function PackageTracker:_handleChildRemoved(parentMaid, child)
233
+ function PackageTracker._handleChildRemoved(_self: PackageTracker, parentMaid: Maid.Maid, child: Instance)
174
234
  assert(Maid.isMaid(parentMaid), "Bad maid")
175
235
  assert(typeof(child) == "Instance", "Bad child")
176
236
 
177
237
  parentMaid[child] = nil
178
238
  end
179
239
 
180
-
181
- function PackageTracker:_trackFolder(child, ancestorReplicationType)
240
+ function PackageTracker._trackFolder(
241
+ self: PackageTracker,
242
+ child: Instance,
243
+ ancestorReplicationType: ReplicationType.ReplicationType
244
+ )
182
245
  assert(typeof(child) == "Instance", "Bad child")
183
246
  assert(ReplicationTypeUtils.isReplicationType(ancestorReplicationType), "Bad ancestorReplicationType")
184
247
 
@@ -201,12 +264,14 @@ function PackageTracker:_trackFolder(child, ancestorReplicationType)
201
264
  return maid
202
265
  end
203
266
 
204
-
205
- function PackageTracker:_trackModuleScript(child, ancestorReplicationType)
267
+ function PackageTracker._trackModuleScript(
268
+ self: PackageTracker,
269
+ child: ModuleScript,
270
+ ancestorReplicationType: ReplicationType.ReplicationType
271
+ ): Maid.Maid
206
272
  assert(typeof(child) == "Instance", "Bad child")
207
273
  assert(ReplicationTypeUtils.isReplicationType(ancestorReplicationType), "Bad ancestorReplicationType")
208
274
 
209
-
210
275
  local maid = Maid.new()
211
276
 
212
277
  local function update()
@@ -225,7 +290,12 @@ function PackageTracker:_trackModuleScript(child, ancestorReplicationType)
225
290
  return maid
226
291
  end
227
292
 
228
- function PackageTracker:_storeModuleScript(moduleScriptName, child, ancestorReplicationType)
293
+ function PackageTracker._storeModuleScript(
294
+ self: PackageTracker,
295
+ moduleScriptName: string,
296
+ child: ModuleScript,
297
+ ancestorReplicationType: ReplicationType.ReplicationType
298
+ ): () -> ()
229
299
  assert(type(moduleScriptName) == "string", "Bad moduleScriptName")
230
300
  assert(typeof(child) == "Instance", "Bad child")
231
301
  assert(ReplicationTypeUtils.isReplicationType(ancestorReplicationType), "Bad ancestorReplicationType")
@@ -234,9 +304,9 @@ function PackageTracker:_storeModuleScript(moduleScriptName, child, ancestorRepl
234
304
  warn(string.format("[PackageTracker] - Overwriting moduleScript with name %q", moduleScriptName))
235
305
  end
236
306
 
237
- local data = {
238
- moduleScript = child;
239
- replicationType = ancestorReplicationType;
307
+ local data: ModuleScriptInfo = {
308
+ moduleScript = child,
309
+ replicationType = ancestorReplicationType,
240
310
  }
241
311
  self._packageModuleScriptMap[moduleScriptName] = data
242
312
 
@@ -247,7 +317,7 @@ function PackageTracker:_storeModuleScript(moduleScriptName, child, ancestorRepl
247
317
  end
248
318
  end
249
319
 
250
- function PackageTracker:_trackMainNodeModuleFolder(parent)
320
+ function PackageTracker._trackMainNodeModuleFolder(self: PackageTracker, parent: Instance): Maid.Maid
251
321
  local maid = Maid.new()
252
322
 
253
323
  maid:GiveTask(parent.ChildAdded:Connect(function(child)
@@ -256,15 +326,14 @@ function PackageTracker:_trackMainNodeModuleFolder(parent)
256
326
  maid:GiveTask(parent.ChildRemoved:Connect(function(child)
257
327
  self:_handleNodeModulesChildRemoved(maid, child)
258
328
  end))
259
- for _, child in pairs(parent:GetChildren()) do
329
+ for _, child in parent:GetChildren() do
260
330
  self:_handleNodeModulesChildAdded(maid, child)
261
331
  end
262
332
 
263
333
  return maid
264
334
  end
265
335
 
266
-
267
- function PackageTracker:_handleNodeModulesChildAdded(parentMaid, child)
336
+ function PackageTracker._handleNodeModulesChildAdded(self: PackageTracker, parentMaid: Maid.Maid, child: Instance)
268
337
  assert(Maid.isMaid(parentMaid), "Bad maid")
269
338
  assert(typeof(child) == "Instance", "Bad child")
270
339
 
@@ -278,19 +347,19 @@ function PackageTracker:_handleNodeModulesChildAdded(parentMaid, child)
278
347
  end
279
348
  end
280
349
 
281
- function PackageTracker:_handleNodeModulesChildRemoved(parentMaid, child)
350
+ function PackageTracker._handleNodeModulesChildRemoved(_self: PackageTracker, parentMaid: Maid.Maid, child: Instance)
282
351
  assert(Maid.isMaid(parentMaid), "Bad maid")
283
352
  assert(typeof(child) == "Instance", "Bad child")
284
353
 
285
354
  parentMaid[child] = nil
286
355
  end
287
356
 
288
- function PackageTracker:_trackNodeModulesChildFolder(child)
357
+ function PackageTracker._trackNodeModulesChildFolder(self: PackageTracker, child: Instance): Maid.Maid
289
358
  assert(typeof(child) == "Instance", "Bad child")
290
359
 
291
360
  local maid = Maid.new()
292
361
 
293
- local function update()
362
+ local function update(): Maid.MaidTask
294
363
  local childName = child.Name
295
364
 
296
365
  -- like @quenty
@@ -310,7 +379,7 @@ function PackageTracker:_trackNodeModulesChildFolder(child)
310
379
  return maid
311
380
  end
312
381
 
313
- function PackageTracker:_trackNodeModulesObjectValue(objectValue)
382
+ function PackageTracker._trackNodeModulesObjectValue(self: PackageTracker, objectValue: ObjectValue): Maid.Maid
314
383
  assert(typeof(objectValue) == "Instance", "Bad objectValue")
315
384
 
316
385
  local maid = Maid.new()
@@ -327,7 +396,7 @@ function PackageTracker:_trackNodeModulesObjectValue(objectValue)
327
396
  return maid
328
397
  end
329
398
 
330
- function PackageTracker:_trackScopedChildFolder(scopeName, parent)
399
+ function PackageTracker._trackScopedChildFolder(self: PackageTracker, scopeName: string, parent: Instance): Maid.Maid
331
400
  assert(type(scopeName) == "string", "Bad scopeName")
332
401
  assert(typeof(parent) == "Instance", "Bad parent")
333
402
 
@@ -339,14 +408,19 @@ function PackageTracker:_trackScopedChildFolder(scopeName, parent)
339
408
  maid:GiveTask(parent.ChildRemoved:Connect(function(child)
340
409
  self:_handleScopedModulesChildRemoved(maid, child)
341
410
  end))
342
- for _, child in pairs(parent:GetChildren()) do
411
+ for _, child in parent:GetChildren() do
343
412
  self:_handleScopedModulesChildAdded(scopeName, maid, child)
344
413
  end
345
414
 
346
415
  return maid
347
416
  end
348
417
 
349
- function PackageTracker:_handleScopedModulesChildAdded(scopeName, parentMaid, child)
418
+ function PackageTracker._handleScopedModulesChildAdded(
419
+ self: PackageTracker,
420
+ scopeName: string,
421
+ parentMaid: Maid.Maid,
422
+ child: Instance
423
+ )
350
424
  assert(type(scopeName) == "string", "Bad scopeName")
351
425
  assert(Maid.isMaid(parentMaid), "Bad maid")
352
426
  assert(typeof(child) == "Instance", "Bad child")
@@ -358,7 +432,11 @@ function PackageTracker:_handleScopedModulesChildAdded(scopeName, parentMaid, ch
358
432
  end
359
433
  end
360
434
 
361
- function PackageTracker:_trackScopedNodeModulesObjectValue(scopeName, objectValue)
435
+ function PackageTracker._trackScopedNodeModulesObjectValue(
436
+ self: PackageTracker,
437
+ scopeName: string,
438
+ objectValue: ObjectValue
439
+ )
362
440
  assert(type(scopeName) == "string", "Bad scopeName")
363
441
  assert(typeof(objectValue) == "Instance", "Bad objectValue")
364
442
 
@@ -376,14 +454,14 @@ function PackageTracker:_trackScopedNodeModulesObjectValue(scopeName, objectValu
376
454
  return maid
377
455
  end
378
456
 
379
- function PackageTracker:_handleScopedModulesChildRemoved(parentMaid, child)
457
+ function PackageTracker._handleScopedModulesChildRemoved(_self: PackageTracker, parentMaid: Maid.Maid, child: Instance)
380
458
  assert(Maid.isMaid(parentMaid), "Bad maid")
381
459
  assert(typeof(child) == "Instance", "Bad child")
382
460
 
383
461
  parentMaid[child] = nil
384
462
  end
385
463
 
386
- function PackageTracker:_trackAddScopedPackage(scopeName, child)
464
+ function PackageTracker._trackAddScopedPackage(self: PackageTracker, scopeName: string, child: Instance)
387
465
  assert(type(scopeName) == "string", "Bad scopeName")
388
466
  assert(typeof(child) == "Instance", "Bad child")
389
467
 
@@ -398,7 +476,7 @@ function PackageTracker:_trackAddScopedPackage(scopeName, child)
398
476
  return maid
399
477
  end
400
478
 
401
- function PackageTracker:_trackAddPackage(child)
479
+ function PackageTracker._trackAddPackage(self: PackageTracker, child: Instance)
402
480
  assert(typeof(child) == "Instance", "Bad child")
403
481
 
404
482
  local maid = Maid.new()
@@ -412,7 +490,11 @@ function PackageTracker:_trackAddPackage(child)
412
490
  return maid
413
491
  end
414
492
 
415
- function PackageTracker:_tryStorePackage(fullPackageName, packageInst)
493
+ function PackageTracker._tryStorePackage(
494
+ self: PackageTracker,
495
+ fullPackageName: string,
496
+ packageInst: Instance?
497
+ ): (() -> ())?
416
498
  assert(type(fullPackageName) == "string", "Bad fullPackageName")
417
499
 
418
500
  if not packageInst then
@@ -436,7 +518,7 @@ function PackageTracker:_tryStorePackage(fullPackageName, packageInst)
436
518
  end
437
519
  end
438
520
 
439
- function PackageTracker:Destroy()
521
+ function PackageTracker.Destroy(self: PackageTracker)
440
522
  self._maid:DoCleaning()
441
523
  end
442
524
 
@@ -1,3 +1,4 @@
1
+ --!strict
1
2
  --[=[
2
3
  @class PackageTrackerProvider
3
4
  ]=]
@@ -11,7 +12,16 @@ local PackageTrackerProvider = {}
11
12
  PackageTrackerProvider.ClassName = "PackageTrackerProvider"
12
13
  PackageTrackerProvider.__index = PackageTrackerProvider
13
14
 
14
- function PackageTrackerProvider.new()
15
+ export type PackageTrackerProvider = typeof(setmetatable(
16
+ {} :: {
17
+ _packageTrackersRoots: { [Instance]: PackageTracker.PackageTracker },
18
+ _maid: Maid.Maid,
19
+ _trackCount: number,
20
+ },
21
+ PackageTrackerProvider
22
+ ))
23
+
24
+ function PackageTrackerProvider.new(): PackageTrackerProvider
15
25
  local self = setmetatable({}, PackageTrackerProvider)
16
26
 
17
27
  self._maid = Maid.new()
@@ -21,28 +31,37 @@ function PackageTrackerProvider.new()
21
31
  return self
22
32
  end
23
33
 
24
- function PackageTrackerProvider:AddPackageRoot(instance)
34
+ function PackageTrackerProvider.AddPackageRoot(
35
+ self: PackageTrackerProvider,
36
+ instance: Instance
37
+ ): PackageTracker.PackageTracker
25
38
  assert(typeof(instance) == "Instance", "Bad instance")
26
39
 
27
40
  if self._packageTrackersRoots[instance] then
28
41
  return self._packageTrackersRoots[instance]
29
42
  end
30
43
 
31
- self._trackCount = self._trackCount + 1
44
+ self._trackCount += 1
32
45
 
33
46
  local maid = Maid.new()
34
47
 
35
- self._packageTrackersRoots[instance] = maid:Add(PackageTracker.new(self, instance))
48
+ local packageTracker = PackageTracker.new(self :: any, instance)
49
+ maid:GiveTask(packageTracker)
50
+
51
+ self._packageTrackersRoots[instance] = packageTracker
36
52
  self._maid[instance] = maid
37
53
 
38
- self._packageTrackersRoots[instance]:StartTracking()
54
+ packageTracker:StartTracking()
39
55
 
40
56
  -- TODO: Provide cleanup mechanism
41
57
 
42
58
  return self._packageTrackersRoots[instance]
43
59
  end
44
60
 
45
- function PackageTrackerProvider:FindPackageTracker(instance)
61
+ function PackageTrackerProvider.FindPackageTracker(
62
+ self: PackageTrackerProvider,
63
+ instance: Instance
64
+ ): PackageTracker.PackageTracker?
46
65
  assert(typeof(instance) == "Instance", "Bad instance")
47
66
 
48
67
  local current = instance
@@ -51,13 +70,13 @@ function PackageTrackerProvider:FindPackageTracker(instance)
51
70
  return self._packageTrackersRoots[current]
52
71
  end
53
72
 
54
- current = current.Parent
73
+ current = current.Parent :: Instance
55
74
  end
56
75
 
57
76
  return nil
58
77
  end
59
78
 
60
- function PackageTrackerProvider:Destroy()
79
+ function PackageTrackerProvider.Destroy(self: PackageTrackerProvider)
61
80
  self._maid:DoCleaning()
62
81
  end
63
82
 
@@ -1,3 +1,4 @@
1
+ --!nocheck
1
2
  --[=[
2
3
  This class is linking to the Nevermore loader.
3
4
 
@@ -13,7 +14,7 @@
13
14
  @class LoaderLink
14
15
  ]=]
15
16
 
16
- local function waitForValue(objectValue)
17
+ local function waitForValue(objectValue: ObjectValue): Instance
17
18
  local value = objectValue.Value
18
19
  if value then
19
20
  return value