@@ -2,6 +2,7 @@ import * as upath from 'upath';
2
2
import { XmlDocument } from 'xmldoc' ;
3
3
import { logger } from '../../../logger' ;
4
4
import * as packageCache from '../../../util/cache/package' ;
5
+ import { cache } from '../../../util/cache/package/decorator' ;
5
6
import { Http } from '../../../util/http' ;
6
7
import { regEx } from '../../../util/regex' ;
7
8
import { ensureTrailingSlash , trimTrailingSlash } from '../../../util/url' ;
@@ -10,6 +11,7 @@ import { compare } from '../../versioning/maven/compare';
10
11
import { MavenDatasource } from '../maven' ;
11
12
import { MAVEN_REPO } from '../maven/common' ;
12
13
import { downloadHttpProtocol } from '../maven/util' ;
14
+ import { normalizeDate } from '../metadata' ;
13
15
import type {
14
16
GetReleasesConfig ,
15
17
PostprocessReleaseConfig ,
@@ -26,6 +28,12 @@ interface ScalaDepCoordinate {
26
28
scalaVersion ?: string ;
27
29
}
28
30
31
+ interface PomInfo {
32
+ homepage ?: string ;
33
+ sourceUrl ?: string ;
34
+ releaseTimestamp ?: string ;
35
+ }
36
+
29
37
export class SbtPackageDatasource extends MavenDatasource {
30
38
static override readonly id = 'sbt-package' ;
31
39
@@ -187,6 +195,11 @@ export class SbtPackageDatasource extends MavenDatasource {
187
195
return null ;
188
196
}
189
197
198
+ const releases : Release [ ] = [ ...allVersions ]
199
+ . sort ( compare )
200
+ . map ( ( version ) => ( { version } ) ) ;
201
+ const res : ReleaseResult = { releases, dependencyUrl } ;
202
+
190
203
const latestVersion = getLatestVersion ( versions ) ;
191
204
const pomInfo = await this . getPomInfo (
192
205
registryUrl ,
@@ -195,20 +208,23 @@ export class SbtPackageDatasource extends MavenDatasource {
195
208
packageUrls ,
196
209
) ;
197
210
198
- const releases : Release [ ] = [ ...allVersions ]
199
- . sort ( compare )
200
- . map ( ( version ) => ( { version } ) ) ;
201
- return { releases, dependencyUrl, ...pomInfo } ;
211
+ if ( pomInfo ?. homepage ) {
212
+ res . homepage = pomInfo . homepage ;
213
+ }
214
+
215
+ if ( pomInfo ?. sourceUrl ) {
216
+ res . sourceUrl = pomInfo . sourceUrl ;
217
+ }
218
+
219
+ return res ;
202
220
}
203
221
204
222
async getPomInfo (
205
223
registryUrl : string ,
206
224
packageName : string ,
207
225
version : string | null ,
208
226
pkgUrls ?: string [ ] ,
209
- ) : Promise < Pick < ReleaseResult , 'homepage' | 'sourceUrl' > > {
210
- const result : Pick < ReleaseResult , 'homepage' | 'sourceUrl' > = { } ;
211
-
227
+ ) : Promise < PomInfo | null > {
212
228
const packageUrlsKey = `package-urls:${ registryUrl } :${ packageName } ` ;
213
229
// istanbul ignore next: will be covered later
214
230
const packageUrls =
@@ -220,12 +236,12 @@ export class SbtPackageDatasource extends MavenDatasource {
220
236
221
237
// istanbul ignore if
222
238
if ( ! packageUrls ?. length ) {
223
- return result ;
239
+ return null ;
224
240
}
225
241
226
242
// istanbul ignore if
227
243
if ( ! version ) {
228
- return result ;
244
+ return null ;
229
245
}
230
246
231
247
const invalidPomFilesKey = `invalid-pom-files:${ registryUrl } :${ packageName } :${ version } ` ;
@@ -265,6 +281,13 @@ export class SbtPackageDatasource extends MavenDatasource {
265
281
continue ;
266
282
}
267
283
284
+ const result : PomInfo = { } ;
285
+
286
+ const releaseTimestamp = normalizeDate ( res . headers [ 'last-modified' ] ) ;
287
+ if ( releaseTimestamp ) {
288
+ result . releaseTimestamp = releaseTimestamp ;
289
+ }
290
+
268
291
const pomXml = new XmlDocument ( content ) ;
269
292
270
293
const homepage = pomXml . valueWithPath ( 'url' ) ;
@@ -287,7 +310,7 @@ export class SbtPackageDatasource extends MavenDatasource {
287
310
}
288
311
289
312
await saveCache ( ) ;
290
- return result ;
313
+ return null ;
291
314
}
292
315
293
316
override async getReleases (
@@ -316,12 +339,33 @@ export class SbtPackageDatasource extends MavenDatasource {
316
339
return null ;
317
340
}
318
341
319
- // istanbul ignore next: to be rewritten
342
+ @cache ( {
343
+ namespace : 'datasource-sbt-package' ,
344
+ key : (
345
+ { registryUrl, packageName } : PostprocessReleaseConfig ,
346
+ { version } : Release ,
347
+ ) => `postprocessRelease:${ registryUrl } :${ packageName } :${ version } ` ,
348
+ ttlMinutes : 30 * 24 * 60 ,
349
+ } )
320
350
override async postprocessRelease (
321
351
config : PostprocessReleaseConfig ,
322
352
release : Release ,
323
353
) : Promise < PostprocessReleaseResult > {
324
- const mavenResult = await super . postprocessRelease ( config , release ) ;
325
- return mavenResult === 'reject' ? release : mavenResult ;
354
+ // istanbul ignore if
355
+ if ( ! config . registryUrl ) {
356
+ return release ;
357
+ }
358
+
359
+ const res = await this . getPomInfo (
360
+ config . registryUrl ,
361
+ config . packageName ,
362
+ release . version ,
363
+ ) ;
364
+
365
+ if ( res ?. releaseTimestamp ) {
366
+ release . releaseTimestamp = res . releaseTimestamp ;
367
+ }
368
+
369
+ return release ;
326
370
}
327
371
}
0 commit comments