77use Cake \Console \Arguments ;
88use Cake \Console \CommandFactoryInterface ;
99use Cake \Console \ConsoleIo ;
10+ use Cake \I18n \Date ;
1011use Cake \Log \Log ;
1112use Composer \Semver \Intervals ;
1213use Composer \Semver \VersionParser ;
1314use Packagist \Api \Client ;
15+ use Packagist \Api \Result \Package \Version ;
1416use UnexpectedValueException ;
1517
1618/**
@@ -139,7 +141,7 @@ public function execute(Arguments $args, ConsoleIo $io)
139141
140142 /**
141143 * @param string $packageName
142- * @return array{package: string, description: string, repo_url: string, downloads: int, stars: int, tag_list: array, latest_stable_version: ?string, is_abandoned: bool}
144+ * @return array{package: string, description: string, repo_url: string, downloads: int, stars: int, tag_list: array, latest_stable_version: ?string, latest_stable_release_date: ?\Cake\I18n\Date, is_abandoned: bool}
143145 */
144146 private function getDataForPackage (string $ packageName ): array
145147 {
@@ -155,6 +157,7 @@ private function getDataForPackage(string $packageName): array
155157 'stars ' => $ metaDetails ->getGithubStars (),
156158 'tag_list ' => [],
157159 'latest_stable_version ' => null ,
160+ 'latest_stable_release_date ' => null ,
158161 'is_abandoned ' => true ,
159162 ];
160163 }
@@ -183,10 +186,14 @@ private function getDataForPackage(string $packageName): array
183186 }
184187 }
185188
186- $ stableVersions = array_filter ($ versions , fn ($ v ) => preg_match ('/^v?\d+\.\d+(\.\d+)?$/ ' , $ v ->getVersion ()));
189+ $ stableVersions = array_filter (
190+ $ versions ,
191+ fn (Version $ version ) => preg_match ('/^v?\d+\.\d+(\.\d+)?$/ ' , $ version ->getVersion ()),
192+ );
187193 usort ($ stableVersions , function ($ a , $ b ) {
188194 return version_compare ($ a ->getVersion (), $ b ->getVersion ());
189195 });
196+ /** @var \Packagist\Api\Result\Package\Version|false $latestStable */
190197 $ latestStable = end ($ stableVersions );
191198
192199 return [
@@ -197,10 +204,24 @@ private function getDataForPackage(string $packageName): array
197204 'stars ' => $ metaDetails ->getGithubStars (),
198205 'tag_list ' => $ meta ,
199206 'latest_stable_version ' => $ latestStable ? $ latestStable ->getVersion () : null ,
207+ 'latest_stable_release_date ' => $ this ->extractReleaseDate ($ latestStable ?: null ),
200208 'is_abandoned ' => $ metaDetails ->isAbandoned (),
201209 ];
202210 }
203211
212+ /**
213+ * @param \Packagist\Api\Result\Package\Version|null $version
214+ * @return \Cake\I18n\Date|null
215+ */
216+ private function extractReleaseDate (?Version $ version ): ?Date
217+ {
218+ if (!$ version || $ version ->getTime () === '' ) {
219+ return null ;
220+ }
221+
222+ return new Date ($ version ->getTime ());
223+ }
224+
204225 /**
205226 * @param list<string> $tags
206227 * @return bool
0 commit comments