@@ -5,6 +5,10 @@ atomic.package = atomic.package or {
55 _pathMap = {}
66}
77
8+ --- @include
9+ atomic .loader .shared (" config.lua" )
10+ atomic .loader .shared (" class.lua" )
11+
812local packageClass = atomic .class .get (" Package" )
913
1014--- @cast packageClass Atomic.Package
3034--- @param id string
3135--- @param version string
3236function atomic .package .get (id , version )
33- return (atomic .package ._storage [id ] or {})[version ]
37+ local packages = atomic .package ._storage [id ]
38+
39+ if (not packages ) then
40+ return
41+ end
42+
43+ for ver , package in pairs (packages ) do
44+ if (util .IsVersionSuitable (ver , version )) then
45+ return package
46+ end
47+ end
3448end
3549
3650--- Searches for packages along the specified path
@@ -93,10 +107,11 @@ function atomic.package.load(package)
93107
94108 local packageInstance = atomic .package .new (package )
95109
110+ --- @diagnostic disable-next-line
96111 atomic .package ._pathMap [package ._path ] = { package .id , package .version }
97112
98113 --- @cast packageInstance Atomic.Package
99- if packageInstance .atomic and not util .IsVersionSuitable (packageInstance . atomic .version , atomic . meta .version ) then
114+ if packageInstance .atomic and not util .IsVersionSuitable (atomic .meta . version , packageInstance . atomic .version ) then
100115 atomic .log :err (
101116 " package `%s` requires atomic %s, but current is %s" ,
102117 packageInstance .id , tostring (packageInstance .atomic .version ), tostring (atomic .meta .version )
@@ -128,17 +143,32 @@ function atomic.package.loadMany(packages)
128143
129144 local packagesCache = {}
130145
146+ local findPackage = function (id , version )
147+ local packagesCached = packagesCache [id ]
148+ local cached = packagesCached and packagesCached [version ]
149+
150+ return cached or atomic .package .get (id , version )
151+ end
152+
153+ local insertPackage = function (id , version , package )
154+ if (not packagesCache [id ]) then
155+ packagesCache [id ] = {}
156+ end
157+
158+ packagesCache [id ][version ] = package
159+ end
160+
131161 for _ , pkg in ipairs (packages ) do
132- if not pkg .id or not pkg .version then
162+ local id , version = pkg .id , pkg .version
163+ if not id or not version then
133164 atomic .log :err (" invalid package detected (missing id/version), skipping." )
134165 continue
135166 end
136167
137- local key = pkg .id .. " @" .. pkg .version
138- if packagesCache [key ] then
168+ if findPackage (id , version ) then
139169 atomic .log :warn (" duplicate package `%s@%s` ignored." , pkg .id , pkg .version )
140170 else
141- packagesCache [ key ] = pkg
171+ insertPackage ( id , version , pkg )
142172 end
143173 end
144174
@@ -148,7 +178,7 @@ function atomic.package.loadMany(packages)
148178 local deps = pkg .dependencies
149179 if type (deps ) == " table" then
150180 for depId , depVersion in pairs (deps ) do
151- if not packagesCache [ depId .. " @ " .. depVersion ] then
181+ if not findPackage ( depId , depVersion ) then
152182 atomic .log :err (" dependency `%s` version %s is required for `%s`, but was not found." , depId , depVersion , pkg .id )
153183 table.insert (toRemove , id )
154184 break
@@ -166,15 +196,15 @@ function atomic.package.loadMany(packages)
166196 end
167197
168198 local indegree = {}
169- for _ , pkg in pairs (packagesCache ) do
170- indegree [pkg .id ] = 0
199+ for id in pairs (packagesCache ) do
200+ -- todo version
201+ indegree [id ] = 0
171202 end
172203
173204 for _ , pkg in pairs (packagesCache ) do
174205 if type (pkg .dependencies ) == " table" then
175206 for depId , depVersion in pairs (pkg .dependencies ) do
176- local depKey = depId .. " @" .. depVersion
177- if packagesCache [depKey ] then
207+ if findPackage (depId , depVersion ) then
178208 indegree [pkg .id ] = (indegree [pkg .id ] or 0 ) + 1
179209 end
180210 end
@@ -192,8 +222,8 @@ function atomic.package.loadMany(packages)
192222 for _ , pkg in pairs (packagesCache ) do
193223 if type (pkg .dependencies ) == " table" then
194224 for depId , depVersion in pairs (pkg .dependencies ) do
195- local depKey = depId .. " @ " .. depVersion
196- if packagesCache [ depKey ] and depId == id then
225+ local depdendency = findPackage ( depId , depVersion )
226+ if depdendency and depId == depdendency . id then
197227 indegree [pkg .id ] = indegree [pkg .id ] - 1
198228 if indegree [pkg .id ] == 0 then table.insert (queue , pkg .id ) end
199229 end
@@ -208,10 +238,12 @@ function atomic.package.loadMany(packages)
208238 return
209239 end
210240
211- for _ , id in ipairs (loadOrder ) do
212- for _ , pkg in pairs (packagesCache ) do
213- if pkg .id == id then
214- atomic .package .load (pkg )
241+ for _ , orderId in ipairs (loadOrder ) do
242+ for id , pkgs in pairs (packagesCache ) do
243+ for _version , pkg in pairs (pkgs ) do
244+ if id == orderId then
245+ atomic .package .load (pkg )
246+ end
215247 end
216248 end
217249 end
0 commit comments