@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 +11 -0
- package/package.json +2 -2
- package/src/Dependencies/DependencyUtils.lua +45 -20
- package/src/Dependencies/PackageTracker.lua +129 -47
- package/src/Dependencies/PackageTrackerProvider.lua +27 -8
- package/src/LoaderLink/LoaderLink.lua +2 -1
- package/src/LoaderLink/LoaderLinkCreator.lua +41 -21
- package/src/LoaderLink/LoaderLinkUtils.lua +2 -1
- package/src/LoaderUtils.lua +1 -0
- package/src/Maid.lua +43 -29
- package/src/Replication/ReplicationType.lua +16 -5
- package/src/Replication/ReplicationTypeUtils.lua +8 -4
- package/src/Replication/Replicator.lua +112 -70
- package/src/Replication/ReplicatorReferences.lua +22 -12
- package/src/Utils.lua +44 -17
- package/src/init.lua +1 -1
- package/src/Replication/ReplicatorUtils.lua +0 -25
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.
|
|
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": "
|
|
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(
|
|
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
|
|
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(
|
|
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(
|
|
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
|
|
55
|
-
local itemName = item.Name
|
|
56
|
-
local itemReplicationType
|
|
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
|
-
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|
|
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(
|
|
65
|
+
self._maid:GiveTask(self:_trackModuleScript(moduleScript, ReplicationType.SHARED))
|
|
38
66
|
else
|
|
39
|
-
self.
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
207
|
+
self:_handleChildRemoved(maid, child)
|
|
153
208
|
end))
|
|
154
|
-
for _, child in
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|
|
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
|
|
44
|
+
self._trackCount += 1
|
|
32
45
|
|
|
33
46
|
local maid = Maid.new()
|
|
34
47
|
|
|
35
|
-
|
|
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
|
-
|
|
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
|
|
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
|
|
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
|