From 63eea19a64ffa0b67492abe0e4e440f0969f86fd Mon Sep 17 00:00:00 2001 From: Sergei Zharinov Date: Thu, 16 Jan 2025 12:44:13 -0300 Subject: [PATCH 1/8] feat(timestamp): Parse number-like dates plus offset --- lib/util/timestamp.spec.ts | 2 ++ lib/util/timestamp.ts | 9 +++++++++ 2 files changed, 11 insertions(+) diff --git a/lib/util/timestamp.spec.ts b/lib/util/timestamp.spec.ts index c084c062f3025e..1926ea478aed71 100644 --- a/lib/util/timestamp.spec.ts +++ b/lib/util/timestamp.spec.ts @@ -17,6 +17,8 @@ describe('util/timestamp', () => { ${'2021-01-01'} | ${'2021-01-01T00:00:00.000Z'} ${'20210101000000'} | ${'2021-01-01T00:00:00.000Z'} ${'20211231235959'} | ${'2021-12-31T23:59:59.000Z'} + ${'20210101000000+0000'} | ${'2021-01-01T00:00:00.000Z'} + ${'20211231235959+0000'} | ${'2021-12-31T23:59:59.000Z'} ${'Jan 1, 2021'} | ${'2021-01-01T00:00:00.000Z'} ${'2021/01/01'} | ${'2021-01-01T00:00:00.000Z'} ${'2021-01-02T00:00:00+05:30'} | ${'2021-01-01T18:30:00.000Z'} diff --git a/lib/util/timestamp.ts b/lib/util/timestamp.ts index b40fd93ead2d2a..5c0e3d32b9c9c1 100644 --- a/lib/util/timestamp.ts +++ b/lib/util/timestamp.ts @@ -64,6 +64,15 @@ export function asTimestamp(input: unknown): Timestamp | null { return numberLikeDate.toISO() as Timestamp; } + const numberLikeOffsetDate = DateTime.fromFormat( + input, + 'yyyyMMddHHmmssZZZ', + { zone: 'UTC' }, + ); + if (isValid(numberLikeOffsetDate)) { + return numberLikeOffsetDate.toISO() as Timestamp; + } + const fallbackDate = DateTime.fromMillis( Date.parse(input) - timezoneOffset, { zone: 'UTC' }, From 50c077ce3c179c08d9ce0d6e60681184fda953b5 Mon Sep 17 00:00:00 2001 From: Sergei Zharinov Date: Thu, 16 Jan 2025 12:48:31 -0300 Subject: [PATCH 2/8] feat: Switch to `Timestamp` type --- lib/config/types.ts | 3 +- .../datasource/aws-machine-image/index.ts | 3 +- .../datasource/bitbucket-tags/index.ts | 3 +- lib/modules/datasource/bitrise/schema.ts | 3 +- lib/modules/datasource/cpan/schema.ts | 3 +- lib/modules/datasource/crate/index.spec.ts | 2 +- lib/modules/datasource/crate/index.ts | 2 +- lib/modules/datasource/crate/schema.ts | 3 +- lib/modules/datasource/custom/schema.ts | 3 +- lib/modules/datasource/dart/index.ts | 3 +- lib/modules/datasource/deno/schema.ts | 10 +- lib/modules/datasource/devbox/schema.ts | 3 +- lib/modules/datasource/docker/index.ts | 8 +- .../datasource/dotnet-version/schema.ts | 3 +- .../datasource/endoflife-date/schema.ts | 3 +- .../datasource/flutter-version/index.ts | 3 +- .../datasource/galaxy-collection/schema.ts | 3 +- lib/modules/datasource/galaxy/index.ts | 19 +- lib/modules/datasource/galaxy/schema.ts | 14 +- .../datasource/gitea-releases/schema.ts | 3 +- lib/modules/datasource/gitea-tags/schema.ts | 3 +- .../github-release-attachments/index.spec.ts | 11 +- .../datasource/github-releases/index.spec.ts | 27 ++- .../datasource/github-tags/index.spec.ts | 21 ++- .../datasource/gitlab-packages/index.ts | 3 +- .../datasource/gitlab-releases/index.ts | 3 +- lib/modules/datasource/gitlab-tags/index.ts | 3 +- .../releases-direct.spec.ts.snap | 16 +- .../datasource/go/releases-direct.spec.ts | 6 +- .../datasource/go/releases-goproxy.spec.ts | 50 ++--- lib/modules/datasource/go/releases-goproxy.ts | 14 +- .../datasource/golang-version/index.ts | 5 +- .../datasource/gradle-version/index.ts | 22 +-- lib/modules/datasource/helm/schema.ts | 3 +- lib/modules/datasource/hex/schema.ts | 3 +- lib/modules/datasource/hexpm-bob/index.ts | 3 +- .../datasource/jenkins-plugins/index.spec.ts | 11 +- .../datasource/jenkins-plugins/index.ts | 4 +- .../datasource/jenkins-plugins/types.ts | 4 +- lib/modules/datasource/maven/index.ts | 3 +- lib/modules/datasource/metadata.spec.ts | 174 ++++++++++++++---- lib/modules/datasource/node-version/index.ts | 3 +- lib/modules/datasource/npm/get.ts | 6 +- lib/modules/datasource/nuget/v2.ts | 5 +- lib/modules/datasource/nuget/v3.ts | 10 +- lib/modules/datasource/orb/index.ts | 3 +- .../datasource/packagist/schema.spec.ts | 20 +- lib/modules/datasource/packagist/schema.ts | 3 +- .../datasource/postprocess-release.spec.ts | 3 +- lib/modules/datasource/puppet-forge/index.ts | 3 +- lib/modules/datasource/pypi/index.ts | 3 +- .../datasource/python-version/index.spec.ts | 9 +- .../datasource/python-version/schema.ts | 3 +- lib/modules/datasource/ruby-version/index.ts | 3 +- .../rubygems/metadata-cache.spec.ts | 6 +- .../datasource/rubygems/schema.spec.ts | 6 +- lib/modules/datasource/rubygems/schema.ts | 3 +- lib/modules/datasource/sbt-package/index.ts | 6 +- .../datasource/terraform-module/index.ts | 3 +- .../datasource/terraform-provider/index.ts | 3 +- lib/modules/datasource/types.ts | 3 +- lib/modules/datasource/unity3d/index.ts | 3 +- lib/modules/manager/types.ts | 3 +- .../memory-cache-strategy.spec.ts | 3 +- .../package-cache-strategy.spec.ts | 3 +- .../github/graphql/datasource-fetcher.spec.ts | 3 +- lib/util/github/graphql/index.spec.ts | 2 +- .../releases-query-adapter.spec.ts | 5 +- .../query-adapters/releases-query-adapter.ts | 3 +- .../query-adapters/tags-query-adapter.spec.ts | 9 +- .../query-adapters/tags-query-adapter.ts | 5 +- lib/util/github/graphql/types.ts | 3 +- lib/util/github/tags.spec.ts | 5 +- .../repository/process/libyear.spec.ts | 13 +- .../process/lookup/filter-checks.spec.ts | 9 +- .../repository/process/lookup/filter.spec.ts | 11 +- .../repository/process/lookup/index.spec.ts | 170 +++++++++-------- .../repository/update/branch/index.spec.ts | 15 +- .../update/pr/changelog/gitea/index.spec.ts | 8 +- .../update/pr/changelog/github/index.spec.ts | 8 +- .../update/pr/changelog/gitlab/index.spec.ts | 8 +- .../update/pr/changelog/index.spec.ts | 8 +- .../update/pr/changelog/release-notes.spec.ts | 57 +++--- .../repository/updates/generate.spec.ts | 29 +-- lib/workers/repository/updates/generate.ts | 3 +- lib/workers/types.ts | 5 +- 86 files changed, 577 insertions(+), 404 deletions(-) diff --git a/lib/config/types.ts b/lib/config/types.ts index 7bf0bcaf0237f2..7c19d24da4e702 100644 --- a/lib/config/types.ts +++ b/lib/config/types.ts @@ -6,6 +6,7 @@ import type { HostRule, SkipReason } from '../types'; import type { StageName } from '../types/skip-reason'; import type { GitNoVerifyOption } from '../util/git/types'; import type { MergeConfidence } from '../util/merge-confidence/types'; +import type { Timestamp } from '../util/timestamp'; export type RenovateConfigStage = | 'global' @@ -551,7 +552,7 @@ export interface PackageRuleInputConfig extends Record { manager?: string; datasource?: string; packageRules?: (PackageRule & PackageRuleInputConfig)[]; - releaseTimestamp?: string | null; + releaseTimestamp?: Timestamp | null; repository?: string; currentVersionAgeInDays?: number; currentVersionTimestamp?: string; diff --git a/lib/modules/datasource/aws-machine-image/index.ts b/lib/modules/datasource/aws-machine-image/index.ts index f069ef5a52777e..1c3dce2d985107 100644 --- a/lib/modules/datasource/aws-machine-image/index.ts +++ b/lib/modules/datasource/aws-machine-image/index.ts @@ -2,6 +2,7 @@ import type { Filter, Image } from '@aws-sdk/client-ec2'; import { DescribeImagesCommand, EC2Client } from '@aws-sdk/client-ec2'; import { fromNodeProviderChain } from '@aws-sdk/credential-providers'; import { cache } from '../../../util/cache/package/decorator'; +import { asTimestamp } from '../../../util/timestamp'; import * as amazonMachineImageVersioning from '../../versioning/aws-machine-image'; import { Datasource } from '../datasource'; import type { GetReleasesConfig, ReleaseResult } from '../types'; @@ -147,7 +148,7 @@ export class AwsMachineImageDatasource extends Datasource { releases: [ { version: latestImage.ImageId, - releaseTimestamp: latestImage.CreationDate, + releaseTimestamp: asTimestamp(latestImage.CreationDate), isDeprecated: Date.parse(latestImage.DeprecationTime ?? this.now.toString()) < this.now, diff --git a/lib/modules/datasource/bitbucket-tags/index.ts b/lib/modules/datasource/bitbucket-tags/index.ts index f8b59d23196bf3..33b7951693b750 100644 --- a/lib/modules/datasource/bitbucket-tags/index.ts +++ b/lib/modules/datasource/bitbucket-tags/index.ts @@ -1,6 +1,7 @@ import { cache } from '../../../util/cache/package/decorator'; import type { PackageCacheNamespace } from '../../../util/cache/package/types'; import { BitbucketHttp } from '../../../util/http/bitbucket'; +import { asTimestamp } from '../../../util/timestamp'; import { ensureTrailingSlash } from '../../../util/url'; import { RepoInfo } from '../../platform/bitbucket/schema'; import type { PagedResult } from '../../platform/bitbucket/types'; @@ -76,7 +77,7 @@ export class BitbucketTagsDatasource extends Datasource { releases: bitbucketTags.map(({ name, target }) => ({ version: name, gitRef: name, - releaseTimestamp: target?.date, + releaseTimestamp: asTimestamp(target?.date), })), }; diff --git a/lib/modules/datasource/bitrise/schema.ts b/lib/modules/datasource/bitrise/schema.ts index 064151a45de2cd..aee65e5e4f7a64 100644 --- a/lib/modules/datasource/bitrise/schema.ts +++ b/lib/modules/datasource/bitrise/schema.ts @@ -1,9 +1,10 @@ import { z } from 'zod'; import { Yaml } from '../../../util/schema-utils'; +import { TimestampSchema } from '../../../util/timestamp'; export const BitriseStepFile = Yaml.pipe( z.object({ - published_at: z.string(), + published_at: TimestampSchema.nullable().catch(null), source_code_url: z.string().optional(), }), ); diff --git a/lib/modules/datasource/cpan/schema.ts b/lib/modules/datasource/cpan/schema.ts index 8e997143ba3849..123560e7ce5caf 100644 --- a/lib/modules/datasource/cpan/schema.ts +++ b/lib/modules/datasource/cpan/schema.ts @@ -1,5 +1,6 @@ import { z } from 'zod'; import { LooseArray } from '../../../util/schema-utils'; +import { TimestampSchema } from '../../../util/timestamp'; import type { CpanRelease } from './types'; /** @@ -14,7 +15,7 @@ const MetaCpanApiFileSchema = z }), ), distribution: z.string(), - date: z.string(), + date: TimestampSchema.nullable().catch(null), deprecated: z.boolean(), maturity: z.string(), status: z.union([ diff --git a/lib/modules/datasource/crate/index.spec.ts b/lib/modules/datasource/crate/index.spec.ts index 765bba4d61ecdb..f5138c14b37169 100644 --- a/lib/modules/datasource/crate/index.spec.ts +++ b/lib/modules/datasource/crate/index.spec.ts @@ -427,7 +427,7 @@ describe('modules/datasource/crate/index', () => { expect(res).toEqual({ version: '4.5.17', - releaseTimestamp: '2024-09-04T19:16:41.355243+00:00', + releaseTimestamp: '2024-09-04T19:16:41.355Z', }); }); }); diff --git a/lib/modules/datasource/crate/index.ts b/lib/modules/datasource/crate/index.ts index 29eb0b84985f23..2f1ee9d93d7678 100644 --- a/lib/modules/datasource/crate/index.ts +++ b/lib/modules/datasource/crate/index.ts @@ -400,7 +400,7 @@ export class CrateDatasource extends Datasource { const url = `https://crates.io/api/v1/crates/${packageName}/${release.version}`; const { body: releaseTimestamp } = await this.http.getJson( url, - ReleaseTimestampSchema, + ReleaseTimestampSchema.nullable().catch(null), ); release.releaseTimestamp = releaseTimestamp; return release; diff --git a/lib/modules/datasource/crate/schema.ts b/lib/modules/datasource/crate/schema.ts index 9d799be31b42cc..6b266f12f8a708 100644 --- a/lib/modules/datasource/crate/schema.ts +++ b/lib/modules/datasource/crate/schema.ts @@ -1,9 +1,10 @@ import { z } from 'zod'; +import { TimestampSchema } from '../../../util/timestamp'; export const ReleaseTimestampSchema = z .object({ version: z.object({ - created_at: z.string(), + created_at: TimestampSchema.nullable().catch(null), }), }) .transform(({ version: { created_at } }) => created_at) diff --git a/lib/modules/datasource/custom/schema.ts b/lib/modules/datasource/custom/schema.ts index 50c19b7ed948b1..4d52d0519ea7f7 100644 --- a/lib/modules/datasource/custom/schema.ts +++ b/lib/modules/datasource/custom/schema.ts @@ -1,4 +1,5 @@ import { z } from 'zod'; +import { TimestampSchema } from '../../../util/timestamp'; export const ReleaseResultZodSchema = z.object({ releases: z.array( @@ -6,7 +7,7 @@ export const ReleaseResultZodSchema = z.object({ .object({ version: z.string(), isDeprecated: z.boolean().optional(), - releaseTimestamp: z.string().optional(), + releaseTimestamp: TimestampSchema.nullable().catch(null), sourceUrl: z.string().optional(), sourceDirectory: z.string().optional(), changelogUrl: z.string().optional(), diff --git a/lib/modules/datasource/dart/index.ts b/lib/modules/datasource/dart/index.ts index 88e549cfeb8903..3d061e3251c5dd 100644 --- a/lib/modules/datasource/dart/index.ts +++ b/lib/modules/datasource/dart/index.ts @@ -1,4 +1,5 @@ import type { HttpResponse } from '../../../util/http/types'; +import { asTimestamp } from '../../../util/timestamp'; import { ensureTrailingSlash } from '../../../util/url'; import { Datasource } from '../datasource'; import type { GetReleasesConfig, ReleaseResult } from '../types'; @@ -49,7 +50,7 @@ export class DartDatasource extends Datasource { ?.filter(({ retracted }) => !retracted) ?.map(({ version, published }) => ({ version, - releaseTimestamp: published, + releaseTimestamp: asTimestamp(published), })); if (releases && latest) { result = { releases }; diff --git a/lib/modules/datasource/deno/schema.ts b/lib/modules/datasource/deno/schema.ts index 2587874425d9d8..2b63f91acbbe20 100644 --- a/lib/modules/datasource/deno/schema.ts +++ b/lib/modules/datasource/deno/schema.ts @@ -1,6 +1,7 @@ import { z } from 'zod'; import { getSourceUrl as getGithubSourceUrl } from '../../../util/github/url'; import { LooseArray } from '../../../util/schema-utils'; +import { TimestampSchema } from '../../../util/timestamp'; import type { Release } from '../types'; export const DenoApiTag = z.object({ @@ -31,7 +32,7 @@ export const DenoAPIUploadOptions = z.object({ export const DenoAPIModuleVersionResponse = z .object({ upload_options: DenoAPIUploadOptions, - uploaded_at: z.string(), + uploaded_at: TimestampSchema.nullable().catch(null), version: z.string(), }) .transform( @@ -41,6 +42,11 @@ export const DenoAPIModuleVersionResponse = z if (type === 'github') { sourceUrl = getGithubSourceUrl(repository); } - return { version, gitRef, releaseTimestamp, sourceUrl }; + return { + version, + gitRef, + releaseTimestamp, + sourceUrl, + }; }, ); diff --git a/lib/modules/datasource/devbox/schema.ts b/lib/modules/datasource/devbox/schema.ts index bc31efae879850..78f539598bc95a 100644 --- a/lib/modules/datasource/devbox/schema.ts +++ b/lib/modules/datasource/devbox/schema.ts @@ -1,8 +1,9 @@ import { z } from 'zod'; +import { TimestampSchema } from '../../../util/timestamp'; export const DevboxRelease = z.object({ version: z.string(), - last_updated: z.string(), + last_updated: TimestampSchema.nullable().catch(null), }); export const DevboxResponse = z diff --git a/lib/modules/datasource/docker/index.ts b/lib/modules/datasource/docker/index.ts index 3e4339d0fa2b25..1293ac5eb50de1 100644 --- a/lib/modules/datasource/docker/index.ts +++ b/lib/modules/datasource/docker/index.ts @@ -10,6 +10,7 @@ import { hasKey } from '../../../util/object'; import { regEx } from '../../../util/regex'; import { type AsyncResult, Result } from '../../../util/result'; import { isDockerDigest } from '../../../util/string-match'; +import { asTimestamp } from '../../../util/timestamp'; import { ensurePathPrefix, joinUrlParts, @@ -1001,13 +1002,10 @@ export class DockerDatasource extends Datasource { const items = cache.getItems(); return items.map( - ({ - name: version, - tag_last_pushed: releaseTimestamp, - digest: newDigest, - }) => { + ({ name: version, tag_last_pushed, digest: newDigest }) => { const release: Release = { version }; + const releaseTimestamp = asTimestamp(tag_last_pushed); if (releaseTimestamp) { release.releaseTimestamp = releaseTimestamp; } diff --git a/lib/modules/datasource/dotnet-version/schema.ts b/lib/modules/datasource/dotnet-version/schema.ts index ce940ac245319a..5e6b707ad94e66 100644 --- a/lib/modules/datasource/dotnet-version/schema.ts +++ b/lib/modules/datasource/dotnet-version/schema.ts @@ -1,5 +1,6 @@ import { z } from 'zod'; import { LooseArray } from '../../../util/schema-utils'; +import { TimestampSchema } from '../../../util/timestamp'; import type { Release } from '../types'; export const ReleasesIndex = z @@ -15,7 +16,7 @@ export const ReleasesIndex = z .transform(({ 'releases-index': releasesIndex }) => releasesIndex); const ReleaseBase = z.object({ - 'release-date': z.string(), + 'release-date': TimestampSchema.nullable().catch(null), 'release-notes': z.string(), }); const ReleaseDetails = z.object({ diff --git a/lib/modules/datasource/endoflife-date/schema.ts b/lib/modules/datasource/endoflife-date/schema.ts index 4f184a86fc9d72..274841e9f55c28 100644 --- a/lib/modules/datasource/endoflife-date/schema.ts +++ b/lib/modules/datasource/endoflife-date/schema.ts @@ -1,6 +1,7 @@ import { DateTime } from 'luxon'; import { z } from 'zod'; import { UtcDate } from '../../../util/schema-utils'; +import { TimestampSchema } from '../../../util/timestamp'; import type { Release } from '../types'; const ExpireableField = z.union([ @@ -15,7 +16,7 @@ export const EndoflifeDateVersions = z .object({ cycle: z.string(), latest: z.optional(z.string()), - releaseDate: z.optional(z.string()), + releaseDate: TimestampSchema.nullable().catch(null), eol: z.optional(ExpireableField), discontinued: z.optional(ExpireableField), }) diff --git a/lib/modules/datasource/flutter-version/index.ts b/lib/modules/datasource/flutter-version/index.ts index 46dd2ce47e8d44..2ef74c928fba9c 100644 --- a/lib/modules/datasource/flutter-version/index.ts +++ b/lib/modules/datasource/flutter-version/index.ts @@ -1,4 +1,5 @@ import { regEx } from '../../../util/regex'; +import { asTimestamp } from '../../../util/timestamp'; import { id as semverId } from '../../versioning/semver'; import { Datasource } from '../datasource'; import type { GetReleasesConfig, ReleaseResult } from '../types'; @@ -58,7 +59,7 @@ export class FlutterVersionDatasource extends Datasource { }) .map(({ version, release_date, channel }) => ({ version, - releaseTimestamp: release_date, + releaseTimestamp: asTimestamp(release_date), isStable: channel === 'stable', })); return result.releases.length ? result : null; diff --git a/lib/modules/datasource/galaxy-collection/schema.ts b/lib/modules/datasource/galaxy-collection/schema.ts index 06be4898c52e99..2e91c5e7ce018b 100644 --- a/lib/modules/datasource/galaxy-collection/schema.ts +++ b/lib/modules/datasource/galaxy-collection/schema.ts @@ -1,4 +1,5 @@ import { z } from 'zod'; +import { TimestampSchema } from '../../../util/timestamp'; export type GalaxyV3 = z.infer; export const GalaxyV3 = z.object({ @@ -14,7 +15,7 @@ export const GalaxyV3Versions = z data: z.array( z.object({ version: z.string(), - created_at: z.string().datetime(), + created_at: TimestampSchema.nullable().catch(null), }), ), }) diff --git a/lib/modules/datasource/galaxy/index.ts b/lib/modules/datasource/galaxy/index.ts index cae51402213a80..075653dddf5beb 100644 --- a/lib/modules/datasource/galaxy/index.ts +++ b/lib/modules/datasource/galaxy/index.ts @@ -82,18 +82,13 @@ export class GalaxyDatasource extends Datasource { result.sourceUrl = `https://github.com/${user}/${repo}`; } - result.releases = versions.map( - (version: { name: string; created?: string }) => { - const release: Release = { - version: version.name, - }; - - if (is.nonEmptyString(version.created)) { - release.releaseTimestamp = version.created; - } - return release; - }, - ); + result.releases = versions.map(({ version, releaseTimestamp }) => { + const release: Release = { version }; + if (releaseTimestamp) { + release.releaseTimestamp = releaseTimestamp; + } + return release; + }); return result; } diff --git a/lib/modules/datasource/galaxy/schema.ts b/lib/modules/datasource/galaxy/schema.ts index 7fb519004908e3..e236a8af01fea8 100644 --- a/lib/modules/datasource/galaxy/schema.ts +++ b/lib/modules/datasource/galaxy/schema.ts @@ -1,4 +1,5 @@ import { z } from 'zod'; +import { TimestampSchema } from '../../../util/timestamp'; export type GalaxyV1 = z.infer; export const GalaxyV1 = z.object({ @@ -6,10 +7,15 @@ export const GalaxyV1 = z.object({ z.object({ summary_fields: z.object({ versions: z.array( - z.object({ - name: z.string(), - created: z.string().optional(), - }), + z + .object({ + name: z.string(), + created: TimestampSchema.nullable().catch(null), + }) + .transform(({ name, created }) => ({ + version: name, + releaseTimestamp: created, + })), ), }), github_user: z.string().optional(), diff --git a/lib/modules/datasource/gitea-releases/schema.ts b/lib/modules/datasource/gitea-releases/schema.ts index fe57281c672d57..cd1e6223044bc8 100644 --- a/lib/modules/datasource/gitea-releases/schema.ts +++ b/lib/modules/datasource/gitea-releases/schema.ts @@ -1,11 +1,12 @@ import { z } from 'zod'; +import { TimestampSchema } from '../../../util/timestamp'; export const ReleaseSchema = z.object({ name: z.string(), tag_name: z.string(), body: z.string(), prerelease: z.boolean(), - published_at: z.string().datetime({ offset: true }), + published_at: TimestampSchema.nullable().catch(null), }); export const ReleasesSchema = z.array(ReleaseSchema); diff --git a/lib/modules/datasource/gitea-tags/schema.ts b/lib/modules/datasource/gitea-tags/schema.ts index 603730de8f1dbf..04f6b9d1cb9562 100644 --- a/lib/modules/datasource/gitea-tags/schema.ts +++ b/lib/modules/datasource/gitea-tags/schema.ts @@ -1,4 +1,5 @@ import { z } from 'zod'; +import { TimestampSchema } from '../../../util/timestamp'; export const CommitSchema = z.object({ sha: z.string(), @@ -8,7 +9,7 @@ export const CommitsSchema = z.array(CommitSchema); const TagCommitSchema = z.object({ sha: z.string(), - created: z.string().datetime({ offset: true }), + created: TimestampSchema.nullable().catch(null), }); export const TagSchema = z.object({ diff --git a/lib/modules/datasource/github-release-attachments/index.spec.ts b/lib/modules/datasource/github-release-attachments/index.spec.ts index f1c17ad42c9102..02872612d4d86d 100644 --- a/lib/modules/datasource/github-release-attachments/index.spec.ts +++ b/lib/modules/datasource/github-release-attachments/index.spec.ts @@ -3,6 +3,7 @@ import { getDigest, getPkgReleases } from '..'; import { mocked } from '../../../../test/util'; import * as githubGraphql from '../../../util/github/graphql'; import * as _hostRules from '../../../util/host-rules'; +import type { Timestamp } from '../../../util/timestamp'; import { GitHubReleaseAttachmentMocker } from './test'; import { GithubReleaseAttachmentsDatasource } from '.'; @@ -28,7 +29,7 @@ describe('modules/datasource/github-release-attachments/index', () => { name: 'some/dep2', description: 'some description', version: 'a', - releaseTimestamp: '2020-03-09T13:00:00Z', + releaseTimestamp: '2020-03-09T13:00:00Z' as Timestamp, }, { id: 2, @@ -36,7 +37,7 @@ describe('modules/datasource/github-release-attachments/index', () => { name: 'some/dep2', description: 'some description', version: 'v', - releaseTimestamp: '2020-03-09T12:00:00Z', + releaseTimestamp: '2020-03-09T12:00:00Z' as Timestamp, }, { id: 3, @@ -44,7 +45,7 @@ describe('modules/datasource/github-release-attachments/index', () => { name: 'some/dep2', description: 'some description', version: '1.0.0', - releaseTimestamp: '2020-03-09T11:00:00Z', + releaseTimestamp: '2020-03-09T11:00:00Z' as Timestamp, }, { id: 4, @@ -52,7 +53,7 @@ describe('modules/datasource/github-release-attachments/index', () => { name: 'some/dep2', description: 'some description', version: 'v1.1.0', - releaseTimestamp: '2020-03-09T10:00:00Z', + releaseTimestamp: '2020-03-09T10:00:00Z' as Timestamp, }, { id: 5, @@ -60,7 +61,7 @@ describe('modules/datasource/github-release-attachments/index', () => { name: 'some/dep2', description: 'some description', version: '2.0.0', - releaseTimestamp: '2020-04-09T10:00:00Z', + releaseTimestamp: '2020-04-09T10:00:00Z' as Timestamp, isStable: false, }, ]); diff --git a/lib/modules/datasource/github-releases/index.spec.ts b/lib/modules/datasource/github-releases/index.spec.ts index e6f93f07803bcd..fbd1f962a94958 100644 --- a/lib/modules/datasource/github-releases/index.spec.ts +++ b/lib/modules/datasource/github-releases/index.spec.ts @@ -3,6 +3,7 @@ import { getDigest, getPkgReleases } from '..'; import { mocked } from '../../../../test/util'; import * as githubGraphql from '../../../util/github/graphql'; import * as _hostRules from '../../../util/host-rules'; +import type { Timestamp } from '../../../util/timestamp'; import { GithubReleasesDatasource } from '.'; jest.mock('../../../util/host-rules', () => mockDeep()); @@ -25,7 +26,7 @@ describe('modules/datasource/github-releases/index', () => { name: 'some/dep2', description: 'some description', version: 'a', - releaseTimestamp: '2020-03-09T13:00:00Z', + releaseTimestamp: '2020-03-09T13:00:00Z' as Timestamp, }, { id: 2, @@ -33,7 +34,7 @@ describe('modules/datasource/github-releases/index', () => { name: 'some/dep2', description: 'some description', version: 'v', - releaseTimestamp: '2020-03-09T12:00:00Z', + releaseTimestamp: '2020-03-09T12:00:00Z' as Timestamp, }, { id: 3, @@ -41,7 +42,7 @@ describe('modules/datasource/github-releases/index', () => { name: 'some/dep2', description: 'some description', version: '1.0.0', - releaseTimestamp: '2020-03-09T11:00:00Z', + releaseTimestamp: '2020-03-09T11:00:00Z' as Timestamp, }, { id: 4, @@ -49,7 +50,7 @@ describe('modules/datasource/github-releases/index', () => { name: 'some/dep2', description: 'some description', version: 'v1.1.0', - releaseTimestamp: '2020-03-09T10:00:00Z', + releaseTimestamp: '2020-03-09T10:00:00Z' as Timestamp, }, { id: 5, @@ -57,7 +58,7 @@ describe('modules/datasource/github-releases/index', () => { name: 'some/dep2', description: 'some description', version: '2.0.0', - releaseTimestamp: '2020-04-09T10:00:00Z', + releaseTimestamp: '2020-04-09T10:00:00Z' as Timestamp, isStable: false, }, ]); @@ -70,11 +71,17 @@ describe('modules/datasource/github-releases/index', () => { expect(res).toMatchObject({ registryUrl: 'https://github.com', releases: [ - { releaseTimestamp: '2020-03-09T11:00:00.000Z', version: '1.0.0' }, - { version: 'v1.1.0', releaseTimestamp: '2020-03-09T10:00:00.000Z' }, + { + releaseTimestamp: '2020-03-09T11:00:00.000Z' as Timestamp, + version: '1.0.0', + }, + { + version: 'v1.1.0', + releaseTimestamp: '2020-03-09T10:00:00.000Z' as Timestamp, + }, { version: '2.0.0', - releaseTimestamp: '2020-04-09T10:00:00.000Z', + releaseTimestamp: '2020-04-09T10:00:00.000Z' as Timestamp, isStable: false, }, ], @@ -95,13 +102,13 @@ describe('modules/datasource/github-releases/index', () => { { version: 'v1.0.0', gitRef: 'v1.0.0', - releaseTimestamp: '2021-01-01', + releaseTimestamp: '2021-01-01' as Timestamp, hash: 'sha-of-v1', }, { version: 'v15.0.0', gitRef: 'v15.0.0', - releaseTimestamp: '2022-10-01', + releaseTimestamp: '2022-10-01' as Timestamp, hash: 'sha-of-v15', }, ]); diff --git a/lib/modules/datasource/github-tags/index.spec.ts b/lib/modules/datasource/github-tags/index.spec.ts index 8bde1f8d3fec43..02b2d0b9dcda44 100644 --- a/lib/modules/datasource/github-tags/index.spec.ts +++ b/lib/modules/datasource/github-tags/index.spec.ts @@ -4,6 +4,7 @@ import { partial } from '../../../../test/util'; import * as githubGraphql from '../../../util/github/graphql'; import type { GithubTagItem } from '../../../util/github/graphql/types'; import * as hostRules from '../../../util/host-rules'; +import type { Timestamp } from '../../../util/timestamp'; import { GithubTagsDatasource } from '.'; const githubApiHost = 'https://api.github.com'; @@ -55,13 +56,13 @@ describe('modules/datasource/github-tags/index', () => { { version: 'v1.0.0', gitRef: 'v1.0.0', - releaseTimestamp: '2021-01-01', + releaseTimestamp: '2021-01-01' as Timestamp, hash: '123', }, { version: 'v2.0.0', gitRef: 'v2.0.0', - releaseTimestamp: '2022-01-01', + releaseTimestamp: '2022-01-01' as Timestamp, hash: 'abc', }, ]); @@ -74,13 +75,13 @@ describe('modules/datasource/github-tags/index', () => { { version: 'v1.0.0', gitRef: 'v1.0.0', - releaseTimestamp: '2021-01-01', + releaseTimestamp: '2021-01-01' as Timestamp, hash: '123', }, partial({ version: 'v2.0.0', gitRef: 'v2.0.0', - releaseTimestamp: '2022-01-01', + releaseTimestamp: '2022-01-01' as Timestamp, }), ]); const res = await github.getDigest({ packageName }, 'v2.0.0'); @@ -92,13 +93,13 @@ describe('modules/datasource/github-tags/index', () => { { version: 'v1.0.0', gitRef: 'v1.0.0', - releaseTimestamp: '2021-01-01', + releaseTimestamp: '2021-01-01' as Timestamp, hash: '123', }, { version: 'v2.0.0', gitRef: 'v2.0.0', - releaseTimestamp: '2022-01-01', + releaseTimestamp: '2022-01-01' as Timestamp, hash: 'abc', }, ]); @@ -121,13 +122,13 @@ describe('modules/datasource/github-tags/index', () => { { version: 'v1.0.0', gitRef: 'v1.0.0', - releaseTimestamp: '2021-01-01', + releaseTimestamp: '2021-01-01' as Timestamp, hash: '123', }, { version: 'v2.0.0', gitRef: 'v2.0.0', - releaseTimestamp: '2022-01-01', + releaseTimestamp: '2022-01-01' as Timestamp, hash: 'abc', }, ]); @@ -135,7 +136,7 @@ describe('modules/datasource/github-tags/index', () => { { id: 1, version: 'v1.0.0', - releaseTimestamp: '2021-01-01', + releaseTimestamp: '2021-01-01' as Timestamp, isStable: true, url: 'https://example.com', name: 'some/dep2', @@ -144,7 +145,7 @@ describe('modules/datasource/github-tags/index', () => { { id: 2, version: 'v2.0.0', - releaseTimestamp: '2022-01-01', + releaseTimestamp: '2022-01-01' as Timestamp, isStable: false, url: 'https://example.com', name: 'some/dep2', diff --git a/lib/modules/datasource/gitlab-packages/index.ts b/lib/modules/datasource/gitlab-packages/index.ts index 28d0483aae5069..c9c778440ba644 100644 --- a/lib/modules/datasource/gitlab-packages/index.ts +++ b/lib/modules/datasource/gitlab-packages/index.ts @@ -1,5 +1,6 @@ import { cache } from '../../../util/cache/package/decorator'; import { GitlabHttp } from '../../../util/http/gitlab'; +import { asTimestamp } from '../../../util/timestamp'; import { joinUrlParts } from '../../../util/url'; import { Datasource } from '../datasource'; import type { GetReleasesConfig, ReleaseResult } from '../types'; @@ -83,7 +84,7 @@ export class GitlabPackagesDatasource extends Datasource { .filter((r) => r.name === packagePart) .map(({ version, created_at }) => ({ version, - releaseTimestamp: created_at, + releaseTimestamp: asTimestamp(created_at), })); } catch (err) { this.handleGenericErrors(err); diff --git a/lib/modules/datasource/gitlab-releases/index.ts b/lib/modules/datasource/gitlab-releases/index.ts index 54ba562796a795..c284b997a2bfb6 100644 --- a/lib/modules/datasource/gitlab-releases/index.ts +++ b/lib/modules/datasource/gitlab-releases/index.ts @@ -1,5 +1,6 @@ import { cache } from '../../../util/cache/package/decorator'; import { GitlabHttp } from '../../../util/http/gitlab'; +import { asTimestamp } from '../../../util/timestamp'; import { Datasource } from '../datasource'; import type { GetReleasesConfig, Release, ReleaseResult } from '../types'; import type { GitlabRelease } from './types'; @@ -53,7 +54,7 @@ export class GitlabReleasesDatasource extends Datasource { registryUrl, gitRef: tag_name, version: tag_name, - releaseTimestamp: released_at, + releaseTimestamp: asTimestamp(released_at), }; return release; }), diff --git a/lib/modules/datasource/gitlab-tags/index.ts b/lib/modules/datasource/gitlab-tags/index.ts index 89ba14da0dc5f6..7eeb630f695a02 100644 --- a/lib/modules/datasource/gitlab-tags/index.ts +++ b/lib/modules/datasource/gitlab-tags/index.ts @@ -1,6 +1,7 @@ import { logger } from '../../../logger'; import { cache } from '../../../util/cache/package/decorator'; import { GitlabHttp } from '../../../util/http/gitlab'; +import { asTimestamp } from '../../../util/timestamp'; import { joinUrlParts } from '../../../util/url'; import { Datasource } from '../datasource'; import type { DigestConfig, GetReleasesConfig, ReleaseResult } from '../types'; @@ -60,7 +61,7 @@ export class GitlabTagsDatasource extends Datasource { dependency.releases = gitlabTags.map(({ name, commit }) => ({ version: name, gitRef: name, - releaseTimestamp: commit?.created_at, + releaseTimestamp: asTimestamp(commit?.created_at), })); return dependency; diff --git a/lib/modules/datasource/go/__snapshots__/releases-direct.spec.ts.snap b/lib/modules/datasource/go/__snapshots__/releases-direct.spec.ts.snap index 4e65ba27707cd4..d70e507a08ad46 100644 --- a/lib/modules/datasource/go/__snapshots__/releases-direct.spec.ts.snap +++ b/lib/modules/datasource/go/__snapshots__/releases-direct.spec.ts.snap @@ -6,12 +6,12 @@ exports[`modules/datasource/go/releases-direct getReleases support bitbucket tag "releases": [ { "gitRef": "v1.0.0", - "releaseTimestamp": undefined, + "releaseTimestamp": null, "version": "v1.0.0", }, { "gitRef": "v2.0.0", - "releaseTimestamp": undefined, + "releaseTimestamp": null, "version": "v2.0.0", }, ], @@ -40,12 +40,12 @@ exports[`modules/datasource/go/releases-direct getReleases support gitlab 1`] = "releases": [ { "gitRef": "v1.0.0", - "releaseTimestamp": undefined, + "releaseTimestamp": null, "version": "v1.0.0", }, { "gitRef": "v2.0.0", - "releaseTimestamp": undefined, + "releaseTimestamp": null, "version": "v2.0.0", }, ], @@ -58,12 +58,12 @@ exports[`modules/datasource/go/releases-direct getReleases support gitlab subgro "releases": [ { "gitRef": "v1.0.0", - "releaseTimestamp": undefined, + "releaseTimestamp": null, "version": "v1.0.0", }, { "gitRef": "v2.0.0", - "releaseTimestamp": undefined, + "releaseTimestamp": null, "version": "v2.0.0", }, ], @@ -76,12 +76,12 @@ exports[`modules/datasource/go/releases-direct getReleases support self hosted g "releases": [ { "gitRef": "v1.0.0", - "releaseTimestamp": undefined, + "releaseTimestamp": null, "version": "v1.0.0", }, { "gitRef": "v2.0.0", - "releaseTimestamp": undefined, + "releaseTimestamp": null, "version": "v2.0.0", }, ], diff --git a/lib/modules/datasource/go/releases-direct.spec.ts b/lib/modules/datasource/go/releases-direct.spec.ts index 19da04761d3c4a..c63003fa541a2b 100644 --- a/lib/modules/datasource/go/releases-direct.spec.ts +++ b/lib/modules/datasource/go/releases-direct.spec.ts @@ -129,19 +129,19 @@ describe('modules/datasource/go/releases-direct', () => { { gitRef: 'v0.1.0', newDigest: 'd73d815ec22c421e7192a414594ac798c73c89e5', - releaseTimestamp: '2022-05-15T16:29:42Z', + releaseTimestamp: '2022-05-15T16:29:42.000Z', version: 'v0.1.0', }, { gitRef: 'v0.2.0', newDigest: '3976707232cb68751ff2ddf42547ff95c6878a97', - releaseTimestamp: '2022-05-15T17:23:28Z', + releaseTimestamp: '2022-05-15T17:23:28.000Z', version: 'v0.2.0', }, { gitRef: 'v0.2.1', newDigest: '2963b104773ead7ed28c00181c03318885d909dc', - releaseTimestamp: '2024-09-06T23:44:34Z', + releaseTimestamp: '2024-09-06T23:44:34.000Z', version: 'v0.2.1', }, ], diff --git a/lib/modules/datasource/go/releases-goproxy.spec.ts b/lib/modules/datasource/go/releases-goproxy.spec.ts index 2d6950d057f79e..70c5287f7b6f60 100644 --- a/lib/modules/datasource/go/releases-goproxy.spec.ts +++ b/lib/modules/datasource/go/releases-goproxy.spec.ts @@ -64,7 +64,7 @@ describe('modules/datasource/go/releases-goproxy', () => { expect(release).toEqual({ version: 'v0.5.0', - releaseTimestamp: '2017-06-08T17:28:36Z', + releaseTimestamp: '2017-06-08T17:28:36.000Z', }); }); }); @@ -155,15 +155,15 @@ describe('modules/datasource/go/releases-goproxy', () => { releases: [ { version: 'v1.0.0', - releaseTimestamp: '2018-08-13T15:31:12Z', + releaseTimestamp: '2018-08-13T15:31:12.000Z', }, { version: 'v1.0.1', - releaseTimestamp: '2019-10-16T16:15:28Z', + releaseTimestamp: '2019-10-16T16:15:28.000Z', }, { version: 'v1.28.1-20230721020619-4464c06fa399.4', - releaseTimestamp: '2023-07-21T02:06:19Z', + releaseTimestamp: '2023-07-21T02:06:19.000Z', newDigest: '4464c06fa399', }, ], @@ -245,8 +245,8 @@ describe('modules/datasource/go/releases-goproxy', () => { expect(res).toEqual({ releases: [ - { releaseTimestamp: '2018-08-13T15:31:12Z', version: 'v1.0.0' }, - { releaseTimestamp: '2019-10-16T16:15:28Z', version: 'v1.0.1' }, + { releaseTimestamp: '2018-08-13T15:31:12.000Z', version: 'v1.0.0' }, + { releaseTimestamp: '2019-10-16T16:15:28.000Z', version: 'v1.0.1' }, ], sourceUrl: 'https://github.com/google/btree', tags: { latest: 'v1.0.1' }, @@ -296,8 +296,8 @@ describe('modules/datasource/go/releases-goproxy', () => { expect(res).toEqual({ releases: [ - { releaseTimestamp: '2018-08-13T15:31:12Z', version: 'v1.0.0' }, - { releaseTimestamp: '2019-10-16T16:15:28Z', version: 'v1.0.1' }, + { releaseTimestamp: '2018-08-13T15:31:12.000Z', version: 'v1.0.0' }, + { releaseTimestamp: '2019-10-16T16:15:28.000Z', version: 'v1.0.1' }, ], sourceUrl: 'https://github.com/google/btree', tags: { latest: 'v1.0.1' }, @@ -399,7 +399,7 @@ describe('modules/datasource/go/releases-goproxy', () => { httpMock .scope(`${baseUrl}/custom.com/lib/btree`) .get('/@v/list') - .reply(200, ['v1.0.0 2018-08-13T15:31:12Z', 'v1.0.1'].join('\n')) + .reply(200, ['v1.0.0 2018-08-13T15:31:12.000Z', 'v1.0.1'].join('\n')) .get('/@v/v1.0.1.info') .reply(200, { Version: 'v1.0.1', Time: '2019-10-16T16:15:28Z' }) .get('/@latest') @@ -417,8 +417,8 @@ describe('modules/datasource/go/releases-goproxy', () => { expect(res).toEqual({ releases: [ - { releaseTimestamp: '2018-08-13T15:31:12Z', version: 'v1.0.0' }, - { releaseTimestamp: '2019-10-16T16:15:28Z', version: 'v1.0.1' }, + { releaseTimestamp: '2018-08-13T15:31:12.000Z', version: 'v1.0.0' }, + { releaseTimestamp: '2019-10-16T16:15:28.000Z', version: 'v1.0.1' }, ], tags: { latest: 'v1.0.1' }, }); @@ -470,9 +470,9 @@ describe('modules/datasource/go/releases-goproxy', () => { expect(res).toEqual({ releases: [ - { releaseTimestamp: '2018-08-13T15:31:12Z', version: 'v1.0.0' }, - { releaseTimestamp: '2019-10-16T16:15:28Z', version: 'v1.0.1' }, - { releaseTimestamp: '2020-10-16T16:15:28Z', version: 'v2.0.0' }, + { releaseTimestamp: '2018-08-13T15:31:12.000Z', version: 'v1.0.0' }, + { releaseTimestamp: '2019-10-16T16:15:28.000Z', version: 'v1.0.1' }, + { releaseTimestamp: '2020-10-16T16:15:28.000Z', version: 'v2.0.0' }, ], sourceUrl: 'https://github.com/google/btree', tags: { latest: 'v2.0.0' }, @@ -513,10 +513,10 @@ describe('modules/datasource/go/releases-goproxy', () => { expect(res).toEqual({ releases: [ - { releaseTimestamp: '2020-05-06T23:08:38Z', version: 'v2.3.0' }, - { releaseTimestamp: '2020-11-17T15:46:20Z', version: 'v2.4.0' }, - { releaseTimestamp: '2022-05-21T10:33:21Z', version: 'v3.0.0' }, - { releaseTimestamp: '2022-05-27T08:35:30Z', version: 'v3.0.1' }, + { releaseTimestamp: '2020-05-06T23:08:38.000Z', version: 'v2.3.0' }, + { releaseTimestamp: '2020-11-17T15:46:20.000Z', version: 'v2.4.0' }, + { releaseTimestamp: '2022-05-21T10:33:21.000Z', version: 'v3.0.0' }, + { releaseTimestamp: '2022-05-27T08:35:30.000Z', version: 'v3.0.1' }, ], sourceUrl: 'https://github.com/go-yaml/yaml', tags: { latest: 'v3.0.1' }, @@ -551,9 +551,9 @@ describe('modules/datasource/go/releases-goproxy', () => { expect(res).toEqual({ releases: [ - { releaseTimestamp: '2017-01-01T00:00:00Z', version: 'v0.1.0' }, - { releaseTimestamp: '2017-02-01T00:00:00Z', version: 'v0.2.0' }, - { releaseTimestamp: '2018-01-01T00:00:00Z', version: 'v1.0.0' }, + { releaseTimestamp: '2017-01-01T00:00:00.000Z', version: 'v0.1.0' }, + { releaseTimestamp: '2017-02-01T00:00:00.000Z', version: 'v0.2.0' }, + { releaseTimestamp: '2018-01-01T00:00:00.000Z', version: 'v1.0.0' }, ], sourceUrl: 'https://github.com/go-foo/foo', tags: { latest: 'v1.0.0' }, @@ -588,9 +588,9 @@ describe('modules/datasource/go/releases-goproxy', () => { expect(res).toEqual({ releases: [ - { releaseTimestamp: '2017-01-01T00:00:00Z', version: 'v0.1.0' }, - { releaseTimestamp: '2017-02-01T00:00:00Z', version: 'v0.2.0' }, - { releaseTimestamp: '2018-01-01T00:00:00Z', version: 'v1.0.0' }, + { releaseTimestamp: '2017-01-01T00:00:00.000Z', version: 'v0.1.0' }, + { releaseTimestamp: '2017-02-01T00:00:00.000Z', version: 'v0.2.0' }, + { releaseTimestamp: '2018-01-01T00:00:00.000Z', version: 'v1.0.0' }, ], sourceUrl: 'https://github.com/go-foo/foo', tags: { latest: 'v1.0.0' }, @@ -632,7 +632,7 @@ describe('modules/datasource/go/releases-goproxy', () => { releases: [ { newDigest: '921286631fa9', - releaseTimestamp: '2023-09-05T20:02:55Z', + releaseTimestamp: '2023-09-05T20:02:55.000Z', version: 'v0.0.0-20230905200255-921286631fa9', }, ], diff --git a/lib/modules/datasource/go/releases-goproxy.ts b/lib/modules/datasource/go/releases-goproxy.ts index 1a2a9d301cbf1e..df0cbcd6ab0c61 100644 --- a/lib/modules/datasource/go/releases-goproxy.ts +++ b/lib/modules/datasource/go/releases-goproxy.ts @@ -1,5 +1,4 @@ import is from '@sindresorhus/is'; -import { DateTime } from 'luxon'; import { logger } from '../../../logger'; import { ExternalHostError } from '../../../types/errors/external-host-error'; import { cache } from '../../../util/cache/package/decorator'; @@ -7,6 +6,7 @@ import { filterMap } from '../../../util/filter-map'; import { HttpError } from '../../../util/http'; import * as p from '../../../util/promises'; import { newlineRegex, regEx } from '../../../util/regex'; +import { asTimestamp } from '../../../util/timestamp'; import { joinUrlParts } from '../../../util/url'; import goVersioning from '../../versioning/go-mod-directive'; import { Datasource } from '../datasource'; @@ -33,9 +33,7 @@ export function pseudoVersionToRelease(pseudoVersion: string): Release | null { } const { digest: newDigest, timestamp } = match; - const releaseTimestamp = DateTime.fromFormat(timestamp, 'yyyyMMddHHmmss', { - zone: 'UTC', - }).toISO({ suppressMilliseconds: true }); + const releaseTimestamp = asTimestamp(timestamp); return { version: pseudoVersion, @@ -142,9 +140,10 @@ export class GoProxyDatasource extends Datasource { return null; } - const [version, releaseTimestamp] = str.trim().split(regEx(/\s+/)); + const [version, timestamp] = str.trim().split(regEx(/\s+/)); const release: Release = pseudoVersionToRelease(version) ?? { version }; + const releaseTimestamp = asTimestamp(timestamp); if (releaseTimestamp) { release.releaseTimestamp = releaseTimestamp; } @@ -170,8 +169,9 @@ export class GoProxyDatasource extends Datasource { version: res.body.Version, }; - if (res.body.Time) { - result.releaseTimestamp = res.body.Time; + const releaseTimestamp = asTimestamp(res.body.Time); + if (releaseTimestamp) { + result.releaseTimestamp = releaseTimestamp; } return result; diff --git a/lib/modules/datasource/golang-version/index.ts b/lib/modules/datasource/golang-version/index.ts index 65e7d9b87b37c3..6d355a60aeb4bc 100644 --- a/lib/modules/datasource/golang-version/index.ts +++ b/lib/modules/datasource/golang-version/index.ts @@ -1,6 +1,7 @@ import { ExternalHostError } from '../../../types/errors/external-host-error'; import { cache } from '../../../util/cache/package/decorator'; import { regEx } from '../../../util/regex'; +import { asTimestamp } from '../../../util/timestamp'; import { joinUrlParts } from '../../../util/url'; import { isVersion, id as semverVersioningId } from '../../versioning/semver'; import { Datasource } from '../datasource'; @@ -111,7 +112,9 @@ export class GolangVersionDatasource extends Datasource { const year = releaseDateMatch.groups.year.padStart(4, '0'); const month = releaseDateMatch.groups.month.padStart(2, '0'); const day = releaseDateMatch.groups.day.padStart(2, '0'); - release.releaseTimestamp = `${year}-${month}-${day}T00:00:00.000Z`; + release.releaseTimestamp = asTimestamp( + `${year}-${month}-${day}T00:00:00.000Z`, + ); } const releaseVersionMatch = releaseVersionRegex.exec(line); if (releaseVersionMatch?.groups) { diff --git a/lib/modules/datasource/gradle-version/index.ts b/lib/modules/datasource/gradle-version/index.ts index bb6368e19803f1..e6787b1fbedfb1 100644 --- a/lib/modules/datasource/gradle-version/index.ts +++ b/lib/modules/datasource/gradle-version/index.ts @@ -1,5 +1,5 @@ import { cache } from '../../../util/cache/package/decorator'; -import { regEx } from '../../../util/regex'; +import { asTimestamp } from '../../../util/timestamp'; import * as gradleVersioning from '../../versioning/gradle'; import { Datasource } from '../datasource'; import type { GetReleasesConfig, Release, ReleaseResult } from '../types'; @@ -27,10 +27,6 @@ export class GradleVersionDatasource extends Datasource { override readonly sourceUrlNote = 'We use the URL: https://github.com/gradle/gradle.'; - private static readonly buildTimeRegex = regEx( - '^(\\d\\d\\d\\d)(\\d\\d)(\\d\\d)(\\d\\d)(\\d\\d)(\\d\\d)(\\+\\d\\d\\d\\d)$', - ); - @cache({ namespace: `datasource-${GradleVersionDatasource.id}`, // TODO: types (#22198) @@ -54,8 +50,7 @@ export class GradleVersionDatasource extends Datasource { const gitRef = GradleVersionDatasource.getGitRef(release.version); - const releaseTimestamp = - GradleVersionDatasource.formatBuildTime(buildTime); + const releaseTimestamp = asTimestamp(buildTime); const result: Release = { version, gitRef, releaseTimestamp }; @@ -80,19 +75,6 @@ export class GradleVersionDatasource extends Datasource { return null; } - private static formatBuildTime(timeStr: string): string | null { - if (!timeStr) { - return null; - } - if (GradleVersionDatasource.buildTimeRegex.test(timeStr)) { - return timeStr.replace( - GradleVersionDatasource.buildTimeRegex, - '$1-$2-$3T$4:$5:$6$7', - ); - } - return null; - } - /** * Calculate `gitTag` based on `version`: * - `8.1.2` -> `v8.1.2` diff --git a/lib/modules/datasource/helm/schema.ts b/lib/modules/datasource/helm/schema.ts index d10d90120b86ab..84d9283862c444 100644 --- a/lib/modules/datasource/helm/schema.ts +++ b/lib/modules/datasource/helm/schema.ts @@ -3,11 +3,12 @@ import { detectPlatform } from '../../../util/common'; import { parseGitUrl } from '../../../util/git/url'; import { regEx } from '../../../util/regex'; import { LooseRecord } from '../../../util/schema-utils'; +import { TimestampSchema } from '../../../util/timestamp'; import type { Release } from '../types'; const HelmReleaseSchema = z.object({ version: z.string(), - created: z.string().nullable().catch(null), + created: TimestampSchema.nullable().catch(null), digest: z.string().optional().catch(undefined), home: z.string().optional().catch(undefined), sources: z.array(z.string()).catch([]), diff --git a/lib/modules/datasource/hex/schema.ts b/lib/modules/datasource/hex/schema.ts index a04aa81a49f399..eeec3ebb122ad8 100644 --- a/lib/modules/datasource/hex/schema.ts +++ b/lib/modules/datasource/hex/schema.ts @@ -1,6 +1,7 @@ import is from '@sindresorhus/is'; import { z } from 'zod'; import { LooseArray } from '../../../util/schema-utils'; +import { TimestampSchema } from '../../../util/timestamp'; import type { Release, ReleaseResult } from '../types'; export const HexRelease = z @@ -29,7 +30,7 @@ export const HexRelease = z releases: LooseArray( z.object({ version: z.string(), - inserted_at: z.string().optional(), + inserted_at: TimestampSchema.nullable().catch(null), }), ).refine((releases) => releases.length > 0, 'No releases found'), retirements: z diff --git a/lib/modules/datasource/hexpm-bob/index.ts b/lib/modules/datasource/hexpm-bob/index.ts index c841f26e9a38d4..817df0a53aebcb 100644 --- a/lib/modules/datasource/hexpm-bob/index.ts +++ b/lib/modules/datasource/hexpm-bob/index.ts @@ -3,6 +3,7 @@ import { logger } from '../../../logger'; import { ExternalHostError } from '../../../types/errors/external-host-error'; import { cache } from '../../../util/cache/package/decorator'; import { HttpError } from '../../../util/http'; +import { asTimestamp } from '../../../util/timestamp'; import { id as semverId } from '../../versioning/semver'; import { Datasource } from '../datasource'; import type { GetReleasesConfig, ReleaseResult } from '../types'; @@ -69,7 +70,7 @@ export class HexpmBobDatasource extends Datasource { return { gitRef, isStable: HexpmBobDatasource.isStable(version, packageType), - releaseTimestamp: buildDate, + releaseTimestamp: asTimestamp(buildDate), version: HexpmBobDatasource.cleanVersion(version, packageType), }; }); diff --git a/lib/modules/datasource/jenkins-plugins/index.spec.ts b/lib/modules/datasource/jenkins-plugins/index.spec.ts index 65cb05070d7e94..d8bee66fb89b6b 100644 --- a/lib/modules/datasource/jenkins-plugins/index.spec.ts +++ b/lib/modules/datasource/jenkins-plugins/index.spec.ts @@ -1,5 +1,6 @@ import { getPkgReleases } from '..'; import * as httpMock from '../../../../test/http-mock'; +import type { Timestamp } from '../../../util/timestamp'; import * as versioning from '../../versioning/docker'; import type { JenkinsPluginsInfoResponse, @@ -31,7 +32,7 @@ const jenkinsPluginsVersions: JenkinsPluginsVersionsResponse = { '3.0.0': { version: '3.0.0', url: 'https://download.example.com', - releaseTimestamp: '2020-05-13T00:11:40.00Z', + releaseTimestamp: '2020-05-13T00:11:40.00Z' as Timestamp, requiredCore: '2.164.3', }, }, @@ -87,12 +88,12 @@ describe('modules/datasource/jenkins-plugins/index', () => { }, { downloadUrl: 'https://download.example.com', - releaseTimestamp: '2020-01-02T00:00:00.000Z', + releaseTimestamp: '2020-01-02T00:00:00.000Z' as Timestamp, version: '2.0.0', }, { downloadUrl: 'https://download.example.com', - releaseTimestamp: '2020-05-13T00:11:40.000Z', + releaseTimestamp: '2020-05-13T00:11:40.000Z' as Timestamp, version: '3.0.0', }, ], @@ -155,12 +156,12 @@ describe('modules/datasource/jenkins-plugins/index', () => { }, { downloadUrl: 'https://download.example.com', - releaseTimestamp: '2020-01-02T00:00:00.000Z', + releaseTimestamp: '2020-01-02T00:00:00.000Z' as Timestamp, version: '2.0.0', }, { downloadUrl: 'https://download.example.com', - releaseTimestamp: '2020-05-13T00:11:40.000Z', + releaseTimestamp: '2020-05-13T00:11:40.000Z' as Timestamp, version: '3.0.0', }, ], diff --git a/lib/modules/datasource/jenkins-plugins/index.ts b/lib/modules/datasource/jenkins-plugins/index.ts index db434ba666c26c..1146532b814a4d 100644 --- a/lib/modules/datasource/jenkins-plugins/index.ts +++ b/lib/modules/datasource/jenkins-plugins/index.ts @@ -1,6 +1,7 @@ import { logger } from '../../../logger'; import { cache } from '../../../util/cache/package/decorator'; import { clone } from '../../../util/clone'; +import { asTimestamp } from '../../../util/timestamp'; import { ensureTrailingSlash } from '../../../util/url'; import { Datasource } from '../datasource'; import type { GetReleasesConfig, Release, ReleaseResult } from '../types'; @@ -96,8 +97,7 @@ export class JenkinsPluginsDatasource extends Datasource { const downloadUrl = plugins[name][version]?.url; const buildDate = plugins[name][version]?.buildDate; const releaseTimestamp = - plugins[name][version]?.releaseTimestamp ?? - (buildDate ? new Date(`${buildDate} UTC`).toISOString() : null); + plugins[name][version]?.releaseTimestamp ?? asTimestamp(buildDate); const jenkins = plugins[name][version]?.requiredCore; const constraints = jenkins ? { jenkins: [`>=${jenkins}`] } : undefined; return { diff --git a/lib/modules/datasource/jenkins-plugins/types.ts b/lib/modules/datasource/jenkins-plugins/types.ts index 5224ff1072240d..b8e350bebc5927 100644 --- a/lib/modules/datasource/jenkins-plugins/types.ts +++ b/lib/modules/datasource/jenkins-plugins/types.ts @@ -1,3 +1,5 @@ +import type { Timestamp } from '../../../util/timestamp'; + export interface JenkinsPluginInfo { name: string; scm?: string; @@ -9,7 +11,7 @@ export interface JenkinsPluginVersion { url?: string; requiredCore?: string; - releaseTimestamp?: string; + releaseTimestamp?: Timestamp; } export interface JenkinsPluginsInfoResponse { diff --git a/lib/modules/datasource/maven/index.ts b/lib/modules/datasource/maven/index.ts index b35bc6996a59bb..32ac272918fe57 100644 --- a/lib/modules/datasource/maven/index.ts +++ b/lib/modules/datasource/maven/index.ts @@ -4,6 +4,7 @@ import { GlobalConfig } from '../../../config/global'; import { logger } from '../../../logger'; import * as packageCache from '../../../util/cache/package'; import { cache } from '../../../util/cache/package/decorator'; +import { asTimestamp } from '../../../util/timestamp'; import { ensureTrailingSlash } from '../../../util/url'; import mavenVersion from '../../versioning/maven'; import * as mavenVersioning from '../../versioning/maven'; @@ -198,7 +199,7 @@ export class MavenDatasource extends Datasource { } if (is.date(res)) { - release.releaseTimestamp = res.toISOString(); + release.releaseTimestamp = asTimestamp(res.toISOString()); } return release; diff --git a/lib/modules/datasource/metadata.spec.ts b/lib/modules/datasource/metadata.spec.ts index 645d270f98ae1b..87a73eb8c65ada 100644 --- a/lib/modules/datasource/metadata.spec.ts +++ b/lib/modules/datasource/metadata.spec.ts @@ -1,4 +1,5 @@ import { partial } from '../../../test/util'; +import type { Timestamp } from '../../util/timestamp'; import { HelmDatasource } from './helm'; import { MavenDatasource } from './maven'; import { @@ -15,13 +16,22 @@ describe('modules/datasource/metadata', () => { it('Should handle manualChangelogUrls', () => { const dep: ReleaseResult = { releases: [ - { version: '2.0.0', releaseTimestamp: '2018-07-13T10:14:17.000Z' }, + { + version: '2.0.0', + releaseTimestamp: '2018-07-13T10:14:17.000Z' as Timestamp, + }, { version: '2.0.0.dev1', - releaseTimestamp: '2017-10-24T10:09:16.000Z', + releaseTimestamp: '2017-10-24T10:09:16.000Z' as Timestamp, + }, + { + version: '2.1.0', + releaseTimestamp: '2019-01-20T19:59:28.000Z' as Timestamp, + }, + { + version: '2.2.0', + releaseTimestamp: '2019-07-16T18:29:00.000Z' as Timestamp, }, - { version: '2.1.0', releaseTimestamp: '2019-01-20T19:59:28.000Z' }, - { version: '2.2.0', releaseTimestamp: '2019-07-16T18:29:00.000Z' }, ], }; @@ -38,13 +48,22 @@ describe('modules/datasource/metadata', () => { it('Should handle manualSourceUrls', () => { const dep: ReleaseResult = { releases: [ - { version: '2.0.0', releaseTimestamp: '2018-07-13T10:14:17.000Z' }, + { + version: '2.0.0', + releaseTimestamp: '2018-07-13T10:14:17.000Z' as Timestamp, + }, { version: '2.0.0.dev1', - releaseTimestamp: '2017-10-24T10:09:16.000Z', + releaseTimestamp: '2017-10-24T10:09:16.000Z' as Timestamp, + }, + { + version: '2.1.0', + releaseTimestamp: '2019-01-20T19:59:28.000Z' as Timestamp, + }, + { + version: '2.2.0', + releaseTimestamp: '2019-07-16T18:29:00.000Z' as Timestamp, }, - { version: '2.1.0', releaseTimestamp: '2019-01-20T19:59:28.000Z' }, - { version: '2.2.0', releaseTimestamp: '2019-07-16T18:29:00.000Z' }, ], }; @@ -61,13 +80,22 @@ describe('modules/datasource/metadata', () => { const dep: ReleaseResult = { sourceUrl: 'https://github.com/carltongibson/django-filter/tree/master', releases: [ - { version: '2.0.0', releaseTimestamp: '2018-07-13T10:14:17.000Z' }, + { + version: '2.0.0', + releaseTimestamp: '2018-07-13T10:14:17.000Z' as Timestamp, + }, { version: '2.0.0.dev1', - releaseTimestamp: '2017-10-24T10:09:16.000Z', + releaseTimestamp: '2017-10-24T10:09:16.000Z' as Timestamp, + }, + { + version: '2.1.0', + releaseTimestamp: '2019-01-20T19:59:28.000Z' as Timestamp, + }, + { + version: '2.2.0', + releaseTimestamp: '2019-07-16T18:29:00.000Z' as Timestamp, }, - { version: '2.1.0', releaseTimestamp: '2019-01-20T19:59:28.000Z' }, - { version: '2.2.0', releaseTimestamp: '2019-07-16T18:29:00.000Z' }, ], }; const datasource = PypiDatasource.id; @@ -142,13 +170,22 @@ describe('modules/datasource/metadata', () => { const dep: ReleaseResult = { sourceUrl: 'https://some.github.com/repo', releases: [ - { version: '2.0.0', releaseTimestamp: '2018-07-13T10:14:17.000Z' }, + { + version: '2.0.0', + releaseTimestamp: '2018-07-13T10:14:17.000Z' as Timestamp, + }, { version: '2.0.0.dev1', - releaseTimestamp: '2017-10-24T10:09:16.000Z', + releaseTimestamp: '2017-10-24T10:09:16.000Z' as Timestamp, + }, + { + version: '2.1.0', + releaseTimestamp: '2019-01-20T19:59:28.000Z' as Timestamp, + }, + { + version: '2.2.0', + releaseTimestamp: '2019-07-16T18:29:00.000Z' as Timestamp, }, - { version: '2.1.0', releaseTimestamp: '2019-01-20T19:59:28.000Z' }, - { version: '2.2.0', releaseTimestamp: '2019-07-16T18:29:00.000Z' }, ], }; const datasource = PypiDatasource.id; @@ -164,10 +201,13 @@ describe('modules/datasource/metadata', () => { const dep: ReleaseResult = { sourceUrl: 'https://gitlab.com/meno/dropzone/tree/master', releases: [ - { version: '5.7.0', releaseTimestamp: '2020-02-14T13:12:00.000Z' }, + { + version: '5.7.0', + releaseTimestamp: '2020-02-14T13:12:00.000Z' as Timestamp, + }, { version: '5.6.1', - releaseTimestamp: '2020-02-14T10:04:00.000Z', + releaseTimestamp: '2020-02-14T10:04:00.000Z' as Timestamp, }, ], }; @@ -184,10 +224,13 @@ describe('modules/datasource/metadata', () => { const dep = { sourceUrl: 'https://gitlab-nope', releases: [ - { version: '5.7.0', releaseTimestamp: '2020-02-14T13:12:00.000Z' }, + { + version: '5.7.0', + releaseTimestamp: '2020-02-14T13:12:00.000Z' as Timestamp, + }, { version: '5.6.1', - releaseTimestamp: '2020-02-14T10:04:00.000Z', + releaseTimestamp: '2020-02-14T10:04:00.000Z' as Timestamp, }, ], }; @@ -204,10 +247,13 @@ describe('modules/datasource/metadata', () => { const dep = { sourceUrl: 'https://nope-nope-nope', releases: [ - { version: '5.7.0', releaseTimestamp: '2020-02-14T13:12:00.000Z' }, + { + version: '5.7.0', + releaseTimestamp: '2020-02-14T13:12:00.000Z' as Timestamp, + }, { version: '5.6.1', - releaseTimestamp: '2020-02-14T10:04:00.000Z', + releaseTimestamp: '2020-02-14T10:04:00.000Z' as Timestamp, }, ], }; @@ -224,10 +270,13 @@ describe('modules/datasource/metadata', () => { const dep = { sourceUrl: 'not-a-url', releases: [ - { version: '5.7.0', releaseTimestamp: '2020-02-14T13:12:00.000Z' }, + { + version: '5.7.0', + releaseTimestamp: '2020-02-14T13:12:00.000Z' as Timestamp, + }, { version: '5.6.1', - releaseTimestamp: '2020-02-14T10:04:00.000Z', + releaseTimestamp: '2020-02-14T10:04:00.000Z' as Timestamp, }, ], }; @@ -280,10 +329,19 @@ describe('modules/datasource/metadata', () => { it('Should normalize releaseTimestamp', () => { const dep = { releases: [ - { version: '1.0.1', releaseTimestamp: '2000-01-01T12:34:56' }, - { version: '1.0.2', releaseTimestamp: '2000-01-02T12:34:56.000Z' }, - { version: '1.0.3', releaseTimestamp: '2000-01-03T14:34:56.000+02:00' }, - { version: '1.0.4', releaseTimestamp: '20000103150210' }, + { + version: '1.0.1', + releaseTimestamp: '2000-01-01T12:34:56' as Timestamp, + }, + { + version: '1.0.2', + releaseTimestamp: '2000-01-02T12:34:56.000Z' as Timestamp, + }, + { + version: '1.0.3', + releaseTimestamp: '2000-01-03T14:34:56.000+02:00' as Timestamp, + }, + { version: '1.0.4', releaseTimestamp: '20000103150210' as Timestamp }, ], }; addMetaData(dep, MavenDatasource.id, 'foobar'); @@ -374,9 +432,18 @@ describe('modules/datasource/metadata', () => { homepage: 'https://github.com/foo/bar', sourceUrl: 'https://github.com/foo/bar', releases: [ - { version: '1.0.1', releaseTimestamp: '2000-01-01T12:34:56' }, - { version: '1.0.2', releaseTimestamp: '2000-01-02T12:34:56.000Z' }, - { version: '1.0.3', releaseTimestamp: '2000-01-03T14:34:56.000+02:00' }, + { + version: '1.0.1', + releaseTimestamp: '2000-01-01T12:34:56' as Timestamp, + }, + { + version: '1.0.2', + releaseTimestamp: '2000-01-02T12:34:56.000Z' as Timestamp, + }, + { + version: '1.0.3', + releaseTimestamp: '2000-01-03T14:34:56.000+02:00' as Timestamp, + }, ], }; addMetaData(dep, MavenDatasource.id, 'foobar'); @@ -404,9 +471,18 @@ describe('modules/datasource/metadata', () => { sourceUrl: 'https://gitlab.com/meno/repo', homepage: 'https://gitlab.com/meno/repo', releases: [ - { version: '1.0.1', releaseTimestamp: '2000-01-01T12:34:56' }, - { version: '1.0.2', releaseTimestamp: '2000-01-02T12:34:56.000Z' }, - { version: '1.0.3', releaseTimestamp: '2000-01-03T14:34:56.000+02:00' }, + { + version: '1.0.1', + releaseTimestamp: '2000-01-01T12:34:56' as Timestamp, + }, + { + version: '1.0.2', + releaseTimestamp: '2000-01-02T12:34:56.000Z' as Timestamp, + }, + { + version: '1.0.3', + releaseTimestamp: '2000-01-03T14:34:56.000+02:00' as Timestamp, + }, ], }; addMetaData(dep, MavenDatasource.id, 'foobar'); @@ -433,9 +509,18 @@ describe('modules/datasource/metadata', () => { const dep = { sourceUrl: 'https://gitlab.com/meno/repo', releases: [ - { version: '1.0.1', releaseTimestamp: '2000-01-01T12:34:56' }, - { version: '1.0.2', releaseTimestamp: '2000-01-02T12:34:56.000Z' }, - { version: '1.0.3', releaseTimestamp: '2000-01-03T14:34:56.000+02:00' }, + { + version: '1.0.1', + releaseTimestamp: '2000-01-01T12:34:56' as Timestamp, + }, + { + version: '1.0.2', + releaseTimestamp: '2000-01-02T12:34:56.000Z' as Timestamp, + }, + { + version: '1.0.3', + releaseTimestamp: '2000-01-03T14:34:56.000+02:00' as Timestamp, + }, ], }; addMetaData(dep, MavenDatasource.id, 'foobar'); @@ -462,9 +547,18 @@ describe('modules/datasource/metadata', () => { const dep = { homepage: 'https://somesource.com/', releases: [ - { version: '1.0.1', releaseTimestamp: '2000-01-01T12:34:56' }, - { version: '1.0.2', releaseTimestamp: '2000-01-02T12:34:56.000Z' }, - { version: '1.0.3', releaseTimestamp: '2000-01-03T14:34:56.000+02:00' }, + { + version: '1.0.1', + releaseTimestamp: '2000-01-01T12:34:56' as Timestamp, + }, + { + version: '1.0.2', + releaseTimestamp: '2000-01-02T12:34:56.000Z' as Timestamp, + }, + { + version: '1.0.3', + releaseTimestamp: '2000-01-03T14:34:56.000+02:00' as Timestamp, + }, ], }; addMetaData(dep, MavenDatasource.id, 'foobar'); diff --git a/lib/modules/datasource/node-version/index.ts b/lib/modules/datasource/node-version/index.ts index c37c707c32cabf..86503abac7463e 100644 --- a/lib/modules/datasource/node-version/index.ts +++ b/lib/modules/datasource/node-version/index.ts @@ -1,4 +1,5 @@ import { cache } from '../../../util/cache/package/decorator'; +import { asTimestamp } from '../../../util/timestamp'; import { joinUrlParts } from '../../../util/url'; import { id as versioning } from '../../versioning/node'; import { Datasource } from '../datasource'; @@ -53,7 +54,7 @@ export class NodeVersionDatasource extends Datasource { result.releases.push( ...resp.map(({ version, date, lts }) => ({ version, - releaseTimestamp: date, + releaseTimestamp: asTimestamp(date), isStable: lts !== false, })), ); diff --git a/lib/modules/datasource/npm/get.ts b/lib/modules/datasource/npm/get.ts index cd8ea585ec259f..3c5acbfd1d491c 100644 --- a/lib/modules/datasource/npm/get.ts +++ b/lib/modules/datasource/npm/get.ts @@ -12,6 +12,7 @@ import type { Http } from '../../../util/http'; import type { HttpOptions } from '../../../util/http/types'; import { regEx } from '../../../util/regex'; import { HttpCacheStats } from '../../../util/stats'; +import { asTimestamp } from '../../../util/timestamp'; import { joinUrlParts } from '../../../util/url'; import type { Release, ReleaseResult } from '../types'; import type { CachedReleaseResult, NpmResponse } from './types'; @@ -199,8 +200,9 @@ export async function getDependency( dependencies: res.versions?.[version].dependencies, devDependencies: res.versions?.[version].devDependencies, }; - if (res.time?.[version]) { - release.releaseTimestamp = res.time[version]; + const releaseTimestamp = asTimestamp(res.time?.[version]); + if (releaseTimestamp) { + release.releaseTimestamp = releaseTimestamp; } if (res.versions?.[version].deprecated) { release.isDeprecated = true; diff --git a/lib/modules/datasource/nuget/v2.ts b/lib/modules/datasource/nuget/v2.ts index 48c89d34b4a6fd..b542298eadcb93 100644 --- a/lib/modules/datasource/nuget/v2.ts +++ b/lib/modules/datasource/nuget/v2.ts @@ -3,6 +3,7 @@ import { XmlDocument } from 'xmldoc'; import { logger } from '../../../logger'; import type { Http } from '../../../util/http'; import { regEx } from '../../../util/regex'; +import { asTimestamp } from '../../../util/timestamp'; import type { ReleaseResult } from '../types'; import { massageUrl, removeBuildMeta } from './common'; @@ -32,7 +33,9 @@ export class NugetV2Api { for (const pkgInfo of pkgInfoList) { const version = this.getPkgProp(pkgInfo, 'Version'); - const releaseTimestamp = this.getPkgProp(pkgInfo, 'Published'); + const releaseTimestamp = asTimestamp( + this.getPkgProp(pkgInfo, 'Published'), + ); dep.releases.push({ // TODO: types (#22198) version: removeBuildMeta(`${version}`), diff --git a/lib/modules/datasource/nuget/v3.ts b/lib/modules/datasource/nuget/v3.ts index 2e6e289bf0478a..eb3c2b5af4b469 100644 --- a/lib/modules/datasource/nuget/v3.ts +++ b/lib/modules/datasource/nuget/v3.ts @@ -23,6 +23,7 @@ import type { PackageRegistration, ServicesIndexRaw, } from './types'; +import { asTimestamp } from '../../../util/timestamp'; export class NugetV3Api { static readonly cacheNamespace = 'datasource-nuget-v3'; @@ -159,14 +160,9 @@ export class NugetV3Api { let latestStable: string | null = null; let nupkgUrl: string | null = null; const releases = catalogEntries.map( - ({ - version, - published: releaseTimestamp, - projectUrl, - listed, - packageContent, - }) => { + ({ version, published, projectUrl, listed, packageContent }) => { const release: Release = { version: removeBuildMeta(version) }; + const releaseTimestamp = asTimestamp(published); if (releaseTimestamp) { release.releaseTimestamp = releaseTimestamp; } diff --git a/lib/modules/datasource/orb/index.ts b/lib/modules/datasource/orb/index.ts index 80fa61e4e93204..0de66700aee4fc 100644 --- a/lib/modules/datasource/orb/index.ts +++ b/lib/modules/datasource/orb/index.ts @@ -1,5 +1,6 @@ import { logger } from '../../../logger'; import { cache } from '../../../util/cache/package/decorator'; +import { asTimestamp } from '../../../util/timestamp'; import { joinUrlParts } from '../../../util/url'; import { Datasource } from '../datasource'; import type { GetReleasesConfig, ReleaseResult } from '../types'; @@ -71,7 +72,7 @@ export class OrbDatasource extends Datasource { : `https://circleci.com/developer/orbs/orb/${packageName}`; const releases = orb.versions.map(({ version, createdAt }) => ({ version, - releaseTimestamp: createdAt ?? null, + releaseTimestamp: asTimestamp(createdAt), })); const dep = { homepage, isPrivate: !!orb.isPrivate, releases }; diff --git a/lib/modules/datasource/packagist/schema.spec.ts b/lib/modules/datasource/packagist/schema.spec.ts index a83918d124f34e..6f8b759ded1670 100644 --- a/lib/modules/datasource/packagist/schema.spec.ts +++ b/lib/modules/datasource/packagist/schema.spec.ts @@ -1,3 +1,4 @@ +import type { Timestamp } from '../../../util/timestamp'; import type { ReleaseResult } from '../types'; import { ComposerRelease, @@ -144,10 +145,13 @@ describe('modules/datasource/packagist/schema', () => { }); expect( - ComposerRelease.parse({ version: '1.2.3', time: '12345' }), + ComposerRelease.parse({ + version: '1.2.3', + time: '2025-01-16T12:00:00.000Z', + }), ).toEqual({ version: '1.2.3', - time: '12345', + time: '2025-01-16T12:00:00.000Z', homepage: null, source: null, require: null, @@ -312,7 +316,7 @@ describe('modules/datasource/packagist/schema', () => { 'foo/bar': [ { version: 'v1.1.1', - time: '111', + time: '2025-01-16T12:00:00+00:00' as Timestamp, homepage: 'https://example.com/1', source: { url: 'git@example.com:foo/bar-1' }, require: { php: '^8.0' }, @@ -321,7 +325,7 @@ describe('modules/datasource/packagist/schema', () => { 'baz/qux': [ { version: 'v2.2.2', - time: '222', + time: '2025-01-16T12:00:00+00:00' as Timestamp, homepage: 'https://example.com/2', source: { url: 'git@example.com:baz/qux-2' }, require: null, @@ -334,7 +338,7 @@ describe('modules/datasource/packagist/schema', () => { 'foo/bar': [ { version: 'v3.3.3', - time: '333', + time: '2025-01-16T12:00:00+00:00' as Timestamp, homepage: 'https://example.com/3', source: { url: 'git@example.com:foo/bar-3' }, require: { php: '^7.0' }, @@ -343,7 +347,7 @@ describe('modules/datasource/packagist/schema', () => { 'baz/qux': [ { version: 'v4.4.4', - time: '444', + time: '2025-01-16T12:00:00+00:00' as Timestamp, homepage: 'https://example.com/4', source: { url: 'git@example.com:baz/qux-3' }, require: null, @@ -359,13 +363,13 @@ describe('modules/datasource/packagist/schema', () => { { version: '1.1.1', gitRef: 'v1.1.1', - releaseTimestamp: '111', + releaseTimestamp: '2025-01-16T12:00:00.000Z' as Timestamp, constraints: { php: ['^8.0'] }, }, { version: '3.3.3', gitRef: 'v3.3.3', - releaseTimestamp: '333', + releaseTimestamp: '2025-01-16T12:00:00.000Z' as Timestamp, constraints: { php: ['^7.0'] }, }, ], diff --git a/lib/modules/datasource/packagist/schema.ts b/lib/modules/datasource/packagist/schema.ts index 2d95b2ad95d611..aabfc55353dfd7 100644 --- a/lib/modules/datasource/packagist/schema.ts +++ b/lib/modules/datasource/packagist/schema.ts @@ -2,6 +2,7 @@ import is from '@sindresorhus/is'; import { z } from 'zod'; import { logger } from '../../../logger'; import { LooseArray, LooseRecord } from '../../../util/schema-utils'; +import { TimestampSchema } from '../../../util/timestamp'; import type { Release, ReleaseResult } from '../types'; export const MinifiedArray = z.array(z.record(z.unknown())).transform((xs) => { @@ -44,7 +45,7 @@ export const ComposerRelease = z.object({ version: z.string(), homepage: z.string().nullable().catch(null), source: z.object({ url: z.string() }).nullable().catch(null), - time: z.string().nullable().catch(null), + time: TimestampSchema.nullable().catch(null), require: z.object({ php: z.string() }).nullable().catch(null), }); export type ComposerRelease = z.infer; diff --git a/lib/modules/datasource/postprocess-release.spec.ts b/lib/modules/datasource/postprocess-release.spec.ts index 3ec6de9abd8e99..9efbbbc3a8ebcf 100644 --- a/lib/modules/datasource/postprocess-release.spec.ts +++ b/lib/modules/datasource/postprocess-release.spec.ts @@ -1,4 +1,5 @@ import { mocked } from '../../../test/util'; +import type { Timestamp } from '../../util/timestamp'; import * as _datasourceCommon from './common'; import { Datasource } from './datasource'; import { postprocessRelease } from './postprocess-release'; @@ -86,7 +87,7 @@ describe('modules/datasource/postprocess-release', () => { _config: PostprocessReleaseConfig, release: Release, ): Promise { - release.releaseTimestamp = '2024-09-05'; + release.releaseTimestamp = '2024-09-05' as Timestamp; return Promise.resolve(release); } } diff --git a/lib/modules/datasource/puppet-forge/index.ts b/lib/modules/datasource/puppet-forge/index.ts index f656f4d5faad79..f193223542521b 100644 --- a/lib/modules/datasource/puppet-forge/index.ts +++ b/lib/modules/datasource/puppet-forge/index.ts @@ -1,3 +1,4 @@ +import { asTimestamp } from '../../../util/timestamp'; import { Datasource } from '../datasource'; import type { GetReleasesConfig, Release, ReleaseResult } from '../types'; import { PUPPET_FORGE } from './common'; @@ -37,7 +38,7 @@ export class PuppetForgeDatasource extends Datasource { const releases: Release[] = module?.releases?.map((release) => ({ version: release.version, downloadUrl: release.file_uri, - releaseTimestamp: release.created_at, + releaseTimestamp: asTimestamp(release.created_at), registryUrl, })); diff --git a/lib/modules/datasource/pypi/index.ts b/lib/modules/datasource/pypi/index.ts index 3e8812116e0555..49a9c28bc61de8 100644 --- a/lib/modules/datasource/pypi/index.ts +++ b/lib/modules/datasource/pypi/index.ts @@ -6,6 +6,7 @@ import { coerceArray } from '../../../util/array'; import { parse } from '../../../util/html'; import type { OutgoingHttpHeaders } from '../../../util/http/types'; import { regEx } from '../../../util/regex'; +import { asTimestamp } from '../../../util/timestamp'; import { ensureTrailingSlash, parseUrl } from '../../../util/url'; import * as pep440 from '../../versioning/pep440'; import { Datasource } from '../datasource'; @@ -171,7 +172,7 @@ export class PypiDatasource extends Datasource { const isDeprecated = releases.some(({ yanked }) => yanked); const result: Release = { version, - releaseTimestamp, + releaseTimestamp: asTimestamp(releaseTimestamp), }; if (isDeprecated) { result.isDeprecated = isDeprecated; diff --git a/lib/modules/datasource/python-version/index.spec.ts b/lib/modules/datasource/python-version/index.spec.ts index 4333bfe0cec344..dea8e2d3510601 100644 --- a/lib/modules/datasource/python-version/index.spec.ts +++ b/lib/modules/datasource/python-version/index.spec.ts @@ -4,6 +4,7 @@ import { Fixtures } from '../../../../test/fixtures'; import * as httpMock from '../../../../test/http-mock'; import { EXTERNAL_HOST_ERROR } from '../../../constants/error-messages'; import * as githubGraphql from '../../../util/github/graphql'; +import type { Timestamp } from '../../../util/timestamp'; import { registryUrl as eolRegistryUrl } from '../endoflife-date/common'; import { datasource, defaultRegistryUrl } from './common'; import { PythonVersionDatasource } from '.'; @@ -38,7 +39,7 @@ describe('modules/datasource/python-version/index', () => { name: 'containerbase/python-prebuild', description: 'some description', version: '3.12.1', - releaseTimestamp: '2020-03-09T13:00:00Z', + releaseTimestamp: '2020-03-09T13:00:00Z' as Timestamp, }, { id: 2, @@ -46,7 +47,7 @@ describe('modules/datasource/python-version/index', () => { name: 'containerbase/python-prebuild', description: 'some description', version: '3.12.0', - releaseTimestamp: '2020-03-09T13:00:00Z', + releaseTimestamp: '2020-03-09T13:00:00Z' as Timestamp, }, { id: 3, @@ -54,7 +55,7 @@ describe('modules/datasource/python-version/index', () => { name: 'containerbase/python-prebuild', description: 'some description', version: '3.7.8', - releaseTimestamp: '2020-03-09T13:00:00Z', + releaseTimestamp: '2020-03-09T13:00:00Z' as Timestamp, }, ]); }); @@ -105,7 +106,7 @@ describe('modules/datasource/python-version/index', () => { expect(res?.releases[0]).toEqual({ isDeprecated: true, isStable: true, - releaseTimestamp: '2020-06-27T12:55:01.000Z', + releaseTimestamp: '2020-06-27T12:55:01.000Z' as Timestamp, version: '3.7.8', }); }); diff --git a/lib/modules/datasource/python-version/schema.ts b/lib/modules/datasource/python-version/schema.ts index 2f804ef8a42f4d..f170d5ec789a9f 100644 --- a/lib/modules/datasource/python-version/schema.ts +++ b/lib/modules/datasource/python-version/schema.ts @@ -1,4 +1,5 @@ import { z } from 'zod'; +import { TimestampSchema } from '../../../util/timestamp'; import type { Release } from '../types'; export const PythonRelease = z @@ -12,7 +13,7 @@ export const PythonRelease = z /** is latest major version, true for Python 2.7.18 and latest Python 3 */ is_latest: z.boolean(), is_published: z.boolean(), - release_date: z.string(), + release_date: TimestampSchema.nullable().catch(null), pre_release: z.boolean(), release_page: z.string().nullable(), show_on_download_page: z.boolean(), diff --git a/lib/modules/datasource/ruby-version/index.ts b/lib/modules/datasource/ruby-version/index.ts index 7f2a2613c1d6f8..edf3f52c46d6d4 100644 --- a/lib/modules/datasource/ruby-version/index.ts +++ b/lib/modules/datasource/ruby-version/index.ts @@ -3,6 +3,7 @@ import { ExternalHostError } from '../../../types/errors/external-host-error'; import { cache } from '../../../util/cache/package/decorator'; import { parse } from '../../../util/html'; import type { HttpError } from '../../../util/http'; +import { asTimestamp } from '../../../util/timestamp'; import { isVersion, id as rubyVersioningId } from '../../versioning/ruby'; import { Datasource } from '../datasource'; import type { GetReleasesConfig, ReleaseResult } from '../types'; @@ -51,7 +52,7 @@ export class RubyVersionDatasource extends Datasource { if (columns.length) { const version = columns[0].replace('Ruby ', ''); if (isVersion(version)) { - const releaseTimestamp = columns[1]; + const releaseTimestamp = asTimestamp(columns[1]); const changelogUrl = columns[2] .replace('more...', ''); diff --git a/lib/modules/datasource/rubygems/metadata-cache.spec.ts b/lib/modules/datasource/rubygems/metadata-cache.spec.ts index d1d611ac3c5882..2ebafc33dc489f 100644 --- a/lib/modules/datasource/rubygems/metadata-cache.spec.ts +++ b/lib/modules/datasource/rubygems/metadata-cache.spec.ts @@ -78,19 +78,19 @@ describe('modules/datasource/rubygems/metadata-cache', () => { releases: [ { version: '1.0.0', - releaseTimestamp: '2021-01-01', + releaseTimestamp: '2021-01-01T00:00:00.000Z', changelogUrl: 'https://v1.example.com/changelog', sourceUrl: 'https://v1.example.com/source', }, { version: '2.0.0', - releaseTimestamp: '2022-01-01', + releaseTimestamp: '2022-01-01T00:00:00.000Z', changelogUrl: 'https://v2.example.com/changelog', sourceUrl: 'https://v2.example.com/source', }, { version: '3.0.0', - releaseTimestamp: '2023-01-01', + releaseTimestamp: '2023-01-01T00:00:00.000Z', changelogUrl: 'https://v3.example.com/changelog', sourceUrl: 'https://v3.example.com/source', }, diff --git a/lib/modules/datasource/rubygems/schema.spec.ts b/lib/modules/datasource/rubygems/schema.spec.ts index 5ece346c68d547..ebe3fb212af071 100644 --- a/lib/modules/datasource/rubygems/schema.spec.ts +++ b/lib/modules/datasource/rubygems/schema.spec.ts @@ -97,7 +97,7 @@ describe('modules/datasource/rubygems/schema', () => { releases: [ { version: '1.0.0', - releaseTimestamp: '2021-01-01', + releaseTimestamp: '2021-01-01T00:00:00.000Z', changelogUrl: 'https://example.com', sourceUrl: 'https://example.com', constraints: { @@ -108,7 +108,7 @@ describe('modules/datasource/rubygems/schema', () => { }, { version: '2.0.0', - releaseTimestamp: '2022-01-01', + releaseTimestamp: '2022-01-01T00:00:00.000Z', changelogUrl: 'https://example.com', sourceUrl: 'https://example.com', constraints: { @@ -119,7 +119,7 @@ describe('modules/datasource/rubygems/schema', () => { }, { version: '3.0.0', - releaseTimestamp: '2023-01-01', + releaseTimestamp: '2023-01-01T00:00:00.000Z', changelogUrl: 'https://example.com', sourceUrl: 'https://example.com', constraints: { diff --git a/lib/modules/datasource/rubygems/schema.ts b/lib/modules/datasource/rubygems/schema.ts index 86c856cfebd376..5907078b373f6d 100644 --- a/lib/modules/datasource/rubygems/schema.ts +++ b/lib/modules/datasource/rubygems/schema.ts @@ -3,6 +3,7 @@ import { z } from 'zod'; import { filterMap } from '../../../util/filter-map'; import { newlineRegex } from '../../../util/regex'; import { LooseArray } from '../../../util/schema-utils'; +import { TimestampSchema } from '../../../util/timestamp'; import type { Release } from '../types'; export const MarshalledVersionInfo = LooseArray( @@ -36,7 +37,7 @@ export const GemVersions = LooseArray( z .object({ number: z.string(), - created_at: z.string(), + created_at: TimestampSchema.nullable().catch(null), platform: z.string().optional().catch(undefined), ruby_version: z.string().optional().catch(undefined), rubygems_version: z.string().optional().catch(undefined), diff --git a/lib/modules/datasource/sbt-package/index.ts b/lib/modules/datasource/sbt-package/index.ts index c956922097486c..43697efde46245 100644 --- a/lib/modules/datasource/sbt-package/index.ts +++ b/lib/modules/datasource/sbt-package/index.ts @@ -5,6 +5,8 @@ import * as packageCache from '../../../util/cache/package'; import { cache } from '../../../util/cache/package/decorator'; import { Http } from '../../../util/http'; import { regEx } from '../../../util/regex'; +import type { Timestamp } from '../../../util/timestamp'; +import { asTimestamp } from '../../../util/timestamp'; import { ensureTrailingSlash, trimTrailingSlash } from '../../../util/url'; import * as ivyVersioning from '../../versioning/ivy'; import { compare } from '../../versioning/maven/compare'; @@ -30,7 +32,7 @@ interface ScalaDepCoordinate { interface PomInfo { homepage?: string; sourceUrl?: string; - releaseTimestamp?: string; + releaseTimestamp?: Timestamp; } export class SbtPackageDatasource extends MavenDatasource { @@ -285,7 +287,7 @@ export class SbtPackageDatasource extends MavenDatasource { const result: PomInfo = {}; - const releaseTimestamp = val.lastModified; + const releaseTimestamp = asTimestamp(val.lastModified); if (releaseTimestamp) { result.releaseTimestamp = releaseTimestamp; } diff --git a/lib/modules/datasource/terraform-module/index.ts b/lib/modules/datasource/terraform-module/index.ts index 4e3b25e4bfd3ec..fa6fb3af2da0de 100644 --- a/lib/modules/datasource/terraform-module/index.ts +++ b/lib/modules/datasource/terraform-module/index.ts @@ -2,6 +2,7 @@ import { logger } from '../../../logger'; import { cache } from '../../../util/cache/package/decorator'; import { regEx } from '../../../util/regex'; import { coerceString } from '../../../util/string'; +import { asTimestamp } from '../../../util/timestamp'; import { isHttpUrl } from '../../../util/url'; import * as hashicorpVersioning from '../../versioning/hashicorp'; import type { GetReleasesConfig, ReleaseResult } from '../types'; @@ -128,7 +129,7 @@ export class TerraformModuleDatasource extends TerraformDatasource { (release) => res.version === release.version, ); if (latestVersion) { - latestVersion.releaseTimestamp = res.published_at; + latestVersion.releaseTimestamp = asTimestamp(res.published_at); } return dep; } diff --git a/lib/modules/datasource/terraform-provider/index.ts b/lib/modules/datasource/terraform-provider/index.ts index b960f8cf424803..4edb7d1677a109 100644 --- a/lib/modules/datasource/terraform-provider/index.ts +++ b/lib/modules/datasource/terraform-provider/index.ts @@ -5,6 +5,7 @@ import { ExternalHostError } from '../../../types/errors/external-host-error'; import { cache } from '../../../util/cache/package/decorator'; import * as p from '../../../util/promises'; import { regEx } from '../../../util/regex'; +import { asTimestamp } from '../../../util/timestamp'; import { joinUrlParts } from '../../../util/url'; import * as hashicorpVersioning from '../../versioning/hashicorp'; import { TerraformDatasource } from '../terraform-module/base'; @@ -128,7 +129,7 @@ export class TerraformProviderDatasource extends TerraformDatasource { ); // istanbul ignore else if (latestVersion) { - latestVersion.releaseTimestamp = res.published_at; + latestVersion.releaseTimestamp = asTimestamp(res.published_at); } dep.homepage = `${registryUrl}/providers/${repository}`; return dep; diff --git a/lib/modules/datasource/types.ts b/lib/modules/datasource/types.ts index aea32290d9fbce..9e8e8300819467 100644 --- a/lib/modules/datasource/types.ts +++ b/lib/modules/datasource/types.ts @@ -3,6 +3,7 @@ import type { CustomDatasourceConfig, } from '../../config/types'; import type { ModuleApi } from '../../types'; +import type { Timestamp } from '../../util/timestamp'; export interface GetDigestInputConfig { datasource: string; @@ -59,7 +60,7 @@ export interface Release { gitRef?: string; isDeprecated?: boolean; isStable?: boolean; - releaseTimestamp?: string | null; + releaseTimestamp?: Timestamp | null; version: string; /** The original value to which `extractVersion` was applied */ versionOrig?: string; diff --git a/lib/modules/datasource/unity3d/index.ts b/lib/modules/datasource/unity3d/index.ts index a54bbb03e61085..e134d9aba3a667 100644 --- a/lib/modules/datasource/unity3d/index.ts +++ b/lib/modules/datasource/unity3d/index.ts @@ -2,6 +2,7 @@ import type { XmlElement } from 'xmldoc'; import { XmlDocument } from 'xmldoc'; import { logger } from '../../../logger'; import { cache } from '../../../util/cache/package/decorator'; +import { asTimestamp } from '../../../util/timestamp'; import * as Unity3dVersioning from '../../versioning/unity3d'; import { Datasource } from '../datasource'; import type { GetReleasesConfig, Release, ReleaseResult } from '../types'; @@ -64,7 +65,7 @@ export class Unity3dDatasource extends Datasource { const versionWithoutHash = itemNode.childNamed('title')?.val; const release: Release = { version: withHash ? versionWithHash : versionWithoutHash!, - releaseTimestamp: itemNode.childNamed('pubDate')?.val, + releaseTimestamp: asTimestamp(itemNode.childNamed('pubDate')?.val), changelogUrl: itemNode.childNamed('link')?.val, isStable: registryUrl !== Unity3dDatasource.streams.beta, registryUrl, diff --git a/lib/modules/manager/types.ts b/lib/modules/manager/types.ts index 6c93b44a19556a..0937191789a0b6 100644 --- a/lib/modules/manager/types.ts +++ b/lib/modules/manager/types.ts @@ -14,6 +14,7 @@ import type { } from '../../types'; import type { FileChange } from '../../util/git/types'; import type { MergeConfidence } from '../../util/merge-confidence/types'; +import type { Timestamp } from '../../util/timestamp'; import type { CustomExtractConfig } from './custom/types'; export type MaybePromise = T | Promise; @@ -103,7 +104,7 @@ export interface LookupUpdate { userStrings?: Record; checksumUrl?: string; downloadUrl?: string; - releaseTimestamp?: any; + releaseTimestamp?: Timestamp; newVersionAgeInDays?: number; registryUrl?: string; libYears?: number; diff --git a/lib/util/github/graphql/cache-strategies/memory-cache-strategy.spec.ts b/lib/util/github/graphql/cache-strategies/memory-cache-strategy.spec.ts index ac1abbb09b38fa..8fb5f1849ae9ac 100644 --- a/lib/util/github/graphql/cache-strategies/memory-cache-strategy.spec.ts +++ b/lib/util/github/graphql/cache-strategies/memory-cache-strategy.spec.ts @@ -1,6 +1,7 @@ import { DateTime, Settings } from 'luxon'; import * as memCache from '../../../cache/memory'; import { clone } from '../../../clone'; +import type { Timestamp } from '../../../timestamp'; import type { GithubDatasourceItem, GithubGraphqlCacheRecord } from '../types'; import { GithubGraphqlMemoryCacheStrategy } from './memory-cache-strategy'; @@ -21,7 +22,7 @@ const isoTs = (t: string) => { } else { throw new Error('Unrecognized date-time string. ' + t); } - return iso; + return iso as Timestamp; }; const mockTime = (input: string): void => { diff --git a/lib/util/github/graphql/cache-strategies/package-cache-strategy.spec.ts b/lib/util/github/graphql/cache-strategies/package-cache-strategy.spec.ts index eb386ca9e6f21d..4208ff1bb5ac1f 100644 --- a/lib/util/github/graphql/cache-strategies/package-cache-strategy.spec.ts +++ b/lib/util/github/graphql/cache-strategies/package-cache-strategy.spec.ts @@ -1,10 +1,11 @@ import { DateTime, Settings } from 'luxon'; +import type { Timestamp } from '../../../../util/timestamp'; import * as packageCache from '../../../cache/package'; import { clone } from '../../../clone'; import type { GithubDatasourceItem, GithubGraphqlCacheRecord } from '../types'; import { GithubGraphqlPackageCacheStrategy } from './package-cache-strategy'; -const isoTs = (t: string) => t.replace(' ', 'T') + ':00.000Z'; +const isoTs = (t: string) => (t.replace(' ', 'T') + ':00.000Z') as Timestamp; const mockTime = (input: string): void => { const now = DateTime.fromISO(isoTs(input)).valueOf(); diff --git a/lib/util/github/graphql/datasource-fetcher.spec.ts b/lib/util/github/graphql/datasource-fetcher.spec.ts index ba139bf80a4c33..7046905135fbef 100644 --- a/lib/util/github/graphql/datasource-fetcher.spec.ts +++ b/lib/util/github/graphql/datasource-fetcher.spec.ts @@ -2,6 +2,7 @@ import AggregateError from 'aggregate-error'; import * as httpMock from '../../../../test/http-mock'; import { mocked, partial } from '../../../../test/util'; import * as _packageCache from '../../../util/cache/package'; +import type { Timestamp } from '../../../util/timestamp'; import type { GithubGraphqlResponse } from '../../http/github'; import { GithubHttp } from '../../http/github'; import { range } from '../../range'; @@ -54,7 +55,7 @@ const adapter: GithubGraphqlDatasourceAdapter< version && releaseTimestamp && foo ? { version, - releaseTimestamp, + releaseTimestamp: releaseTimestamp as Timestamp, bar: foo, } : null, diff --git a/lib/util/github/graphql/index.spec.ts b/lib/util/github/graphql/index.spec.ts index a234bac6dd19c0..0a01cfebd03c4c 100644 --- a/lib/util/github/graphql/index.spec.ts +++ b/lib/util/github/graphql/index.spec.ts @@ -72,7 +72,7 @@ describe('util/github/graphql/index', () => { expect(res).toEqual([ { version: '1.2.3', - releaseTimestamp: '2024-09-24', + releaseTimestamp: '2024-09-24T00:00:00.000Z', url: 'https://example.com', id: 123, name: 'name', diff --git a/lib/util/github/graphql/query-adapters/releases-query-adapter.spec.ts b/lib/util/github/graphql/query-adapters/releases-query-adapter.spec.ts index 7e874c311eff30..bd1620fe2cc5e5 100644 --- a/lib/util/github/graphql/query-adapters/releases-query-adapter.spec.ts +++ b/lib/util/github/graphql/query-adapters/releases-query-adapter.spec.ts @@ -1,9 +1,10 @@ +import type { Timestamp } from '../../../../util/timestamp'; import { adapter } from './releases-query-adapter'; import type { GithubGraphqlRelease } from './releases-query-adapter'; const item: GithubGraphqlRelease = { version: '1.2.3', - releaseTimestamp: '2024-09-24', + releaseTimestamp: '2024-09-24' as Timestamp, isDraft: false, isPrerelease: false, url: 'https://example.com', @@ -18,7 +19,7 @@ describe('util/github/graphql/query-adapters/releases-query-adapter', () => { description: 'description', id: 123, name: 'name', - releaseTimestamp: '2024-09-24', + releaseTimestamp: '2024-09-24T00:00:00.000Z' as Timestamp, url: 'https://example.com', version: '1.2.3', }); diff --git a/lib/util/github/graphql/query-adapters/releases-query-adapter.ts b/lib/util/github/graphql/query-adapters/releases-query-adapter.ts index 65cf0cfb10a2d5..504a6cd8c2275b 100644 --- a/lib/util/github/graphql/query-adapters/releases-query-adapter.ts +++ b/lib/util/github/graphql/query-adapters/releases-query-adapter.ts @@ -1,4 +1,5 @@ import { z } from 'zod'; +import { TimestampSchema } from '../../../timestamp'; import type { GithubGraphqlDatasourceAdapter, GithubReleaseItem, @@ -32,7 +33,7 @@ const query = prepareQuery(` const GithubGraphqlRelease = z.object({ version: z.string(), - releaseTimestamp: z.string(), + releaseTimestamp: TimestampSchema.nullable().catch(null), isDraft: z.boolean(), isPrerelease: z.boolean(), url: z.string(), diff --git a/lib/util/github/graphql/query-adapters/tags-query-adapter.spec.ts b/lib/util/github/graphql/query-adapters/tags-query-adapter.spec.ts index 07a83d1536feb3..ac6f68968f3253 100644 --- a/lib/util/github/graphql/query-adapters/tags-query-adapter.spec.ts +++ b/lib/util/github/graphql/query-adapters/tags-query-adapter.spec.ts @@ -1,3 +1,4 @@ +import type { Timestamp } from '../../../../util/timestamp'; import { adapter } from './tags-query-adapter'; describe('util/github/graphql/query-adapters/tags-query-adapter', () => { @@ -8,14 +9,14 @@ describe('util/github/graphql/query-adapters/tags-query-adapter', () => { target: { type: 'Commit', oid: 'abc123', - releaseTimestamp: '2022-09-24', + releaseTimestamp: '2022-09-24' as Timestamp, }, }), ).toEqual({ version: '1.2.3', gitRef: '1.2.3', hash: 'abc123', - releaseTimestamp: '2022-09-24', + releaseTimestamp: '2022-09-24' as Timestamp, }); }); @@ -26,14 +27,14 @@ describe('util/github/graphql/query-adapters/tags-query-adapter', () => { target: { type: 'Tag', target: { oid: 'abc123' }, - tagger: { releaseTimestamp: '2022-09-24' }, + tagger: { releaseTimestamp: '2022-09-24' as Timestamp }, }, }), ).toEqual({ version: '1.2.3', gitRef: '1.2.3', hash: 'abc123', - releaseTimestamp: '2022-09-24', + releaseTimestamp: '2022-09-24' as Timestamp, }); }); diff --git a/lib/util/github/graphql/query-adapters/tags-query-adapter.ts b/lib/util/github/graphql/query-adapters/tags-query-adapter.ts index 0fbb2cf7728ccc..c2736988eae6a5 100644 --- a/lib/util/github/graphql/query-adapters/tags-query-adapter.ts +++ b/lib/util/github/graphql/query-adapters/tags-query-adapter.ts @@ -1,4 +1,5 @@ import { z } from 'zod'; +import { TimestampSchema } from '../../../timestamp'; import type { GithubGraphqlDatasourceAdapter, GithubTagItem } from '../types'; import { prepareQuery } from '../util'; @@ -10,7 +11,7 @@ const GithubGraphqlTag = z.object({ z.object({ type: z.literal('Commit'), oid: z.string(), - releaseTimestamp: z.string(), + releaseTimestamp: TimestampSchema.nullable().catch(null), }), z.object({ type: z.literal('Tag'), @@ -18,7 +19,7 @@ const GithubGraphqlTag = z.object({ oid: z.string(), }), tagger: z.object({ - releaseTimestamp: z.string(), + releaseTimestamp: TimestampSchema.nullable().catch(null), }), }), ]), diff --git a/lib/util/github/graphql/types.ts b/lib/util/github/graphql/types.ts index 61c8f864300786..ed0f8bd51fd36e 100644 --- a/lib/util/github/graphql/types.ts +++ b/lib/util/github/graphql/types.ts @@ -1,8 +1,9 @@ import type { PackageCacheNamespace } from '../../cache/package/types'; +import type { Timestamp } from '../../timestamp'; export interface GithubDatasourceItem { version: string; - releaseTimestamp: string; + releaseTimestamp: Timestamp; } /** diff --git a/lib/util/github/tags.spec.ts b/lib/util/github/tags.spec.ts index 5eb4a304404ed1..ff811d09eaea7f 100644 --- a/lib/util/github/tags.spec.ts +++ b/lib/util/github/tags.spec.ts @@ -1,3 +1,4 @@ +import type { Timestamp } from '../../util/timestamp'; import { GithubHttp } from '../http/github'; import * as githubGraphql from './graphql'; import { findCommitOfTag } from './tags'; @@ -12,13 +13,13 @@ describe('util/github/tags', () => { { version: 'v1.0.0', gitRef: 'v1.0.0', - releaseTimestamp: '2021-01-01', + releaseTimestamp: '2021-01-01' as Timestamp, hash: '123', }, { version: 'v2.0.0', gitRef: 'v2.0.0', - releaseTimestamp: '2022-01-01', + releaseTimestamp: '2022-01-01' as Timestamp, hash: 'abc', }, ]); diff --git a/lib/workers/repository/process/libyear.spec.ts b/lib/workers/repository/process/libyear.spec.ts index e4a1f1fe24ff43..c8e32d80bb8e11 100644 --- a/lib/workers/repository/process/libyear.spec.ts +++ b/lib/workers/repository/process/libyear.spec.ts @@ -1,5 +1,6 @@ import { logger } from '../../../../test/util'; import type { PackageFile } from '../../../modules/manager/types'; +import type { Timestamp } from '../../../util/timestamp'; import { calculateLibYears } from './libyear'; describe('workers/repository/process/libyear', () => { @@ -30,15 +31,15 @@ describe('workers/repository/process/libyear', () => { { depName: 'dep1', currentVersion: '0.1.0', - currentVersionTimestamp: '2019-07-01T00:00:00Z', + currentVersionTimestamp: '2019-07-01T00:00:00Z' as Timestamp, updates: [ { newVersion: '1.0.0', - releaseTimestamp: '2020-01-01T00:00:00Z', + releaseTimestamp: '2020-01-01T00:00:00Z' as Timestamp, }, { newVersion: '2.0.0', - releaseTimestamp: '2020-07-01T00:00:00Z', + releaseTimestamp: '2020-07-01T00:00:00Z' as Timestamp, }, { newVersion: '3.0.0', @@ -55,11 +56,11 @@ describe('workers/repository/process/libyear', () => { { depName: 'dep2', currentVersion: '1.0.0', - currentVersionTimestamp: '2019-07-01T00:00:00Z', + currentVersionTimestamp: '2019-07-01T00:00:00Z' as Timestamp, updates: [ { newVersion: '2.0.0', - releaseTimestamp: '2020-01-01T00:00:00Z', + releaseTimestamp: '2020-01-01T00:00:00Z' as Timestamp, }, ], }, @@ -69,7 +70,7 @@ describe('workers/repository/process/libyear', () => { updates: [ { newVersion: '2.0.0', - releaseTimestamp: '2020-01-01T00:00:00Z', + releaseTimestamp: '2020-01-01T00:00:00Z' as Timestamp, }, ], }, diff --git a/lib/workers/repository/process/lookup/filter-checks.spec.ts b/lib/workers/repository/process/lookup/filter-checks.spec.ts index aa1f3d63fed6b6..37c0a56d664650 100644 --- a/lib/workers/repository/process/lookup/filter-checks.spec.ts +++ b/lib/workers/repository/process/lookup/filter-checks.spec.ts @@ -13,6 +13,7 @@ import { clone } from '../../../../util/clone'; import * as _dateUtil from '../../../../util/date'; import * as _mergeConfidence from '../../../../util/merge-confidence'; import { toMs } from '../../../../util/pretty-time'; +import type { Timestamp } from '../../../../util/timestamp'; import { filterInternalChecks } from './filter-checks'; import type { LookupUpdateConfig, UpdateResult } from './types'; @@ -42,19 +43,19 @@ const versioning = allVersioning.get('semver'); const releases: Release[] = [ { version: '1.0.1', - releaseTimestamp: '2021-01-01T00:00:01.000Z', + releaseTimestamp: '2021-01-01T00:00:01.000Z' as Timestamp, }, { version: '1.0.2', - releaseTimestamp: '2021-01-03T00:00:00.000Z', + releaseTimestamp: '2021-01-03T00:00:00.000Z' as Timestamp, }, { version: '1.0.3', - releaseTimestamp: '2021-01-05T00:00:00.000Z', + releaseTimestamp: '2021-01-05T00:00:00.000Z' as Timestamp, }, { version: '1.0.4', - releaseTimestamp: '2021-01-07T00:00:00.000Z', + releaseTimestamp: '2021-01-07T00:00:00.000Z' as Timestamp, }, ]; diff --git a/lib/workers/repository/process/lookup/filter.spec.ts b/lib/workers/repository/process/lookup/filter.spec.ts index e445a9b0fdffdb..5cdf6f78b895e9 100644 --- a/lib/workers/repository/process/lookup/filter.spec.ts +++ b/lib/workers/repository/process/lookup/filter.spec.ts @@ -1,6 +1,7 @@ import { partial } from '../../../../../test/util'; import type { Release } from '../../../../modules/datasource/types'; import * as allVersioning from '../../../../modules/versioning'; +import type { Timestamp } from '../../../../util/timestamp'; import { filterVersions } from './filter'; import type { FilterConfig } from './types'; @@ -12,24 +13,24 @@ describe('workers/repository/process/lookup/filter', () => { const releases = [ { version: '1.0.1', - releaseTimestamp: '2021-01-01T00:00:01.000Z', + releaseTimestamp: '2021-01-01T00:00:01.000Z' as Timestamp, }, { version: '1.2.0', - releaseTimestamp: '2021-01-03T00:00:00.000Z', + releaseTimestamp: '2021-01-03T00:00:00.000Z' as Timestamp, }, { version: '2.0.0', - releaseTimestamp: '2021-01-05T00:00:00.000Z', + releaseTimestamp: '2021-01-05T00:00:00.000Z' as Timestamp, }, { version: '2.1.0', - releaseTimestamp: '2021-01-07T00:00:00.000Z', + releaseTimestamp: '2021-01-07T00:00:00.000Z' as Timestamp, }, // for coverage { version: 'invalid.version', - releaseTimestamp: '2021-01-07T00:00:00.000Z', + releaseTimestamp: '2021-01-07T00:00:00.000Z' as Timestamp, }, ] satisfies Release[]; diff --git a/lib/workers/repository/process/lookup/index.spec.ts b/lib/workers/repository/process/lookup/index.spec.ts index 26e13ba8e45673..4d53594278f994 100644 --- a/lib/workers/repository/process/lookup/index.spec.ts +++ b/lib/workers/repository/process/lookup/index.spec.ts @@ -17,6 +17,7 @@ import { MavenDatasource } from '../../../../modules/datasource/maven'; import { NpmDatasource } from '../../../../modules/datasource/npm'; import { PackagistDatasource } from '../../../../modules/datasource/packagist'; import { PypiDatasource } from '../../../../modules/datasource/pypi'; +import type { Timestamp } from '../../../../util/timestamp'; import { id as composerVersioningId } from '../../../../modules/versioning/composer'; import { id as debianVersioningId } from '../../../../modules/versioning/debian'; import { id as dockerVersioningId } from '../../../../modules/versioning/docker'; @@ -162,7 +163,7 @@ describe('workers/repository/process/lookup/index', () => { newValue: '1.4.1', newVersion: '1.4.1', newVersionAgeInDays: expect.any(Number), - releaseTimestamp: '2015-05-17T04:25:07.299Z', + releaseTimestamp: '2015-05-17T04:25:07.299Z' as Timestamp, updateType: 'major', }, ]); @@ -219,7 +220,7 @@ describe('workers/repository/process/lookup/index', () => { newValue: '^0.9.0', newVersion: '0.9.7', newVersionAgeInDays: expect.any(Number), - releaseTimestamp: '2013-09-04T17:07:22.948Z', + releaseTimestamp: '2013-09-04T17:07:22.948Z' as Timestamp, updateType: 'minor', }, { @@ -231,7 +232,7 @@ describe('workers/repository/process/lookup/index', () => { newValue: '^1.0.0', newVersion: '1.4.1', newVersionAgeInDays: expect.any(Number), - releaseTimestamp: '2015-05-17T04:25:07.299Z', + releaseTimestamp: '2015-05-17T04:25:07.299Z' as Timestamp, updateType: 'major', }, ]); @@ -261,7 +262,7 @@ describe('workers/repository/process/lookup/index', () => { newValue: '^0.4.0', newVersion: '0.4.4', newVersionAgeInDays: expect.any(Number), - releaseTimestamp: '2011-06-10T17:20:04.719Z', + releaseTimestamp: '2011-06-10T17:20:04.719Z' as Timestamp, updateType: 'patch', }, { @@ -273,7 +274,7 @@ describe('workers/repository/process/lookup/index', () => { newValue: '^0.9.0', newVersion: '0.9.7', newVersionAgeInDays: expect.any(Number), - releaseTimestamp: '2013-09-04T17:07:22.948Z', + releaseTimestamp: '2013-09-04T17:07:22.948Z' as Timestamp, updateType: 'minor', }, { @@ -285,7 +286,7 @@ describe('workers/repository/process/lookup/index', () => { newValue: '^1.0.0', newVersion: '1.4.1', newVersionAgeInDays: expect.any(Number), - releaseTimestamp: '2015-05-17T04:25:07.299Z', + releaseTimestamp: '2015-05-17T04:25:07.299Z' as Timestamp, updateType: 'major', }, ]); @@ -436,7 +437,7 @@ describe('workers/repository/process/lookup/index', () => { newValue: '^0.9.0', newVersion: '0.9.7', newVersionAgeInDays: expect.any(Number), - releaseTimestamp: '2013-09-04T17:07:22.948Z', + releaseTimestamp: '2013-09-04T17:07:22.948Z' as Timestamp, updateType: 'minor', }, { @@ -448,7 +449,7 @@ describe('workers/repository/process/lookup/index', () => { newValue: '^1.0.0', newVersion: '1.4.1', newVersionAgeInDays: expect.any(Number), - releaseTimestamp: '2015-05-17T04:25:07.299Z', + releaseTimestamp: '2015-05-17T04:25:07.299Z' as Timestamp, updateType: 'major', }, ]); @@ -500,7 +501,7 @@ describe('workers/repository/process/lookup/index', () => { newValue: '0.9.7', newVersion: '0.9.7', newVersionAgeInDays: expect.any(Number), - releaseTimestamp: '2013-09-04T17:07:22.948Z', + releaseTimestamp: '2013-09-04T17:07:22.948Z' as Timestamp, updateType: 'minor', }, ]); @@ -526,7 +527,7 @@ describe('workers/repository/process/lookup/index', () => { newValue: '0.9.7', newVersion: '0.9.7', newVersionAgeInDays: expect.any(Number), - releaseTimestamp: '2013-09-04T17:07:22.948Z', + releaseTimestamp: '2013-09-04T17:07:22.948Z' as Timestamp, updateType: 'minor', }, ]); @@ -553,7 +554,7 @@ describe('workers/repository/process/lookup/index', () => { newValue: '0.9.7', newVersion: '0.9.7', newVersionAgeInDays: expect.any(Number), - releaseTimestamp: '2013-09-04T17:07:22.948Z', + releaseTimestamp: '2013-09-04T17:07:22.948Z' as Timestamp, updateType: 'minor', }, ]); @@ -580,7 +581,7 @@ describe('workers/repository/process/lookup/index', () => { newValue: '0.9.4', newVersion: '0.9.4', newVersionAgeInDays: expect.any(Number), - releaseTimestamp: '2013-05-22T20:26:50.888Z', + releaseTimestamp: '2013-05-22T20:26:50.888Z' as Timestamp, updateType: 'minor', }, ]); @@ -699,7 +700,7 @@ describe('workers/repository/process/lookup/index', () => { newValue: '0.9.7', newVersion: '0.9.7', newVersionAgeInDays: expect.any(Number), - releaseTimestamp: '2013-09-04T17:07:22.948Z', + releaseTimestamp: '2013-09-04T17:07:22.948Z' as Timestamp, updateType: 'patch', }, { @@ -710,7 +711,7 @@ describe('workers/repository/process/lookup/index', () => { newValue: '1.4.1', newVersion: '1.4.1', newVersionAgeInDays: expect.any(Number), - releaseTimestamp: '2015-05-17T04:25:07.299Z', + releaseTimestamp: '2015-05-17T04:25:07.299Z' as Timestamp, updateType: 'major', }, ]); @@ -737,7 +738,7 @@ describe('workers/repository/process/lookup/index', () => { newValue: '0.8.12', newVersion: '0.8.12', newVersionAgeInDays: expect.any(Number), - releaseTimestamp: expect.any(String), + releaseTimestamp: '2013-09-04T17:07:22.948Z' as Timestamp, updateType: 'patch', }, { @@ -748,7 +749,7 @@ describe('workers/repository/process/lookup/index', () => { newValue: '0.9.7', newVersion: '0.9.7', newVersionAgeInDays: expect.any(Number), - releaseTimestamp: expect.any(String), + releaseTimestamp: '2013-09-04T17:07:22.948Z' as Timestamp, updateType: 'minor', }, { @@ -759,7 +760,7 @@ describe('workers/repository/process/lookup/index', () => { newValue: '1.4.1', newVersion: '1.4.1', newVersionAgeInDays: expect.any(Number), - releaseTimestamp: expect.any(String), + releaseTimestamp: '2015-05-17T04:25:07.299Z' as Timestamp, updateType: 'major', }, ]); @@ -794,7 +795,7 @@ describe('workers/repository/process/lookup/index', () => { newValue: '^1.0.0', newVersion: '1.4.1', newVersionAgeInDays: expect.any(Number), - releaseTimestamp: '2015-05-17T04:25:07.299Z', + releaseTimestamp: '2015-05-17T04:25:07.299Z' as Timestamp, updateType: 'major', }, ]); @@ -821,7 +822,7 @@ describe('workers/repository/process/lookup/index', () => { newValue: '1.4.1', newVersion: '1.4.1', newVersionAgeInDays: expect.any(Number), - releaseTimestamp: '2015-05-17T04:25:07.299Z', + releaseTimestamp: '2015-05-17T04:25:07.299Z' as Timestamp, updateType: 'minor', }, ]); @@ -1059,7 +1060,7 @@ describe('workers/repository/process/lookup/index', () => { newValue: '~0.9.0', newVersion: '0.9.7', newVersionAgeInDays: expect.any(Number), - releaseTimestamp: '2013-09-04T17:07:22.948Z', + releaseTimestamp: '2013-09-04T17:07:22.948Z' as Timestamp, updateType: 'minor', }, { @@ -1071,7 +1072,7 @@ describe('workers/repository/process/lookup/index', () => { newValue: '~1.4.0', newVersion: '1.4.1', newVersionAgeInDays: expect.any(Number), - releaseTimestamp: '2015-05-17T04:25:07.299Z', + releaseTimestamp: '2015-05-17T04:25:07.299Z' as Timestamp, updateType: 'major', }, ]); @@ -1216,7 +1217,7 @@ describe('workers/repository/process/lookup/index', () => { newValue: '~1.4.0', newVersion: '1.4.1', newVersionAgeInDays: expect.any(Number), - releaseTimestamp: '2015-05-17T04:25:07.299Z', + releaseTimestamp: '2015-05-17T04:25:07.299Z' as Timestamp, updateType: 'major', }, ]); @@ -1250,7 +1251,7 @@ describe('workers/repository/process/lookup/index', () => { newValue: '~1.4.0', newVersion: '1.4.1', newVersionAgeInDays: expect.any(Number), - releaseTimestamp: '2015-05-17T04:25:07.299Z', + releaseTimestamp: '2015-05-17T04:25:07.299Z' as Timestamp, updateType: 'minor', }, ]); @@ -1279,7 +1280,7 @@ describe('workers/repository/process/lookup/index', () => { newValue: '^1.2.1', newVersion: '1.4.1', newVersionAgeInDays: expect.any(Number), - releaseTimestamp: expect.any(String), + releaseTimestamp: '2015-05-17T04:25:07.299Z' as Timestamp, updateType: 'minor', }, ]); @@ -1308,7 +1309,7 @@ describe('workers/repository/process/lookup/index', () => { newValue: '^1.2.1', newVersion: '1.4.1', newVersionAgeInDays: expect.any(Number), - releaseTimestamp: expect.any(String), + releaseTimestamp: '2015-05-17T04:25:07.299Z' as Timestamp, updateType: 'minor', }, ]); @@ -1337,7 +1338,7 @@ describe('workers/repository/process/lookup/index', () => { newValue: '~1.2.0', newVersion: '1.2.1', newVersionAgeInDays: expect.any(Number), - releaseTimestamp: expect.any(String), + releaseTimestamp: '2015-05-17T04:25:07.299Z' as Timestamp, updateType: 'patch', }, ]); @@ -1365,7 +1366,7 @@ describe('workers/repository/process/lookup/index', () => { newValue: undefined, newVersion: '1.4.1', newVersionAgeInDays: expect.any(Number), - releaseTimestamp: expect.any(String), + releaseTimestamp: '2015-05-17T04:25:07.299Z' as Timestamp, updateType: 'minor', }, ]); @@ -1391,7 +1392,7 @@ describe('workers/repository/process/lookup/index', () => { newPatch: 0, newValue: undefined, newVersion: '1.3.0', - releaseTimestamp: '2015-04-26T16:42:11.311Z', + releaseTimestamp: '2015-04-26T16:42:11.311Z' as Timestamp, updateType: 'minor', }, ]); @@ -1420,7 +1421,7 @@ describe('workers/repository/process/lookup/index', () => { newValue: '~1.3.0 || ~1.4.0', newVersion: '1.4.1', newVersionAgeInDays: expect.any(Number), - releaseTimestamp: '2015-05-17T04:25:07.299Z', + releaseTimestamp: '2015-05-17T04:25:07.299Z' as Timestamp, updateType: 'minor', }, ]); @@ -1447,7 +1448,7 @@ describe('workers/repository/process/lookup/index', () => { newValue: '~1.4.0', newVersion: '1.4.1', newVersionAgeInDays: expect.any(Number), - releaseTimestamp: '2015-05-17T04:25:07.299Z', + releaseTimestamp: '2015-05-17T04:25:07.299Z' as Timestamp, updateType: 'minor', }, ]); @@ -1477,7 +1478,7 @@ describe('workers/repository/process/lookup/index', () => { newValue: '^2.0.0 || ^3.0.0', newVersion: '3.8.1', newVersionAgeInDays: expect.any(Number), - releaseTimestamp: '2017-10-17T15:22:36.646Z', + releaseTimestamp: '2017-10-17T15:22:36.646Z' as Timestamp, updateType: 'major', }, ]); @@ -1507,7 +1508,7 @@ describe('workers/repository/process/lookup/index', () => { newValue: '^3.0.0', newVersion: '3.8.1', newVersionAgeInDays: expect.any(Number), - releaseTimestamp: '2017-10-17T15:22:36.646Z', + releaseTimestamp: '2017-10-17T15:22:36.646Z' as Timestamp, updateType: 'major', }, ]); @@ -1615,7 +1616,7 @@ describe('workers/repository/process/lookup/index', () => { newValue: '~1.4.0', newVersion: '1.4.1', newVersionAgeInDays: expect.any(Number), - releaseTimestamp: '2015-05-17T04:25:07.299Z', + releaseTimestamp: '2015-05-17T04:25:07.299Z' as Timestamp, updateType: 'minor', }, ]); @@ -1649,7 +1650,7 @@ describe('workers/repository/process/lookup/index', () => { newValue: '1.4.x', newVersion: '1.4.1', newVersionAgeInDays: expect.any(Number), - releaseTimestamp: '2015-05-17T04:25:07.299Z', + releaseTimestamp: '2015-05-17T04:25:07.299Z' as Timestamp, updateType: 'minor', }, ]); @@ -1676,7 +1677,7 @@ describe('workers/repository/process/lookup/index', () => { newValue: '~1.4.0', newVersion: '1.4.1', newVersionAgeInDays: expect.any(Number), - releaseTimestamp: '2015-05-17T04:25:07.299Z', + releaseTimestamp: '2015-05-17T04:25:07.299Z' as Timestamp, updateType: 'minor', }, ]); @@ -1703,7 +1704,7 @@ describe('workers/repository/process/lookup/index', () => { newValue: '1.x', newVersion: '1.4.1', newVersionAgeInDays: expect.any(Number), - releaseTimestamp: '2015-05-17T04:25:07.299Z', + releaseTimestamp: '2015-05-17T04:25:07.299Z' as Timestamp, updateType: 'major', }, ]); @@ -1730,7 +1731,7 @@ describe('workers/repository/process/lookup/index', () => { newValue: '1.4.x', newVersion: '1.4.1', newVersionAgeInDays: expect.any(Number), - releaseTimestamp: '2015-05-17T04:25:07.299Z', + releaseTimestamp: '2015-05-17T04:25:07.299Z' as Timestamp, updateType: 'minor', }, ]); @@ -1757,7 +1758,7 @@ describe('workers/repository/process/lookup/index', () => { newValue: '1.2.x - 1.4.x', newVersion: '1.4.1', newVersionAgeInDays: expect.any(Number), - releaseTimestamp: '2015-05-17T04:25:07.299Z', + releaseTimestamp: '2015-05-17T04:25:07.299Z' as Timestamp, updateType: 'minor', }, ]); @@ -1784,7 +1785,7 @@ describe('workers/repository/process/lookup/index', () => { newValue: '1', newVersion: '1.4.1', newVersionAgeInDays: expect.any(Number), - releaseTimestamp: '2015-05-17T04:25:07.299Z', + releaseTimestamp: '2015-05-17T04:25:07.299Z' as Timestamp, updateType: 'major', }, ]); @@ -1811,7 +1812,7 @@ describe('workers/repository/process/lookup/index', () => { newValue: '1.4', newVersion: '1.4.1', newVersionAgeInDays: expect.any(Number), - releaseTimestamp: '2015-05-17T04:25:07.299Z', + releaseTimestamp: '2015-05-17T04:25:07.299Z' as Timestamp, updateType: 'minor', }, ]); @@ -1838,7 +1839,7 @@ describe('workers/repository/process/lookup/index', () => { newValue: '~0.9.0', newVersion: '0.9.7', newVersionAgeInDays: expect.any(Number), - releaseTimestamp: '2013-09-04T17:07:22.948Z', + releaseTimestamp: '2013-09-04T17:07:22.948Z' as Timestamp, updateType: 'minor', }, { @@ -1850,7 +1851,7 @@ describe('workers/repository/process/lookup/index', () => { newValue: '~1.4.0', newVersion: '1.4.1', newVersionAgeInDays: expect.any(Number), - releaseTimestamp: '2015-05-17T04:25:07.299Z', + releaseTimestamp: '2015-05-17T04:25:07.299Z' as Timestamp, updateType: 'major', }, ]); @@ -1877,7 +1878,7 @@ describe('workers/repository/process/lookup/index', () => { newValue: '^0.9.0', newVersion: '0.9.7', newVersionAgeInDays: expect.any(Number), - releaseTimestamp: '2013-09-04T17:07:22.948Z', + releaseTimestamp: '2013-09-04T17:07:22.948Z' as Timestamp, updateType: 'minor', }, { @@ -1889,7 +1890,7 @@ describe('workers/repository/process/lookup/index', () => { newValue: '^1.0.0', newVersion: '1.4.1', newVersionAgeInDays: expect.any(Number), - releaseTimestamp: '2015-05-17T04:25:07.299Z', + releaseTimestamp: '2015-05-17T04:25:07.299Z' as Timestamp, updateType: 'major', }, ]); @@ -1958,7 +1959,7 @@ describe('workers/repository/process/lookup/index', () => { newValue: '^1.0.0 || ^2.0.0 || ^3.0.0', newVersion: '3.8.1', newVersionAgeInDays: expect.any(Number), - releaseTimestamp: '2017-10-17T15:22:36.646Z', + releaseTimestamp: '2017-10-17T15:22:36.646Z' as Timestamp, updateType: 'major', }, ]); @@ -1988,7 +1989,7 @@ describe('workers/repository/process/lookup/index', () => { newValue: '1.x - 3.x', newVersion: '3.8.1', newVersionAgeInDays: expect.any(Number), - releaseTimestamp: '2017-10-17T15:22:36.646Z', + releaseTimestamp: '2017-10-17T15:22:36.646Z' as Timestamp, updateType: 'major', }, ]); @@ -2018,7 +2019,7 @@ describe('workers/repository/process/lookup/index', () => { newValue: '1.x || 2.x || 3.x', newVersion: '3.8.1', newVersionAgeInDays: expect.any(Number), - releaseTimestamp: '2017-10-17T15:22:36.646Z', + releaseTimestamp: '2017-10-17T15:22:36.646Z' as Timestamp, updateType: 'major', }, ]); @@ -2048,7 +2049,7 @@ describe('workers/repository/process/lookup/index', () => { newValue: '1 || 2 || 3', newVersion: '3.8.1', newVersionAgeInDays: expect.any(Number), - releaseTimestamp: '2017-10-17T15:22:36.646Z', + releaseTimestamp: '2017-10-17T15:22:36.646Z' as Timestamp, updateType: 'major', }, ]); @@ -2075,7 +2076,7 @@ describe('workers/repository/process/lookup/index', () => { newValue: '~1.2.0 || ~1.3.0 || ~1.4.0', newVersion: '1.4.1', newVersionAgeInDays: expect.any(Number), - releaseTimestamp: '2015-05-17T04:25:07.299Z', + releaseTimestamp: '2015-05-17T04:25:07.299Z' as Timestamp, updateType: 'minor', }, ]); @@ -2116,7 +2117,7 @@ describe('workers/repository/process/lookup/index', () => { newValue: '<= 0.9.7', newVersion: '0.9.7', newVersionAgeInDays: expect.any(Number), - releaseTimestamp: '2013-09-04T17:07:22.948Z', + releaseTimestamp: '2013-09-04T17:07:22.948Z' as Timestamp, updateType: 'minor', }, { @@ -2128,7 +2129,7 @@ describe('workers/repository/process/lookup/index', () => { newValue: '<= 1.4.1', newVersion: '1.4.1', newVersionAgeInDays: expect.any(Number), - releaseTimestamp: '2015-05-17T04:25:07.299Z', + releaseTimestamp: '2015-05-17T04:25:07.299Z' as Timestamp, updateType: 'major', }, ]); @@ -2155,7 +2156,7 @@ describe('workers/repository/process/lookup/index', () => { newValue: '< 0.9.8', newVersion: '0.9.7', newVersionAgeInDays: expect.any(Number), - releaseTimestamp: '2013-09-04T17:07:22.948Z', + releaseTimestamp: '2013-09-04T17:07:22.948Z' as Timestamp, updateType: 'minor', }, { @@ -2167,7 +2168,7 @@ describe('workers/repository/process/lookup/index', () => { newValue: '< 1.4.2', newVersion: '1.4.1', newVersionAgeInDays: expect.any(Number), - releaseTimestamp: '2015-05-17T04:25:07.299Z', + releaseTimestamp: '2015-05-17T04:25:07.299Z' as Timestamp, updateType: 'major', }, ]); @@ -2194,7 +2195,7 @@ describe('workers/repository/process/lookup/index', () => { newValue: '< 2', newVersion: '1.4.1', newVersionAgeInDays: expect.any(Number), - releaseTimestamp: '2015-05-17T04:25:07.299Z', + releaseTimestamp: '2015-05-17T04:25:07.299Z' as Timestamp, updateType: 'major', }, ]); @@ -2221,7 +2222,7 @@ describe('workers/repository/process/lookup/index', () => { newValue: '<= 1.4', newVersion: '1.4.1', newVersionAgeInDays: expect.any(Number), - releaseTimestamp: '2015-05-17T04:25:07.299Z', + releaseTimestamp: '2015-05-17T04:25:07.299Z' as Timestamp, updateType: 'minor', }, ]); @@ -2248,7 +2249,7 @@ describe('workers/repository/process/lookup/index', () => { newValue: '=1.4.1', newVersion: '1.4.1', newVersionAgeInDays: expect.any(Number), - releaseTimestamp: '2015-05-17T04:25:07.299Z', + releaseTimestamp: '2015-05-17T04:25:07.299Z' as Timestamp, updateType: 'minor', }, ]); @@ -2276,7 +2277,7 @@ describe('workers/repository/process/lookup/index', () => { newValue: '<= 2', newVersion: '2.0.3', newVersionAgeInDays: expect.any(Number), - releaseTimestamp: '2015-01-31T08:11:47.852Z', + releaseTimestamp: '2015-01-31T08:11:47.852Z' as Timestamp, updateType: 'major', }, ]); @@ -2475,7 +2476,7 @@ describe('workers/repository/process/lookup/index', () => { newValue: '2.0.3', newVersion: '2.0.3', newVersionAgeInDays: expect.any(Number), - releaseTimestamp: '2015-01-31T08:11:47.852Z', + releaseTimestamp: '2015-01-31T08:11:47.852Z' as Timestamp, updateType: 'major', }, ]); @@ -2571,11 +2572,11 @@ describe('workers/repository/process/lookup/index', () => { { version: '1.4.4' }, { version: '1.4.5', - releaseTimestamp: lastWeek.toISOString(), + releaseTimestamp: lastWeek.toISOString() as Timestamp, }, { version: '1.4.6', - releaseTimestamp: yesterday.toISOString(), + releaseTimestamp: yesterday.toISOString() as Timestamp, }, ], }); @@ -2615,11 +2616,11 @@ describe('workers/repository/process/lookup/index', () => { { version: '1.4.4' }, { version: '1.4.5', - releaseTimestamp: lastWeek.toISOString(), + releaseTimestamp: lastWeek.toISOString() as Timestamp, }, { version: '1.4.6', - releaseTimestamp: yesterday.toISOString(), + releaseTimestamp: yesterday.toISOString() as Timestamp, }, ], }); @@ -2916,7 +2917,7 @@ describe('workers/repository/process/lookup/index', () => { { version: 'v2.0.0', gitRef: 'v2.0.0', - releaseTimestamp: '2022-01-01', + releaseTimestamp: '2022-01-01' as Timestamp, }, ], }); @@ -2951,7 +2952,7 @@ describe('workers/repository/process/lookup/index', () => { { version: 'v2.0.0', gitRef: 'v2.0.0', - releaseTimestamp: '2022-01-01', + releaseTimestamp: '2022-01-01' as Timestamp, }, ], }); @@ -2984,7 +2985,7 @@ describe('workers/repository/process/lookup/index', () => { { version: 'v1.0.0', gitRef: 'v1.0.0', - releaseTimestamp: '2022-01-01', + releaseTimestamp: '2022-01-01' as Timestamp, }, ], }); @@ -3051,7 +3052,7 @@ describe('workers/repository/process/lookup/index', () => { newValue: '^0.0.35', newVersion: '0.0.35', newVersionAgeInDays: expect.any(Number), - releaseTimestamp: '2017-04-27T16:59:06.479Z', + releaseTimestamp: '2017-04-27T16:59:06.479Z' as Timestamp, updateType: 'patch', }, ]); @@ -3227,7 +3228,7 @@ describe('workers/repository/process/lookup/index', () => { newValue: '^1.4.1', newVersion: '1.4.1', newVersionAgeInDays: expect.any(Number), - releaseTimestamp: '2015-05-17T04:25:07.299Z', + releaseTimestamp: '2015-05-17T04:25:07.299Z' as Timestamp, updateType: 'minor', }, ]); @@ -3256,7 +3257,7 @@ describe('workers/repository/process/lookup/index', () => { newValue: '~1.0.1', newVersion: '1.0.1', newVersionAgeInDays: expect.any(Number), - releaseTimestamp: '2014-03-11T18:47:17.560Z', + releaseTimestamp: '2014-03-11T18:47:17.560Z' as Timestamp, updateType: 'patch', }, { @@ -3268,7 +3269,7 @@ describe('workers/repository/process/lookup/index', () => { newValue: '~1.4.1', newVersion: '1.4.1', newVersionAgeInDays: expect.any(Number), - releaseTimestamp: '2015-05-17T04:25:07.299Z', + releaseTimestamp: '2015-05-17T04:25:07.299Z' as Timestamp, updateType: 'minor', }, ]); @@ -3297,7 +3298,7 @@ describe('workers/repository/process/lookup/index', () => { newValue: '~1.0.1', newVersion: '1.0.1', newVersionAgeInDays: expect.any(Number), - releaseTimestamp: '2014-03-11T18:47:17.560Z', + releaseTimestamp: '2014-03-11T18:47:17.560Z' as Timestamp, updateType: 'patch', }, { @@ -3309,7 +3310,7 @@ describe('workers/repository/process/lookup/index', () => { newValue: '~1.4.1', newVersion: '1.4.1', newVersionAgeInDays: expect.any(Number), - releaseTimestamp: '2015-05-17T04:25:07.299Z', + releaseTimestamp: '2015-05-17T04:25:07.299Z' as Timestamp, updateType: 'minor', }, ]); @@ -3337,7 +3338,7 @@ describe('workers/repository/process/lookup/index', () => { newValue: '>=1.4.1', newVersion: '1.4.1', newVersionAgeInDays: expect.any(Number), - releaseTimestamp: '2015-05-17T04:25:07.299Z', + releaseTimestamp: '2015-05-17T04:25:07.299Z' as Timestamp, updateType: 'minor', }, ]); @@ -3366,7 +3367,7 @@ describe('workers/repository/process/lookup/index', () => { newValue: '>=1.4.1', newVersion: '1.4.1', newVersionAgeInDays: expect.any(Number), - releaseTimestamp: '2015-05-17T04:25:07.299Z', + releaseTimestamp: '2015-05-17T04:25:07.299Z' as Timestamp, updateType: 'major', }, ]); @@ -3435,7 +3436,7 @@ describe('workers/repository/process/lookup/index', () => { newValue: '1.4.1', newVersion: '1.4.1', newVersionAgeInDays: expect.any(Number), - releaseTimestamp: '2015-05-17T04:25:07.299Z', + releaseTimestamp: '2015-05-17T04:25:07.299Z' as Timestamp, updateType: 'minor', }, ]); @@ -3537,7 +3538,7 @@ describe('workers/repository/process/lookup/index', () => { newValue: '~=1.4', newVersion: '1.4.1', newVersionAgeInDays: expect.any(Number), - releaseTimestamp: '2015-05-17T04:25:07.299Z', + releaseTimestamp: '2015-05-17T04:25:07.299Z' as Timestamp, updateType: 'major', }, ]); @@ -3555,7 +3556,7 @@ describe('workers/repository/process/lookup/index', () => { expect(res).toMatchObject({ currentVersion: '1.3.0', - currentVersionTimestamp: '2015-04-26T16:42:11.311Z', + currentVersionTimestamp: '2015-04-26T16:42:11.311Z' as Timestamp, fixedVersion: '1.3.0', isSingleVersion: true, registryUrl: 'https://registry.npmjs.org', @@ -3598,7 +3599,7 @@ describe('workers/repository/process/lookup/index', () => { ).unwrapOrThrow(); expect(res).toMatchObject({ currentVersion: '1.3.0', - currentVersionTimestamp: '2015-04-26T16:42:11.311Z', + currentVersionTimestamp: '2015-04-26T16:42:11.311Z' as Timestamp, fixedVersion: '1.3.0', isSingleVersion: true, registryUrl: 'https://registry.npmjs.org', @@ -3655,7 +3656,7 @@ describe('workers/repository/process/lookup/index', () => { expect(res).toMatchObject({ currentVersion: '1.3.0', - currentVersionTimestamp: '2015-04-26T16:42:11.311Z', + currentVersionTimestamp: '2015-04-26T16:42:11.311Z' as Timestamp, deprecationMessage: codeBlock` On registry \`https://registry.npmjs.org\`, the "latest" version of dependency \`q3\` has the following deprecation notice: @@ -4424,7 +4425,7 @@ describe('workers/repository/process/lookup/index', () => { // a day old release releaseTimestamp: new Date( Date.now() - 25 * 60 * 60 * 1000, - ).toISOString(), + ).toISOString() as Timestamp, }, { version: '18.0.0', @@ -4466,7 +4467,7 @@ describe('workers/repository/process/lookup/index', () => { ]; const releaseTimestamp = new Date( Date.now() - 25 * 60 * 60 * 1000, - ).toISOString(); + ).toISOString() as Timestamp; getDockerReleases.mockResolvedValueOnce({ releases: [ { @@ -4683,10 +4684,8 @@ describe('workers/repository/process/lookup/index', () => { config.packageName = 'openjdk'; config.currentDigest = 'sha256:fedcba0987654321'; config.currentValue = '17.0.0'; - //config.pinDigests = true; config.datasource = DockerDatasource.id; config.versioning = dockerVersioningId; - // This config is normally set when packageRules are applied config.replacementName = 'eclipse-temurin'; config.replacementVersion = '19.0.0'; getDockerReleases.mockResolvedValueOnce({ @@ -4785,7 +4784,6 @@ describe('workers/repository/process/lookup/index', () => { it('handles replacements - name and version', async () => { config.currentValue = '1.4.1'; config.packageName = 'q'; - // This config is normally set when packageRules are applied config.replacementName = 'r'; config.replacementVersion = '2.0.0'; config.datasource = NpmDatasource.id; @@ -5056,7 +5054,7 @@ describe('workers/repository/process/lookup/index', () => { newValue: '3.8.1', newVersion: '3.8.1', newVersionAgeInDays: expect.any(Number), - releaseTimestamp: '2017-10-17T15:22:36.646Z', + releaseTimestamp: '2017-10-17T15:22:36.646Z' as Timestamp, updateType: 'minor', }, ]); @@ -5085,7 +5083,7 @@ describe('workers/repository/process/lookup/index', () => { newValue: '3.8.1', newVersion: '3.8.1', newVersionAgeInDays: expect.any(Number), - releaseTimestamp: '2017-10-17T15:22:36.646Z', + releaseTimestamp: '2017-10-17T15:22:36.646Z' as Timestamp, updateType: 'minor', }, ]); @@ -5145,7 +5143,7 @@ describe('workers/repository/process/lookup/index', () => { newValue: 'v0.0.0-20240509183442-62759503f434', newVersion: 'v0.0.0-20240509183442-62759503f434', newVersionAgeInDays: expect.any(Number), - releaseTimestamp: '2024-05-09T18:34:42.000Z', + releaseTimestamp: '2024-05-09T18:34:42.000Z' as Timestamp, updateType: 'digest', }, ]); diff --git a/lib/workers/repository/update/branch/index.spec.ts b/lib/workers/repository/update/branch/index.spec.ts index ba8aba7d85a76f..174679d01823e9 100644 --- a/lib/workers/repository/update/branch/index.spec.ts +++ b/lib/workers/repository/update/branch/index.spec.ts @@ -36,6 +36,7 @@ import type { } from '../../../../util/git/types'; import * as _mergeConfidence from '../../../../util/merge-confidence'; import * as _sanitize from '../../../../util/sanitize'; +import type { Timestamp } from '../../../../util/timestamp'; import * as _limits from '../../../global/limits'; import type { BranchConfig, BranchUpgradeConfig } from '../../../types'; import type { ResultWithPr } from '../pr'; @@ -183,11 +184,13 @@ describe('workers/repository/update/branch/index', () => { config.prCreation = 'not-pending'; (config.upgrades as Partial[]) = [ { - releaseTimestamp: new Date('2019-01-01').getTime().toString(), + releaseTimestamp: new Date('2019-01-01') + .getTime() + .toString() as Timestamp, minimumReleaseAge: '1 day', }, { - releaseTimestamp: new Date().toString(), + releaseTimestamp: new Date().toString() as Timestamp, minimumReleaseAge: '1 day', }, ]; @@ -206,7 +209,7 @@ describe('workers/repository/update/branch/index', () => { config.prCreation = 'not-pending'; config.upgrades = partial([ { - releaseTimestamp: '2099-12-31', + releaseTimestamp: '2099-12-31' as Timestamp, minimumReleaseAge: '1 day', }, ]); @@ -1092,7 +1095,7 @@ describe('workers/repository/update/branch/index', () => { pr: partial(), }); prAutomerge.checkAutoMerge.mockResolvedValueOnce({ automerged: true }); - config.releaseTimestamp = '2018-04-26T05:15:51.877Z'; + config.releaseTimestamp = '2018-04-26T05:15:51.877Z' as Timestamp; commit.commitFilesToBranch.mockResolvedValueOnce(null); await branchWorker.processBranch(config); expect(platform.ensureComment).toHaveBeenCalledTimes(1); @@ -1117,7 +1120,7 @@ describe('workers/repository/update/branch/index', () => { pr: partial(), }); prAutomerge.checkAutoMerge.mockResolvedValueOnce({ automerged: true }); - config.releaseTimestamp = new Date().toISOString(); + config.releaseTimestamp = new Date().toISOString() as Timestamp; commit.commitFilesToBranch.mockResolvedValueOnce(null); await branchWorker.processBranch(config); expect(platform.ensureComment).toHaveBeenCalledTimes(1); @@ -1142,7 +1145,7 @@ describe('workers/repository/update/branch/index', () => { pr: partial(), }); prAutomerge.checkAutoMerge.mockResolvedValueOnce({ automerged: true }); - config.releaseTimestamp = new Date().toISOString(); + config.releaseTimestamp = new Date().toISOString() as Timestamp; await expect(branchWorker.processBranch(config)).rejects.toThrow( Error(MANAGER_LOCKFILE_ERROR), ); diff --git a/lib/workers/repository/update/pr/changelog/gitea/index.spec.ts b/lib/workers/repository/update/pr/changelog/gitea/index.spec.ts index 8bf9593052931d..b00012eccfe0e1 100644 --- a/lib/workers/repository/update/pr/changelog/gitea/index.spec.ts +++ b/lib/workers/repository/update/pr/changelog/gitea/index.spec.ts @@ -4,6 +4,7 @@ import { partial } from '../../../../../../../test/util'; import * as semverVersioning from '../../../../../../modules/versioning/semver'; import * as hostRules from '../../../../../../util/host-rules'; import { toBase64 } from '../../../../../../util/string'; +import type { Timestamp } from '../../../../../../util/timestamp'; import type { BranchUpgradeConfig } from '../../../../../types'; import { GiteaChangeLogSource } from '../gitea/source'; import { getReleaseNotesMd } from '.'; @@ -22,10 +23,13 @@ const upgrade = partial({ { version: '5.2.0' }, { version: '5.4.0', - releaseTimestamp: '2018-08-24T14:23:00.000Z', + releaseTimestamp: '2018-08-24T14:23:00.000Z' as Timestamp, }, { version: '5.5.0', gitRef: 'eba303e91c930292198b2fc57040145682162a1b' }, - { version: '5.6.0', releaseTimestamp: '2020-02-13T15:37:00.000Z' }, + { + version: '5.6.0', + releaseTimestamp: '2020-02-13T15:37:00.000Z' as Timestamp, + }, { version: '5.6.1' }, ], }); diff --git a/lib/workers/repository/update/pr/changelog/github/index.spec.ts b/lib/workers/repository/update/pr/changelog/github/index.spec.ts index 4e85b2a379b4af..7c655970126106 100644 --- a/lib/workers/repository/update/pr/changelog/github/index.spec.ts +++ b/lib/workers/repository/update/pr/changelog/github/index.spec.ts @@ -5,6 +5,7 @@ import { GlobalConfig } from '../../../../../../config/global'; import * as semverVersioning from '../../../../../../modules/versioning/semver'; import * as githubGraphql from '../../../../../../util/github/graphql'; import type { GithubTagItem } from '../../../../../../util/github/graphql/types'; +import type { Timestamp } from '../../../../../../util/timestamp'; import * as hostRules from '../../../../../../util/host-rules'; import type { BranchUpgradeConfig } from '../../../../../types'; @@ -25,10 +26,13 @@ const upgrade = partial({ { version: '2.3.0', gitRef: 'npm_2.3.0', - releaseTimestamp: '2017-10-24T03:20:46.238Z', + releaseTimestamp: '2017-10-24T03:20:46.238Z' as Timestamp, }, { version: '2.2.2', gitRef: 'npm_2.2.2' }, - { version: '2.4.2', releaseTimestamp: '2017-12-24T03:20:46.238Z' }, + { + version: '2.4.2', + releaseTimestamp: '2017-12-24T03:20:46.238Z' as Timestamp, + }, { version: '2.5.2' }, ], }); diff --git a/lib/workers/repository/update/pr/changelog/gitlab/index.spec.ts b/lib/workers/repository/update/pr/changelog/gitlab/index.spec.ts index f55e0e197cfc39..3efbcf04f615b5 100644 --- a/lib/workers/repository/update/pr/changelog/gitlab/index.spec.ts +++ b/lib/workers/repository/update/pr/changelog/gitlab/index.spec.ts @@ -5,6 +5,7 @@ import * as semverVersioning from '../../../../../../modules/versioning/semver'; import * as hostRules from '../../../../../../util/host-rules'; import type { BranchUpgradeConfig } from '../../../../../types'; import { GitLabChangeLogSource } from './source'; +import type { Timestamp } from '../../../../../../util/timestamp'; const upgrade = partial({ manager: 'some-manager', @@ -20,10 +21,13 @@ const upgrade = partial({ { version: '5.2.0' }, { version: '5.4.0', - releaseTimestamp: '2018-08-24T14:23:00.000Z', + releaseTimestamp: '2018-08-24T14:23:00.000Z' as Timestamp, }, { version: '5.5.0', gitRef: 'eba303e91c930292198b2fc57040145682162a1b' }, - { version: '5.6.0', releaseTimestamp: '2020-02-13T15:37:00.000Z' }, + { + version: '5.6.0', + releaseTimestamp: '2020-02-13T15:37:00.000Z' as Timestamp, + }, { version: '5.6.1' }, ], }); diff --git a/lib/workers/repository/update/pr/changelog/index.spec.ts b/lib/workers/repository/update/pr/changelog/index.spec.ts index 5dcfa186fcc60c..f74d1cbc1a9f0a 100644 --- a/lib/workers/repository/update/pr/changelog/index.spec.ts +++ b/lib/workers/repository/update/pr/changelog/index.spec.ts @@ -4,6 +4,7 @@ import { GlobalConfig } from '../../../../../config/global'; import * as semverVersioning from '../../../../../modules/versioning/semver'; import * as githubGraphql from '../../../../../util/github/graphql'; import * as hostRules from '../../../../../util/host-rules'; +import type { Timestamp } from '../../../../../util/timestamp'; import type { BranchConfig } from '../../../../types'; import * as releases from './releases'; import { getChangeLogJSON } from '.'; @@ -29,10 +30,13 @@ const upgrade = partial({ { version: '2.3.0', gitRef: 'npm_2.3.0', - releaseTimestamp: '2017-10-24T03:20:46.238Z', + releaseTimestamp: '2017-10-24T03:20:46.238Z' as Timestamp, }, { version: '2.2.2', gitRef: 'npm_2.2.2' }, - { version: '2.4.2', releaseTimestamp: '2017-12-24T03:20:46.238Z' }, + { + version: '2.4.2', + releaseTimestamp: '2017-12-24T03:20:46.238Z' as Timestamp, + }, { version: '2.5.2' }, ], }); diff --git a/lib/workers/repository/update/pr/changelog/release-notes.spec.ts b/lib/workers/repository/update/pr/changelog/release-notes.spec.ts index 7bb3bd2ebb0c77..42534bb5bc1e08 100644 --- a/lib/workers/repository/update/pr/changelog/release-notes.spec.ts +++ b/lib/workers/repository/update/pr/changelog/release-notes.spec.ts @@ -8,6 +8,7 @@ import * as githubGraphql from '../../../../../util/github/graphql'; import type { GithubReleaseItem } from '../../../../../util/github/graphql/types'; import * as _hostRules from '../../../../../util/host-rules'; import { toBase64 } from '../../../../../util/string'; +import type { Timestamp } from '../../../../../util/timestamp'; import type { BranchUpgradeConfig } from '../../../../types'; import { addReleaseNotes, @@ -251,7 +252,7 @@ describe('workers/repository/update/pr/changelog/release-notes', () => { githubReleasesMock.mockResolvedValueOnce([ { version: `v1.0.0`, - releaseTimestamp: '2020-01-01', + releaseTimestamp: '2020-01-01' as Timestamp, id: 1, url: 'https://example.com', name: 'some/dep', @@ -259,7 +260,7 @@ describe('workers/repository/update/pr/changelog/release-notes', () => { }, { version: `v1.0.1`, - releaseTimestamp: '2020-01-01', + releaseTimestamp: '2020-01-01' as Timestamp, id: 1, url: 'https://example.com', name: 'some/dep', @@ -370,7 +371,7 @@ describe('workers/repository/update/pr/changelog/release-notes', () => { githubReleasesMock.mockResolvedValueOnce([ { version: '1.0.0', - releaseTimestamp: '2020-01-01', + releaseTimestamp: '2020-01-01' as Timestamp, id: 1, url: 'https://github.com/some/other-repository/releases/1.0.0', name: '', @@ -378,7 +379,7 @@ describe('workers/repository/update/pr/changelog/release-notes', () => { }, { version: '1.0.1', - releaseTimestamp: '2020-01-01', + releaseTimestamp: '2020-01-01' as Timestamp, id: 2, url: 'https://github.com/some/other-repository/releases/1.0.1', name: '', @@ -404,7 +405,7 @@ describe('workers/repository/update/pr/changelog/release-notes', () => { githubReleasesMock.mockResolvedValueOnce([ { version: '1.0.0', - releaseTimestamp: '2020-01-01', + releaseTimestamp: '2020-01-01' as Timestamp, id: 1, url: 'https://github.com/some/other-repository/releases/1.0.0', name: 'some/dep', @@ -412,7 +413,7 @@ describe('workers/repository/update/pr/changelog/release-notes', () => { }, { version: '1.0.1', - releaseTimestamp: '2020-01-01', + releaseTimestamp: '2020-01-01' as Timestamp, id: 2, url: 'https://github.com/some/other-repository/releases/1.0.1', name: 'some/dep', @@ -447,7 +448,7 @@ describe('workers/repository/update/pr/changelog/release-notes', () => { githubReleasesMock.mockResolvedValueOnce([ { version: '1.0.0', - releaseTimestamp: '2020-01-01', + releaseTimestamp: '2020-01-01' as Timestamp, id: 1, url: 'https://github.com/some/other-repository/releases/1.0.0', name: 'some/dep', @@ -455,7 +456,7 @@ describe('workers/repository/update/pr/changelog/release-notes', () => { }, { version: '1.0.1', - releaseTimestamp: '2020-01-01', + releaseTimestamp: '2020-01-01' as Timestamp, id: 2, url: 'https://github.com/some/other-repository/releases/1.0.1', name: 'some release name', @@ -489,7 +490,7 @@ describe('workers/repository/update/pr/changelog/release-notes', () => { githubReleasesMock.mockResolvedValueOnce([ { version: '1.0.0', - releaseTimestamp: '2020-01-01', + releaseTimestamp: '2020-01-01' as Timestamp, id: 1, url: 'https://github.com/some/other-repository/releases/1.0.0', name: 'Release v1.0.0', @@ -497,7 +498,7 @@ describe('workers/repository/update/pr/changelog/release-notes', () => { }, { version: '1.0.1', - releaseTimestamp: '2020-01-01', + releaseTimestamp: '2020-01-01' as Timestamp, id: 2, url: 'https://github.com/some/other-repository/releases/1.0.1', name: '1.0.1', @@ -531,7 +532,7 @@ describe('workers/repository/update/pr/changelog/release-notes', () => { githubReleasesMock.mockResolvedValueOnce([ { version: '1.0.0', - releaseTimestamp: '2020-01-01', + releaseTimestamp: '2020-01-01' as Timestamp, id: 1, url: 'https://github.com/some/other-repository/releases/1.0.1', name: 'some/dep', @@ -539,7 +540,7 @@ describe('workers/repository/update/pr/changelog/release-notes', () => { }, { version: '1.0.1', - releaseTimestamp: '2020-01-01', + releaseTimestamp: '2020-01-01' as Timestamp, id: 2, url: 'https://github.com/some/other-repository/releases/1.0.1', name: 'v1.0.1 some release', @@ -573,7 +574,7 @@ describe('workers/repository/update/pr/changelog/release-notes', () => { githubReleasesMock.mockResolvedValueOnce([ { version: '1.0.0', - releaseTimestamp: '2020-01-01', + releaseTimestamp: '2020-01-01' as Timestamp, id: 1, url: 'correct/url/tag.com', name: 'some/dep', @@ -581,7 +582,7 @@ describe('workers/repository/update/pr/changelog/release-notes', () => { }, { version: '1.0.1', - releaseTimestamp: '2020-01-01', + releaseTimestamp: '2020-01-01' as Timestamp, id: 2, url: 'correct/url/tag.com', name: '1.0.1', @@ -607,7 +608,7 @@ describe('workers/repository/update/pr/changelog/release-notes', () => { githubReleasesMock.mockResolvedValueOnce([ { version: 'v1.0.0', - releaseTimestamp: '2020-01-01', + releaseTimestamp: '2020-01-01' as Timestamp, id: 1, url: 'https://github.com/some/other-repository/releases/v1.0.0', name: 'some/dep', @@ -615,7 +616,7 @@ describe('workers/repository/update/pr/changelog/release-notes', () => { }, { version: 'v1.0.1', - releaseTimestamp: '2020-01-01', + releaseTimestamp: '2020-01-01' as Timestamp, id: 2, url: 'https://github.com/some/other-repository/releases/v1.0.1', name: 'some/dep', @@ -650,7 +651,7 @@ describe('workers/repository/update/pr/changelog/release-notes', () => { githubReleasesMock.mockResolvedValueOnce([ { version: 'other-1.0.0', - releaseTimestamp: '2020-01-01', + releaseTimestamp: '2020-01-01' as Timestamp, id: 1, url: 'https://github.com/some/other-repository/releases/other-1.0.0', name: 'some/dep', @@ -658,7 +659,7 @@ describe('workers/repository/update/pr/changelog/release-notes', () => { }, { version: 'other-1.0.1', - releaseTimestamp: '2020-01-01', + releaseTimestamp: '2020-01-01' as Timestamp, id: 2, url: 'https://github.com/some/other-repository/releases/other-1.0.1', name: 'some/dep', @@ -694,7 +695,7 @@ describe('workers/repository/update/pr/changelog/release-notes', () => { githubReleasesMock.mockResolvedValueOnce([ { version: 'other-1.0.0', - releaseTimestamp: '2020-01-01', + releaseTimestamp: '2020-01-01' as Timestamp, id: 1, url: 'https://github.com/some/other-repository/releases/other-1.0.0', name: 'some/dep', @@ -702,7 +703,7 @@ describe('workers/repository/update/pr/changelog/release-notes', () => { }, { version: 'other-1.0.1', - releaseTimestamp: '2020-01-01', + releaseTimestamp: '2020-01-01' as Timestamp, id: 2, url: 'https://github.com/some/other-repository/releases/other-1.0.1', name: 'some/dep', @@ -739,7 +740,7 @@ describe('workers/repository/update/pr/changelog/release-notes', () => { githubReleasesMock.mockResolvedValueOnce([ { version: 'other_v1.0.0', - releaseTimestamp: '2020-01-01', + releaseTimestamp: '2020-01-01' as Timestamp, id: 1, url: 'https://github.com/some/other-repository/releases/other_v1.0.0', name: 'some/dep', @@ -747,7 +748,7 @@ describe('workers/repository/update/pr/changelog/release-notes', () => { }, { version: 'other_v1.0.1', - releaseTimestamp: '2020-01-01', + releaseTimestamp: '2020-01-01' as Timestamp, id: 2, url: 'https://github.com/some/other-repository/releases/other_v1.0.1', name: 'some/dep', @@ -784,7 +785,7 @@ describe('workers/repository/update/pr/changelog/release-notes', () => { { version: 'other@1.0.0', id: 1, - releaseTimestamp: '2020-01-01', + releaseTimestamp: '2020-01-01' as Timestamp, url: 'https://github.com/some/other-repository/releases/other@1.0.0', name: 'some/dep', description: 'some body', @@ -794,7 +795,7 @@ describe('workers/repository/update/pr/changelog/release-notes', () => { description: 'some body #123, [#124](https://github.com/some/yet-other-repository/issues/124)', id: 2, - releaseTimestamp: '2020-01-01', + releaseTimestamp: '2020-01-01' as Timestamp, url: 'https://github.com/some/other-repository/releases/other@1.0.1', name: 'some/dep', }, @@ -956,7 +957,7 @@ describe('workers/repository/update/pr/changelog/release-notes', () => { { id: 1, version: `${packageName}@1.0.0`, - releaseTimestamp: '2020-01-01', + releaseTimestamp: '2020-01-01' as Timestamp, url: 'correct/url/tag.com', name: 'some/dep', description: 'some body', @@ -964,7 +965,7 @@ describe('workers/repository/update/pr/changelog/release-notes', () => { { id: 2, version: `someOtherRelease1/exampleDep_1.0.0`, - releaseTimestamp: '2020-01-01', + releaseTimestamp: '2020-01-01' as Timestamp, url: 'correct/url/tag.com', name: 'some/dep', description: 'some body', @@ -972,7 +973,7 @@ describe('workers/repository/update/pr/changelog/release-notes', () => { { id: 3, version: `someOtherRelease2/exampleDep-1.0.0`, - releaseTimestamp: '2020-01-01', + releaseTimestamp: '2020-01-01' as Timestamp, url: 'correct/url/tag.com', name: 'some/dep', description: 'some body', @@ -1006,7 +1007,7 @@ describe('workers/repository/update/pr/changelog/release-notes', () => { { id: 123, version: `app-1.0.0`, - releaseTimestamp: '2020-01-01', + releaseTimestamp: '2020-01-01' as Timestamp, url: 'correct/url/tag.com', description: 'some body', name: 'some/dep', diff --git a/lib/workers/repository/updates/generate.spec.ts b/lib/workers/repository/updates/generate.spec.ts index 6769da86bb6803..edb8ff72ea52d9 100644 --- a/lib/workers/repository/updates/generate.spec.ts +++ b/lib/workers/repository/updates/generate.spec.ts @@ -4,6 +4,7 @@ import type { UpdateType } from '../../../config/types'; import { NpmDatasource } from '../../../modules/datasource/npm'; import type { BranchUpgradeConfig } from '../../types'; import { generateBranchConfig } from './generate'; +import type { Timestamp } from '../../../util/timestamp'; const { commitMessage, @@ -34,7 +35,7 @@ describe('workers/repository/updates/generate', () => { depName: 'some-dep', groupName: 'some-group', prTitle: 'some-title', - releaseTimestamp: '2017-02-07T20:01:41+00:00', + releaseTimestamp: '2017-02-07T20:01:41+00:00' as Timestamp, foo: 1, group: { foo: 2, @@ -161,7 +162,7 @@ describe('workers/repository/updates/generate', () => { group: { foo: 2, }, - releaseTimestamp: '2017-02-07T20:01:41+00:00', + releaseTimestamp: '2017-02-07T20:01:41+00:00' as Timestamp, automerge: true, constraints: { foo: '1.0.0', @@ -181,7 +182,7 @@ describe('workers/repository/updates/generate', () => { group: { foo: 2, }, - releaseTimestamp: '2017-02-06T20:01:41+00:00', + releaseTimestamp: '2017-02-06T20:01:41+00:00' as Timestamp, automerge: false, constraints: { foo: '1.0.0', @@ -202,7 +203,7 @@ describe('workers/repository/updates/generate', () => { group: { foo: 2, }, - releaseTimestamp: '2017-02-06T20:01:41+00:00', + releaseTimestamp: '2017-02-06T20:01:41+00:00' as Timestamp, automerge: false, }, ]; @@ -400,7 +401,7 @@ describe('workers/repository/updates/generate', () => { group: { foo: 2, }, - releaseTimestamp: '2017-02-07T20:01:41+00:00', + releaseTimestamp: '2017-02-07T20:01:41+00:00' as Timestamp, updateType: 'minor', separateMinorPatch: true, prTitleStrict: true, @@ -420,7 +421,7 @@ describe('workers/repository/updates/generate', () => { group: { foo: 2, }, - releaseTimestamp: '2017-02-08T20:01:41+00:00', + releaseTimestamp: '2017-02-08T20:01:41+00:00' as Timestamp, updateType: 'minor', separateMinorPatch: true, prTitleStrict: true, @@ -455,7 +456,7 @@ describe('workers/repository/updates/generate', () => { group: { foo: 2, }, - releaseTimestamp: '2017-02-07T20:01:41+00:00', + releaseTimestamp: '2017-02-07T20:01:41+00:00' as Timestamp, updateType: 'minor', separateMinorPatch: true, }, @@ -474,7 +475,7 @@ describe('workers/repository/updates/generate', () => { group: { foo: 2, }, - releaseTimestamp: '2017-02-08T20:01:41+00:00', + releaseTimestamp: '2017-02-08T20:01:41+00:00' as Timestamp, updateType: 'minor', separateMinorPatch: true, }, @@ -507,7 +508,7 @@ describe('workers/repository/updates/generate', () => { group: { foo: 2, }, - releaseTimestamp: '2017-02-07T20:01:41+00:00', + releaseTimestamp: '2017-02-07T20:01:41+00:00' as Timestamp, }, { manager: 'some-manager', @@ -523,7 +524,7 @@ describe('workers/repository/updates/generate', () => { group: { foo: 2, }, - releaseTimestamp: '2017-02-08T20:01:41+00:00', + releaseTimestamp: '2017-02-08T20:01:41+00:00' as Timestamp, }, ] satisfies BranchUpgradeConfig[]; const res = generateBranchConfig(branch); @@ -550,7 +551,7 @@ describe('workers/repository/updates/generate', () => { group: { foo: 2, }, - releaseTimestamp: '2017-02-07T20:01:41+00:00', + releaseTimestamp: '2017-02-07T20:01:41+00:00' as Timestamp, }, { manager: 'some-manager', @@ -566,7 +567,7 @@ describe('workers/repository/updates/generate', () => { group: { foo: 2, }, - releaseTimestamp: '2017-02-08T20:01:41+00:00', + releaseTimestamp: '2017-02-08T20:01:41+00:00' as Timestamp, }, ] satisfies BranchUpgradeConfig[]; const res = generateBranchConfig(branch); @@ -651,7 +652,7 @@ describe('workers/repository/updates/generate', () => { group: { foo: 2, }, - releaseTimestamp: '2017-02-07T20:01:41+00:00', + releaseTimestamp: '2017-02-07T20:01:41+00:00' as Timestamp, }, { manager: 'some-manager', @@ -667,7 +668,7 @@ describe('workers/repository/updates/generate', () => { group: { foo: 2, }, - releaseTimestamp: '2017-02-08T20:01:41+00:00', + releaseTimestamp: '2017-02-08T20:01:41+00:00' as Timestamp, }, ] satisfies BranchUpgradeConfig[]; const res = generateBranchConfig(branch); diff --git a/lib/workers/repository/updates/generate.ts b/lib/workers/repository/updates/generate.ts index f2637f2fb95a66..c2db51f46b5656 100644 --- a/lib/workers/repository/updates/generate.ts +++ b/lib/workers/repository/updates/generate.ts @@ -9,6 +9,7 @@ import { newlineRegex, regEx } from '../../../util/regex'; import { sanitize } from '../../../util/sanitize'; import { safeStringify } from '../../../util/stringify'; import * as template from '../../../util/template'; +import type { Timestamp } from '../../../util/timestamp'; import { uniq } from '../../../util/uniq'; import type { BranchConfig, BranchUpgradeConfig } from '../../types'; import { CommitMessage } from '../model/commit-message'; @@ -245,7 +246,7 @@ export function generateBranchConfig( logger.trace(`groupEligible: ${groupEligible}`); const useGroupSettings = hasGroupName && groupEligible; logger.trace(`useGroupSettings: ${useGroupSettings}`); - let releaseTimestamp: string; + let releaseTimestamp: Timestamp; if (depTypes.size) { config.depTypes = Array.from(depTypes).sort(); diff --git a/lib/workers/types.ts b/lib/workers/types.ts index e4c6477b45f662..3b5727320bbe08 100644 --- a/lib/workers/types.ts +++ b/lib/workers/types.ts @@ -19,6 +19,7 @@ import type { import type { PlatformPrOptions } from '../modules/platform/types'; import type { FileChange } from '../util/git/types'; import type { MergeConfidence } from '../util/merge-confidence/types'; +import type { Timestamp } from '../util/timestamp'; import type { ChangeLogRelease, ChangeLogResult, @@ -65,7 +66,7 @@ export interface BranchUpgradeConfig prettyNewMajor?: string; prettyNewVersion?: string; releases?: ReleaseWithNotes[]; - releaseTimestamp?: string; + releaseTimestamp?: Timestamp; repoName?: string; minimumConfidence?: MergeConfidence | undefined; sourceDirectory?: string; @@ -122,7 +123,7 @@ export interface BranchConfig errors?: ValidationMessage[]; hasTypes?: boolean; dependencyDashboardChecks?: Record; - releaseTimestamp?: string; + releaseTimestamp?: Timestamp; forceCommit?: boolean; rebaseRequested?: boolean; result?: BranchResult; From 732e3ea11b77443b1ad6ce60e2c73df13416dcfe Mon Sep 17 00:00:00 2001 From: Sergei Zharinov Date: Thu, 16 Jan 2025 12:52:25 -0300 Subject: [PATCH 3/8] Fix --- .../github/graphql/query-adapters/releases-query-adapter.ts | 2 +- lib/util/github/graphql/query-adapters/tags-query-adapter.ts | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/util/github/graphql/query-adapters/releases-query-adapter.ts b/lib/util/github/graphql/query-adapters/releases-query-adapter.ts index 504a6cd8c2275b..6d4af0e361d027 100644 --- a/lib/util/github/graphql/query-adapters/releases-query-adapter.ts +++ b/lib/util/github/graphql/query-adapters/releases-query-adapter.ts @@ -33,7 +33,7 @@ const query = prepareQuery(` const GithubGraphqlRelease = z.object({ version: z.string(), - releaseTimestamp: TimestampSchema.nullable().catch(null), + releaseTimestamp: TimestampSchema, isDraft: z.boolean(), isPrerelease: z.boolean(), url: z.string(), diff --git a/lib/util/github/graphql/query-adapters/tags-query-adapter.ts b/lib/util/github/graphql/query-adapters/tags-query-adapter.ts index c2736988eae6a5..c40c9d0fbbbfc1 100644 --- a/lib/util/github/graphql/query-adapters/tags-query-adapter.ts +++ b/lib/util/github/graphql/query-adapters/tags-query-adapter.ts @@ -11,7 +11,7 @@ const GithubGraphqlTag = z.object({ z.object({ type: z.literal('Commit'), oid: z.string(), - releaseTimestamp: TimestampSchema.nullable().catch(null), + releaseTimestamp: TimestampSchema, }), z.object({ type: z.literal('Tag'), @@ -19,7 +19,7 @@ const GithubGraphqlTag = z.object({ oid: z.string(), }), tagger: z.object({ - releaseTimestamp: TimestampSchema.nullable().catch(null), + releaseTimestamp: TimestampSchema, }), }), ]), From 7d221c5b64c39f3e416939ed9e1767a229ca35d8 Mon Sep 17 00:00:00 2001 From: Sergei Zharinov Date: Thu, 16 Jan 2025 12:59:27 -0300 Subject: [PATCH 4/8] Fix eslint --- lib/modules/datasource/nuget/v3.ts | 2 +- .../repository/process/lookup/index.spec.ts | 24 +++++++++---------- .../update/pr/changelog/github/index.spec.ts | 2 +- .../update/pr/changelog/gitlab/index.spec.ts | 2 +- .../repository/updates/generate.spec.ts | 2 +- 5 files changed, 16 insertions(+), 16 deletions(-) diff --git a/lib/modules/datasource/nuget/v3.ts b/lib/modules/datasource/nuget/v3.ts index eb3c2b5af4b469..d2ae57d0f7d987 100644 --- a/lib/modules/datasource/nuget/v3.ts +++ b/lib/modules/datasource/nuget/v3.ts @@ -13,6 +13,7 @@ import type { Http } from '../../../util/http'; import { HttpError } from '../../../util/http'; import * as p from '../../../util/promises'; import { regEx } from '../../../util/regex'; +import { asTimestamp } from '../../../util/timestamp'; import { ensureTrailingSlash } from '../../../util/url'; import { api as versioning } from '../../versioning/nuget'; import type { Release, ReleaseResult } from '../types'; @@ -23,7 +24,6 @@ import type { PackageRegistration, ServicesIndexRaw, } from './types'; -import { asTimestamp } from '../../../util/timestamp'; export class NugetV3Api { static readonly cacheNamespace = 'datasource-nuget-v3'; diff --git a/lib/workers/repository/process/lookup/index.spec.ts b/lib/workers/repository/process/lookup/index.spec.ts index 4d53594278f994..71fd276a651e94 100644 --- a/lib/workers/repository/process/lookup/index.spec.ts +++ b/lib/workers/repository/process/lookup/index.spec.ts @@ -17,7 +17,6 @@ import { MavenDatasource } from '../../../../modules/datasource/maven'; import { NpmDatasource } from '../../../../modules/datasource/npm'; import { PackagistDatasource } from '../../../../modules/datasource/packagist'; import { PypiDatasource } from '../../../../modules/datasource/pypi'; -import type { Timestamp } from '../../../../util/timestamp'; import { id as composerVersioningId } from '../../../../modules/versioning/composer'; import { id as debianVersioningId } from '../../../../modules/versioning/debian'; import { id as dockerVersioningId } from '../../../../modules/versioning/docker'; @@ -32,6 +31,7 @@ import * as memCache from '../../../../util/cache/memory'; import { initConfig, resetConfig } from '../../../../util/merge-confidence'; import * as McApi from '../../../../util/merge-confidence'; import { Result } from '../../../../util/result'; +import type { Timestamp } from '../../../../util/timestamp'; import type { LookupUpdateConfig } from './types'; import * as lookup from '.'; @@ -738,7 +738,7 @@ describe('workers/repository/process/lookup/index', () => { newValue: '0.8.12', newVersion: '0.8.12', newVersionAgeInDays: expect.any(Number), - releaseTimestamp: '2013-09-04T17:07:22.948Z' as Timestamp, + releaseTimestamp: expect.any(String), updateType: 'patch', }, { @@ -749,7 +749,7 @@ describe('workers/repository/process/lookup/index', () => { newValue: '0.9.7', newVersion: '0.9.7', newVersionAgeInDays: expect.any(Number), - releaseTimestamp: '2013-09-04T17:07:22.948Z' as Timestamp, + releaseTimestamp: expect.any(String), updateType: 'minor', }, { @@ -760,7 +760,7 @@ describe('workers/repository/process/lookup/index', () => { newValue: '1.4.1', newVersion: '1.4.1', newVersionAgeInDays: expect.any(Number), - releaseTimestamp: '2015-05-17T04:25:07.299Z' as Timestamp, + releaseTimestamp: expect.any(String), updateType: 'major', }, ]); @@ -1280,7 +1280,7 @@ describe('workers/repository/process/lookup/index', () => { newValue: '^1.2.1', newVersion: '1.4.1', newVersionAgeInDays: expect.any(Number), - releaseTimestamp: '2015-05-17T04:25:07.299Z' as Timestamp, + releaseTimestamp: expect.any(String), updateType: 'minor', }, ]); @@ -1309,7 +1309,7 @@ describe('workers/repository/process/lookup/index', () => { newValue: '^1.2.1', newVersion: '1.4.1', newVersionAgeInDays: expect.any(Number), - releaseTimestamp: '2015-05-17T04:25:07.299Z' as Timestamp, + releaseTimestamp: expect.any(String), updateType: 'minor', }, ]); @@ -1338,7 +1338,7 @@ describe('workers/repository/process/lookup/index', () => { newValue: '~1.2.0', newVersion: '1.2.1', newVersionAgeInDays: expect.any(Number), - releaseTimestamp: '2015-05-17T04:25:07.299Z' as Timestamp, + releaseTimestamp: expect.any(String), updateType: 'patch', }, ]); @@ -1366,7 +1366,7 @@ describe('workers/repository/process/lookup/index', () => { newValue: undefined, newVersion: '1.4.1', newVersionAgeInDays: expect.any(Number), - releaseTimestamp: '2015-05-17T04:25:07.299Z' as Timestamp, + releaseTimestamp: expect.any(String), updateType: 'minor', }, ]); @@ -2572,11 +2572,11 @@ describe('workers/repository/process/lookup/index', () => { { version: '1.4.4' }, { version: '1.4.5', - releaseTimestamp: lastWeek.toISOString() as Timestamp, + releaseTimestamp: lastWeek.toISOString(), }, { version: '1.4.6', - releaseTimestamp: yesterday.toISOString() as Timestamp, + releaseTimestamp: yesterday.toISOString(), }, ], }); @@ -2616,11 +2616,11 @@ describe('workers/repository/process/lookup/index', () => { { version: '1.4.4' }, { version: '1.4.5', - releaseTimestamp: lastWeek.toISOString() as Timestamp, + releaseTimestamp: lastWeek.toISOString(), }, { version: '1.4.6', - releaseTimestamp: yesterday.toISOString() as Timestamp, + releaseTimestamp: yesterday.toISOString(), }, ], }); diff --git a/lib/workers/repository/update/pr/changelog/github/index.spec.ts b/lib/workers/repository/update/pr/changelog/github/index.spec.ts index 7c655970126106..b5a3523ca1098e 100644 --- a/lib/workers/repository/update/pr/changelog/github/index.spec.ts +++ b/lib/workers/repository/update/pr/changelog/github/index.spec.ts @@ -5,8 +5,8 @@ import { GlobalConfig } from '../../../../../../config/global'; import * as semverVersioning from '../../../../../../modules/versioning/semver'; import * as githubGraphql from '../../../../../../util/github/graphql'; import type { GithubTagItem } from '../../../../../../util/github/graphql/types'; -import type { Timestamp } from '../../../../../../util/timestamp'; import * as hostRules from '../../../../../../util/host-rules'; +import type { Timestamp } from '../../../../../../util/timestamp'; import type { BranchUpgradeConfig } from '../../../../../types'; jest.mock('../../../../../../modules/datasource/npm'); diff --git a/lib/workers/repository/update/pr/changelog/gitlab/index.spec.ts b/lib/workers/repository/update/pr/changelog/gitlab/index.spec.ts index 3efbcf04f615b5..8986b7dbbb081b 100644 --- a/lib/workers/repository/update/pr/changelog/gitlab/index.spec.ts +++ b/lib/workers/repository/update/pr/changelog/gitlab/index.spec.ts @@ -3,9 +3,9 @@ import * as httpMock from '../../../../../../../test/http-mock'; import { partial } from '../../../../../../../test/util'; import * as semverVersioning from '../../../../../../modules/versioning/semver'; import * as hostRules from '../../../../../../util/host-rules'; +import type { Timestamp } from '../../../../../../util/timestamp'; import type { BranchUpgradeConfig } from '../../../../../types'; import { GitLabChangeLogSource } from './source'; -import type { Timestamp } from '../../../../../../util/timestamp'; const upgrade = partial({ manager: 'some-manager', diff --git a/lib/workers/repository/updates/generate.spec.ts b/lib/workers/repository/updates/generate.spec.ts index edb8ff72ea52d9..ad7bfe4f862801 100644 --- a/lib/workers/repository/updates/generate.spec.ts +++ b/lib/workers/repository/updates/generate.spec.ts @@ -2,9 +2,9 @@ import { codeBlock } from 'common-tags'; import { getConfig } from '../../../config/defaults'; import type { UpdateType } from '../../../config/types'; import { NpmDatasource } from '../../../modules/datasource/npm'; +import type { Timestamp } from '../../../util/timestamp'; import type { BranchUpgradeConfig } from '../../types'; import { generateBranchConfig } from './generate'; -import type { Timestamp } from '../../../util/timestamp'; const { commitMessage, From f9ecff9357c77d14f4efb4c5e468dd9f629cf2ad Mon Sep 17 00:00:00 2001 From: Sergei Zharinov Date: Thu, 16 Jan 2025 13:02:41 -0300 Subject: [PATCH 5/8] Fix null --- lib/workers/repository/process/lookup/index.spec.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/workers/repository/process/lookup/index.spec.ts b/lib/workers/repository/process/lookup/index.spec.ts index 71fd276a651e94..31fe79439242b7 100644 --- a/lib/workers/repository/process/lookup/index.spec.ts +++ b/lib/workers/repository/process/lookup/index.spec.ts @@ -2572,11 +2572,11 @@ describe('workers/repository/process/lookup/index', () => { { version: '1.4.4' }, { version: '1.4.5', - releaseTimestamp: lastWeek.toISOString(), + releaseTimestamp: lastWeek.toISOString() as Timestamp, }, { version: '1.4.6', - releaseTimestamp: yesterday.toISOString(), + releaseTimestamp: yesterday.toISOString() as Timestamp, }, ], }); @@ -2616,11 +2616,11 @@ describe('workers/repository/process/lookup/index', () => { { version: '1.4.4' }, { version: '1.4.5', - releaseTimestamp: lastWeek.toISOString(), + releaseTimestamp: lastWeek.toISOString() as Timestamp, }, { version: '1.4.6', - releaseTimestamp: yesterday.toISOString(), + releaseTimestamp: yesterday.toISOString() as Timestamp, }, ], }); From 1705b3e4590c2239f7b8f2dbd2a35522b326a8fc Mon Sep 17 00:00:00 2001 From: Sergei Zharinov Date: Sun, 19 Jan 2025 19:17:59 -0300 Subject: [PATCH 6/8] refactor: Update TimestampSchema to remove nullable handling across multiple schemas - Removed nullable handling for TimestampSchema in various datasource schemas, ensuring consistent timestamp validation. - Updated related tests to reflect the changes in schema definitions. This change enhances the reliability of timestamp parsing throughout the application. --- lib/modules/datasource/bitrise/schema.ts | 2 +- lib/modules/datasource/cpan/schema.ts | 2 +- lib/modules/datasource/crate/index.ts | 2 +- lib/modules/datasource/crate/schema.ts | 2 +- lib/modules/datasource/custom/schema.ts | 2 +- lib/modules/datasource/deno/schema.ts | 2 +- lib/modules/datasource/devbox/schema.ts | 2 +- lib/modules/datasource/dotnet-version/schema.ts | 2 +- lib/modules/datasource/endoflife-date/schema.ts | 2 +- lib/modules/datasource/galaxy-collection/schema.ts | 2 +- lib/modules/datasource/galaxy/schema.ts | 2 +- lib/modules/datasource/gitea-releases/schema.ts | 2 +- lib/modules/datasource/gitea-tags/schema.ts | 2 +- lib/modules/datasource/helm/schema.ts | 2 +- lib/modules/datasource/hex/schema.ts | 2 +- lib/modules/datasource/packagist/schema.ts | 2 +- lib/modules/datasource/python-version/schema.ts | 2 +- lib/modules/datasource/rubygems/schema.ts | 2 +- lib/util/timestamp.spec.ts | 4 +--- lib/util/timestamp.ts | 13 +------------ 20 files changed, 20 insertions(+), 33 deletions(-) diff --git a/lib/modules/datasource/bitrise/schema.ts b/lib/modules/datasource/bitrise/schema.ts index aee65e5e4f7a64..3185f74567ff1d 100644 --- a/lib/modules/datasource/bitrise/schema.ts +++ b/lib/modules/datasource/bitrise/schema.ts @@ -4,7 +4,7 @@ import { TimestampSchema } from '../../../util/timestamp'; export const BitriseStepFile = Yaml.pipe( z.object({ - published_at: TimestampSchema.nullable().catch(null), + published_at: TimestampSchema, source_code_url: z.string().optional(), }), ); diff --git a/lib/modules/datasource/cpan/schema.ts b/lib/modules/datasource/cpan/schema.ts index 123560e7ce5caf..9418a85159c190 100644 --- a/lib/modules/datasource/cpan/schema.ts +++ b/lib/modules/datasource/cpan/schema.ts @@ -15,7 +15,7 @@ const MetaCpanApiFileSchema = z }), ), distribution: z.string(), - date: TimestampSchema.nullable().catch(null), + date: TimestampSchema, deprecated: z.boolean(), maturity: z.string(), status: z.union([ diff --git a/lib/modules/datasource/crate/index.ts b/lib/modules/datasource/crate/index.ts index 2f1ee9d93d7678..29eb0b84985f23 100644 --- a/lib/modules/datasource/crate/index.ts +++ b/lib/modules/datasource/crate/index.ts @@ -400,7 +400,7 @@ export class CrateDatasource extends Datasource { const url = `https://crates.io/api/v1/crates/${packageName}/${release.version}`; const { body: releaseTimestamp } = await this.http.getJson( url, - ReleaseTimestampSchema.nullable().catch(null), + ReleaseTimestampSchema, ); release.releaseTimestamp = releaseTimestamp; return release; diff --git a/lib/modules/datasource/crate/schema.ts b/lib/modules/datasource/crate/schema.ts index 6b266f12f8a708..4579f4d7ea3c6b 100644 --- a/lib/modules/datasource/crate/schema.ts +++ b/lib/modules/datasource/crate/schema.ts @@ -4,7 +4,7 @@ import { TimestampSchema } from '../../../util/timestamp'; export const ReleaseTimestampSchema = z .object({ version: z.object({ - created_at: TimestampSchema.nullable().catch(null), + created_at: TimestampSchema, }), }) .transform(({ version: { created_at } }) => created_at) diff --git a/lib/modules/datasource/custom/schema.ts b/lib/modules/datasource/custom/schema.ts index 4d52d0519ea7f7..e153f2393871d1 100644 --- a/lib/modules/datasource/custom/schema.ts +++ b/lib/modules/datasource/custom/schema.ts @@ -7,7 +7,7 @@ export const ReleaseResultZodSchema = z.object({ .object({ version: z.string(), isDeprecated: z.boolean().optional(), - releaseTimestamp: TimestampSchema.nullable().catch(null), + releaseTimestamp: TimestampSchema, sourceUrl: z.string().optional(), sourceDirectory: z.string().optional(), changelogUrl: z.string().optional(), diff --git a/lib/modules/datasource/deno/schema.ts b/lib/modules/datasource/deno/schema.ts index 2b63f91acbbe20..d5547c253a19e9 100644 --- a/lib/modules/datasource/deno/schema.ts +++ b/lib/modules/datasource/deno/schema.ts @@ -32,7 +32,7 @@ export const DenoAPIUploadOptions = z.object({ export const DenoAPIModuleVersionResponse = z .object({ upload_options: DenoAPIUploadOptions, - uploaded_at: TimestampSchema.nullable().catch(null), + uploaded_at: TimestampSchema, version: z.string(), }) .transform( diff --git a/lib/modules/datasource/devbox/schema.ts b/lib/modules/datasource/devbox/schema.ts index 78f539598bc95a..15c96becbd950c 100644 --- a/lib/modules/datasource/devbox/schema.ts +++ b/lib/modules/datasource/devbox/schema.ts @@ -3,7 +3,7 @@ import { TimestampSchema } from '../../../util/timestamp'; export const DevboxRelease = z.object({ version: z.string(), - last_updated: TimestampSchema.nullable().catch(null), + last_updated: TimestampSchema, }); export const DevboxResponse = z diff --git a/lib/modules/datasource/dotnet-version/schema.ts b/lib/modules/datasource/dotnet-version/schema.ts index 5e6b707ad94e66..3fb43bcb30ef48 100644 --- a/lib/modules/datasource/dotnet-version/schema.ts +++ b/lib/modules/datasource/dotnet-version/schema.ts @@ -16,7 +16,7 @@ export const ReleasesIndex = z .transform(({ 'releases-index': releasesIndex }) => releasesIndex); const ReleaseBase = z.object({ - 'release-date': TimestampSchema.nullable().catch(null), + 'release-date': TimestampSchema, 'release-notes': z.string(), }); const ReleaseDetails = z.object({ diff --git a/lib/modules/datasource/endoflife-date/schema.ts b/lib/modules/datasource/endoflife-date/schema.ts index 274841e9f55c28..63e112a0f6ce5d 100644 --- a/lib/modules/datasource/endoflife-date/schema.ts +++ b/lib/modules/datasource/endoflife-date/schema.ts @@ -16,7 +16,7 @@ export const EndoflifeDateVersions = z .object({ cycle: z.string(), latest: z.optional(z.string()), - releaseDate: TimestampSchema.nullable().catch(null), + releaseDate: TimestampSchema, eol: z.optional(ExpireableField), discontinued: z.optional(ExpireableField), }) diff --git a/lib/modules/datasource/galaxy-collection/schema.ts b/lib/modules/datasource/galaxy-collection/schema.ts index 2e91c5e7ce018b..af32492a6220ba 100644 --- a/lib/modules/datasource/galaxy-collection/schema.ts +++ b/lib/modules/datasource/galaxy-collection/schema.ts @@ -15,7 +15,7 @@ export const GalaxyV3Versions = z data: z.array( z.object({ version: z.string(), - created_at: TimestampSchema.nullable().catch(null), + created_at: TimestampSchema, }), ), }) diff --git a/lib/modules/datasource/galaxy/schema.ts b/lib/modules/datasource/galaxy/schema.ts index e236a8af01fea8..da449430d8618a 100644 --- a/lib/modules/datasource/galaxy/schema.ts +++ b/lib/modules/datasource/galaxy/schema.ts @@ -10,7 +10,7 @@ export const GalaxyV1 = z.object({ z .object({ name: z.string(), - created: TimestampSchema.nullable().catch(null), + created: TimestampSchema, }) .transform(({ name, created }) => ({ version: name, diff --git a/lib/modules/datasource/gitea-releases/schema.ts b/lib/modules/datasource/gitea-releases/schema.ts index cd1e6223044bc8..13e9ab688b2dd0 100644 --- a/lib/modules/datasource/gitea-releases/schema.ts +++ b/lib/modules/datasource/gitea-releases/schema.ts @@ -6,7 +6,7 @@ export const ReleaseSchema = z.object({ tag_name: z.string(), body: z.string(), prerelease: z.boolean(), - published_at: TimestampSchema.nullable().catch(null), + published_at: TimestampSchema, }); export const ReleasesSchema = z.array(ReleaseSchema); diff --git a/lib/modules/datasource/gitea-tags/schema.ts b/lib/modules/datasource/gitea-tags/schema.ts index 04f6b9d1cb9562..c466ba0e900c28 100644 --- a/lib/modules/datasource/gitea-tags/schema.ts +++ b/lib/modules/datasource/gitea-tags/schema.ts @@ -9,7 +9,7 @@ export const CommitsSchema = z.array(CommitSchema); const TagCommitSchema = z.object({ sha: z.string(), - created: TimestampSchema.nullable().catch(null), + created: TimestampSchema, }); export const TagSchema = z.object({ diff --git a/lib/modules/datasource/helm/schema.ts b/lib/modules/datasource/helm/schema.ts index 84d9283862c444..a7a2637392ab4c 100644 --- a/lib/modules/datasource/helm/schema.ts +++ b/lib/modules/datasource/helm/schema.ts @@ -8,7 +8,7 @@ import type { Release } from '../types'; const HelmReleaseSchema = z.object({ version: z.string(), - created: TimestampSchema.nullable().catch(null), + created: TimestampSchema, digest: z.string().optional().catch(undefined), home: z.string().optional().catch(undefined), sources: z.array(z.string()).catch([]), diff --git a/lib/modules/datasource/hex/schema.ts b/lib/modules/datasource/hex/schema.ts index eeec3ebb122ad8..3fd0db99cbd223 100644 --- a/lib/modules/datasource/hex/schema.ts +++ b/lib/modules/datasource/hex/schema.ts @@ -30,7 +30,7 @@ export const HexRelease = z releases: LooseArray( z.object({ version: z.string(), - inserted_at: TimestampSchema.nullable().catch(null), + inserted_at: TimestampSchema, }), ).refine((releases) => releases.length > 0, 'No releases found'), retirements: z diff --git a/lib/modules/datasource/packagist/schema.ts b/lib/modules/datasource/packagist/schema.ts index aabfc55353dfd7..6c79f85ba99528 100644 --- a/lib/modules/datasource/packagist/schema.ts +++ b/lib/modules/datasource/packagist/schema.ts @@ -45,7 +45,7 @@ export const ComposerRelease = z.object({ version: z.string(), homepage: z.string().nullable().catch(null), source: z.object({ url: z.string() }).nullable().catch(null), - time: TimestampSchema.nullable().catch(null), + time: TimestampSchema, require: z.object({ php: z.string() }).nullable().catch(null), }); export type ComposerRelease = z.infer; diff --git a/lib/modules/datasource/python-version/schema.ts b/lib/modules/datasource/python-version/schema.ts index f170d5ec789a9f..c59e4a4f0e8f80 100644 --- a/lib/modules/datasource/python-version/schema.ts +++ b/lib/modules/datasource/python-version/schema.ts @@ -13,7 +13,7 @@ export const PythonRelease = z /** is latest major version, true for Python 2.7.18 and latest Python 3 */ is_latest: z.boolean(), is_published: z.boolean(), - release_date: TimestampSchema.nullable().catch(null), + release_date: TimestampSchema, pre_release: z.boolean(), release_page: z.string().nullable(), show_on_download_page: z.boolean(), diff --git a/lib/modules/datasource/rubygems/schema.ts b/lib/modules/datasource/rubygems/schema.ts index 5907078b373f6d..8af3345c9d0c7c 100644 --- a/lib/modules/datasource/rubygems/schema.ts +++ b/lib/modules/datasource/rubygems/schema.ts @@ -37,7 +37,7 @@ export const GemVersions = LooseArray( z .object({ number: z.string(), - created_at: TimestampSchema.nullable().catch(null), + created_at: TimestampSchema, platform: z.string().optional().catch(undefined), ruby_version: z.string().optional().catch(undefined), rubygems_version: z.string().optional().catch(undefined), diff --git a/lib/util/timestamp.spec.ts b/lib/util/timestamp.spec.ts index 1926ea478aed71..f210dfd0181214 100644 --- a/lib/util/timestamp.spec.ts +++ b/lib/util/timestamp.spec.ts @@ -33,9 +33,7 @@ describe('util/timestamp', () => { ${'202x0101000000'} | ${null} `('$input -> $expected', ({ input, expected }) => { expect(asTimestamp(input)).toBe(expected); - expect(TimestampSchema.nullable().catch(null).parse(input)).toBe( - expected, - ); + expect(TimestampSchema.parse(input)).toBe(expected); }); }); }); diff --git a/lib/util/timestamp.ts b/lib/util/timestamp.ts index 5c0e3d32b9c9c1..2ce52b447b581b 100644 --- a/lib/util/timestamp.ts +++ b/lib/util/timestamp.ts @@ -87,15 +87,4 @@ export function asTimestamp(input: unknown): Timestamp | null { return null; } -export const TimestampSchema = z.unknown().transform((input, ctx) => { - const timestamp = asTimestamp(input); - if (!timestamp) { - ctx.addIssue({ - code: z.ZodIssueCode.custom, - message: 'Invalid timestamp', - }); - return z.NEVER; - } - - return timestamp; -}); +export const TimestampSchema = z.unknown().transform(asTimestamp); From 5918999c94957afbcb963fbec660ff01bd4077ab Mon Sep 17 00:00:00 2001 From: Sergei Zharinov Date: Sun, 19 Jan 2025 19:34:46 -0300 Subject: [PATCH 7/8] refactor: Replace TimestampSchema with MaybeTimestamp in multiple datasource schemas - Updated various datasource schemas to use MaybeTimestamp instead of TimestampSchema, allowing for nullable timestamp handling. - Adjusted related tests to ensure compatibility with the new schema definitions. This change improves flexibility in timestamp validation across the application. --- lib/modules/datasource/bitrise/schema.ts | 4 ++-- lib/modules/datasource/cpan/schema.ts | 4 ++-- lib/modules/datasource/crate/schema.ts | 4 ++-- lib/modules/datasource/custom/schema.ts | 4 ++-- lib/modules/datasource/deno/schema.ts | 4 ++-- lib/modules/datasource/devbox/schema.ts | 4 ++-- lib/modules/datasource/dotnet-version/schema.ts | 4 ++-- lib/modules/datasource/endoflife-date/schema.ts | 4 ++-- lib/modules/datasource/galaxy-collection/schema.ts | 4 ++-- lib/modules/datasource/galaxy/schema.ts | 4 ++-- lib/modules/datasource/gitea-releases/schema.ts | 4 ++-- lib/modules/datasource/gitea-tags/schema.ts | 4 ++-- lib/modules/datasource/helm/schema.ts | 4 ++-- lib/modules/datasource/hex/schema.ts | 4 ++-- lib/modules/datasource/packagist/schema.ts | 4 ++-- lib/modules/datasource/python-version/schema.ts | 4 ++-- lib/modules/datasource/rubygems/schema.ts | 4 ++-- .../query-adapters/releases-query-adapter.ts | 4 ++-- .../graphql/query-adapters/tags-query-adapter.ts | 6 +++--- lib/util/timestamp.spec.ts | 4 ++-- lib/util/timestamp.ts | 14 +++++++++++++- 21 files changed, 54 insertions(+), 42 deletions(-) diff --git a/lib/modules/datasource/bitrise/schema.ts b/lib/modules/datasource/bitrise/schema.ts index 3185f74567ff1d..ac29bec00e694b 100644 --- a/lib/modules/datasource/bitrise/schema.ts +++ b/lib/modules/datasource/bitrise/schema.ts @@ -1,10 +1,10 @@ import { z } from 'zod'; import { Yaml } from '../../../util/schema-utils'; -import { TimestampSchema } from '../../../util/timestamp'; +import { MaybeTimestamp } from '../../../util/timestamp'; export const BitriseStepFile = Yaml.pipe( z.object({ - published_at: TimestampSchema, + published_at: MaybeTimestamp, source_code_url: z.string().optional(), }), ); diff --git a/lib/modules/datasource/cpan/schema.ts b/lib/modules/datasource/cpan/schema.ts index 9418a85159c190..e44ce810626f50 100644 --- a/lib/modules/datasource/cpan/schema.ts +++ b/lib/modules/datasource/cpan/schema.ts @@ -1,6 +1,6 @@ import { z } from 'zod'; import { LooseArray } from '../../../util/schema-utils'; -import { TimestampSchema } from '../../../util/timestamp'; +import { MaybeTimestamp } from '../../../util/timestamp'; import type { CpanRelease } from './types'; /** @@ -15,7 +15,7 @@ const MetaCpanApiFileSchema = z }), ), distribution: z.string(), - date: TimestampSchema, + date: MaybeTimestamp, deprecated: z.boolean(), maturity: z.string(), status: z.union([ diff --git a/lib/modules/datasource/crate/schema.ts b/lib/modules/datasource/crate/schema.ts index 4579f4d7ea3c6b..af908f22a93262 100644 --- a/lib/modules/datasource/crate/schema.ts +++ b/lib/modules/datasource/crate/schema.ts @@ -1,10 +1,10 @@ import { z } from 'zod'; -import { TimestampSchema } from '../../../util/timestamp'; +import { MaybeTimestamp } from '../../../util/timestamp'; export const ReleaseTimestampSchema = z .object({ version: z.object({ - created_at: TimestampSchema, + created_at: MaybeTimestamp, }), }) .transform(({ version: { created_at } }) => created_at) diff --git a/lib/modules/datasource/custom/schema.ts b/lib/modules/datasource/custom/schema.ts index e153f2393871d1..c45628064f4a94 100644 --- a/lib/modules/datasource/custom/schema.ts +++ b/lib/modules/datasource/custom/schema.ts @@ -1,5 +1,5 @@ import { z } from 'zod'; -import { TimestampSchema } from '../../../util/timestamp'; +import { MaybeTimestamp } from '../../../util/timestamp'; export const ReleaseResultZodSchema = z.object({ releases: z.array( @@ -7,7 +7,7 @@ export const ReleaseResultZodSchema = z.object({ .object({ version: z.string(), isDeprecated: z.boolean().optional(), - releaseTimestamp: TimestampSchema, + releaseTimestamp: MaybeTimestamp, sourceUrl: z.string().optional(), sourceDirectory: z.string().optional(), changelogUrl: z.string().optional(), diff --git a/lib/modules/datasource/deno/schema.ts b/lib/modules/datasource/deno/schema.ts index d5547c253a19e9..a72b7d29669d71 100644 --- a/lib/modules/datasource/deno/schema.ts +++ b/lib/modules/datasource/deno/schema.ts @@ -1,7 +1,7 @@ import { z } from 'zod'; import { getSourceUrl as getGithubSourceUrl } from '../../../util/github/url'; import { LooseArray } from '../../../util/schema-utils'; -import { TimestampSchema } from '../../../util/timestamp'; +import { MaybeTimestamp } from '../../../util/timestamp'; import type { Release } from '../types'; export const DenoApiTag = z.object({ @@ -32,7 +32,7 @@ export const DenoAPIUploadOptions = z.object({ export const DenoAPIModuleVersionResponse = z .object({ upload_options: DenoAPIUploadOptions, - uploaded_at: TimestampSchema, + uploaded_at: MaybeTimestamp, version: z.string(), }) .transform( diff --git a/lib/modules/datasource/devbox/schema.ts b/lib/modules/datasource/devbox/schema.ts index 15c96becbd950c..d4c3fac44b6208 100644 --- a/lib/modules/datasource/devbox/schema.ts +++ b/lib/modules/datasource/devbox/schema.ts @@ -1,9 +1,9 @@ import { z } from 'zod'; -import { TimestampSchema } from '../../../util/timestamp'; +import { MaybeTimestamp } from '../../../util/timestamp'; export const DevboxRelease = z.object({ version: z.string(), - last_updated: TimestampSchema, + last_updated: MaybeTimestamp, }); export const DevboxResponse = z diff --git a/lib/modules/datasource/dotnet-version/schema.ts b/lib/modules/datasource/dotnet-version/schema.ts index 3fb43bcb30ef48..8660a322b5f067 100644 --- a/lib/modules/datasource/dotnet-version/schema.ts +++ b/lib/modules/datasource/dotnet-version/schema.ts @@ -1,6 +1,6 @@ import { z } from 'zod'; import { LooseArray } from '../../../util/schema-utils'; -import { TimestampSchema } from '../../../util/timestamp'; +import { MaybeTimestamp } from '../../../util/timestamp'; import type { Release } from '../types'; export const ReleasesIndex = z @@ -16,7 +16,7 @@ export const ReleasesIndex = z .transform(({ 'releases-index': releasesIndex }) => releasesIndex); const ReleaseBase = z.object({ - 'release-date': TimestampSchema, + 'release-date': MaybeTimestamp, 'release-notes': z.string(), }); const ReleaseDetails = z.object({ diff --git a/lib/modules/datasource/endoflife-date/schema.ts b/lib/modules/datasource/endoflife-date/schema.ts index 63e112a0f6ce5d..aa4e83cd004035 100644 --- a/lib/modules/datasource/endoflife-date/schema.ts +++ b/lib/modules/datasource/endoflife-date/schema.ts @@ -1,7 +1,7 @@ import { DateTime } from 'luxon'; import { z } from 'zod'; import { UtcDate } from '../../../util/schema-utils'; -import { TimestampSchema } from '../../../util/timestamp'; +import { MaybeTimestamp } from '../../../util/timestamp'; import type { Release } from '../types'; const ExpireableField = z.union([ @@ -16,7 +16,7 @@ export const EndoflifeDateVersions = z .object({ cycle: z.string(), latest: z.optional(z.string()), - releaseDate: TimestampSchema, + releaseDate: MaybeTimestamp, eol: z.optional(ExpireableField), discontinued: z.optional(ExpireableField), }) diff --git a/lib/modules/datasource/galaxy-collection/schema.ts b/lib/modules/datasource/galaxy-collection/schema.ts index af32492a6220ba..0842fc9ccbec59 100644 --- a/lib/modules/datasource/galaxy-collection/schema.ts +++ b/lib/modules/datasource/galaxy-collection/schema.ts @@ -1,5 +1,5 @@ import { z } from 'zod'; -import { TimestampSchema } from '../../../util/timestamp'; +import { MaybeTimestamp } from '../../../util/timestamp'; export type GalaxyV3 = z.infer; export const GalaxyV3 = z.object({ @@ -15,7 +15,7 @@ export const GalaxyV3Versions = z data: z.array( z.object({ version: z.string(), - created_at: TimestampSchema, + created_at: MaybeTimestamp, }), ), }) diff --git a/lib/modules/datasource/galaxy/schema.ts b/lib/modules/datasource/galaxy/schema.ts index da449430d8618a..2366ffa67b1c95 100644 --- a/lib/modules/datasource/galaxy/schema.ts +++ b/lib/modules/datasource/galaxy/schema.ts @@ -1,5 +1,5 @@ import { z } from 'zod'; -import { TimestampSchema } from '../../../util/timestamp'; +import { MaybeTimestamp } from '../../../util/timestamp'; export type GalaxyV1 = z.infer; export const GalaxyV1 = z.object({ @@ -10,7 +10,7 @@ export const GalaxyV1 = z.object({ z .object({ name: z.string(), - created: TimestampSchema, + created: MaybeTimestamp, }) .transform(({ name, created }) => ({ version: name, diff --git a/lib/modules/datasource/gitea-releases/schema.ts b/lib/modules/datasource/gitea-releases/schema.ts index 13e9ab688b2dd0..b1482c99701e63 100644 --- a/lib/modules/datasource/gitea-releases/schema.ts +++ b/lib/modules/datasource/gitea-releases/schema.ts @@ -1,12 +1,12 @@ import { z } from 'zod'; -import { TimestampSchema } from '../../../util/timestamp'; +import { MaybeTimestamp } from '../../../util/timestamp'; export const ReleaseSchema = z.object({ name: z.string(), tag_name: z.string(), body: z.string(), prerelease: z.boolean(), - published_at: TimestampSchema, + published_at: MaybeTimestamp, }); export const ReleasesSchema = z.array(ReleaseSchema); diff --git a/lib/modules/datasource/gitea-tags/schema.ts b/lib/modules/datasource/gitea-tags/schema.ts index c466ba0e900c28..3ba004a0bb1062 100644 --- a/lib/modules/datasource/gitea-tags/schema.ts +++ b/lib/modules/datasource/gitea-tags/schema.ts @@ -1,5 +1,5 @@ import { z } from 'zod'; -import { TimestampSchema } from '../../../util/timestamp'; +import { MaybeTimestamp } from '../../../util/timestamp'; export const CommitSchema = z.object({ sha: z.string(), @@ -9,7 +9,7 @@ export const CommitsSchema = z.array(CommitSchema); const TagCommitSchema = z.object({ sha: z.string(), - created: TimestampSchema, + created: MaybeTimestamp, }); export const TagSchema = z.object({ diff --git a/lib/modules/datasource/helm/schema.ts b/lib/modules/datasource/helm/schema.ts index a7a2637392ab4c..64465295c67d86 100644 --- a/lib/modules/datasource/helm/schema.ts +++ b/lib/modules/datasource/helm/schema.ts @@ -3,12 +3,12 @@ import { detectPlatform } from '../../../util/common'; import { parseGitUrl } from '../../../util/git/url'; import { regEx } from '../../../util/regex'; import { LooseRecord } from '../../../util/schema-utils'; -import { TimestampSchema } from '../../../util/timestamp'; +import { MaybeTimestamp } from '../../../util/timestamp'; import type { Release } from '../types'; const HelmReleaseSchema = z.object({ version: z.string(), - created: TimestampSchema, + created: MaybeTimestamp, digest: z.string().optional().catch(undefined), home: z.string().optional().catch(undefined), sources: z.array(z.string()).catch([]), diff --git a/lib/modules/datasource/hex/schema.ts b/lib/modules/datasource/hex/schema.ts index 3fd0db99cbd223..be37b11f93c575 100644 --- a/lib/modules/datasource/hex/schema.ts +++ b/lib/modules/datasource/hex/schema.ts @@ -1,7 +1,7 @@ import is from '@sindresorhus/is'; import { z } from 'zod'; import { LooseArray } from '../../../util/schema-utils'; -import { TimestampSchema } from '../../../util/timestamp'; +import { MaybeTimestamp } from '../../../util/timestamp'; import type { Release, ReleaseResult } from '../types'; export const HexRelease = z @@ -30,7 +30,7 @@ export const HexRelease = z releases: LooseArray( z.object({ version: z.string(), - inserted_at: TimestampSchema, + inserted_at: MaybeTimestamp, }), ).refine((releases) => releases.length > 0, 'No releases found'), retirements: z diff --git a/lib/modules/datasource/packagist/schema.ts b/lib/modules/datasource/packagist/schema.ts index 6c79f85ba99528..29af76574d5b3c 100644 --- a/lib/modules/datasource/packagist/schema.ts +++ b/lib/modules/datasource/packagist/schema.ts @@ -2,7 +2,7 @@ import is from '@sindresorhus/is'; import { z } from 'zod'; import { logger } from '../../../logger'; import { LooseArray, LooseRecord } from '../../../util/schema-utils'; -import { TimestampSchema } from '../../../util/timestamp'; +import { MaybeTimestamp } from '../../../util/timestamp'; import type { Release, ReleaseResult } from '../types'; export const MinifiedArray = z.array(z.record(z.unknown())).transform((xs) => { @@ -45,7 +45,7 @@ export const ComposerRelease = z.object({ version: z.string(), homepage: z.string().nullable().catch(null), source: z.object({ url: z.string() }).nullable().catch(null), - time: TimestampSchema, + time: MaybeTimestamp, require: z.object({ php: z.string() }).nullable().catch(null), }); export type ComposerRelease = z.infer; diff --git a/lib/modules/datasource/python-version/schema.ts b/lib/modules/datasource/python-version/schema.ts index c59e4a4f0e8f80..4aa2f7f61b697b 100644 --- a/lib/modules/datasource/python-version/schema.ts +++ b/lib/modules/datasource/python-version/schema.ts @@ -1,5 +1,5 @@ import { z } from 'zod'; -import { TimestampSchema } from '../../../util/timestamp'; +import { MaybeTimestamp } from '../../../util/timestamp'; import type { Release } from '../types'; export const PythonRelease = z @@ -13,7 +13,7 @@ export const PythonRelease = z /** is latest major version, true for Python 2.7.18 and latest Python 3 */ is_latest: z.boolean(), is_published: z.boolean(), - release_date: TimestampSchema, + release_date: MaybeTimestamp, pre_release: z.boolean(), release_page: z.string().nullable(), show_on_download_page: z.boolean(), diff --git a/lib/modules/datasource/rubygems/schema.ts b/lib/modules/datasource/rubygems/schema.ts index 8af3345c9d0c7c..63e289f93e4cb1 100644 --- a/lib/modules/datasource/rubygems/schema.ts +++ b/lib/modules/datasource/rubygems/schema.ts @@ -3,7 +3,7 @@ import { z } from 'zod'; import { filterMap } from '../../../util/filter-map'; import { newlineRegex } from '../../../util/regex'; import { LooseArray } from '../../../util/schema-utils'; -import { TimestampSchema } from '../../../util/timestamp'; +import { MaybeTimestamp } from '../../../util/timestamp'; import type { Release } from '../types'; export const MarshalledVersionInfo = LooseArray( @@ -37,7 +37,7 @@ export const GemVersions = LooseArray( z .object({ number: z.string(), - created_at: TimestampSchema, + created_at: MaybeTimestamp, platform: z.string().optional().catch(undefined), ruby_version: z.string().optional().catch(undefined), rubygems_version: z.string().optional().catch(undefined), diff --git a/lib/util/github/graphql/query-adapters/releases-query-adapter.ts b/lib/util/github/graphql/query-adapters/releases-query-adapter.ts index 6d4af0e361d027..7fe39e8bf908e1 100644 --- a/lib/util/github/graphql/query-adapters/releases-query-adapter.ts +++ b/lib/util/github/graphql/query-adapters/releases-query-adapter.ts @@ -1,5 +1,5 @@ import { z } from 'zod'; -import { TimestampSchema } from '../../../timestamp'; +import { Timestamp } from '../../../timestamp'; import type { GithubGraphqlDatasourceAdapter, GithubReleaseItem, @@ -33,7 +33,7 @@ const query = prepareQuery(` const GithubGraphqlRelease = z.object({ version: z.string(), - releaseTimestamp: TimestampSchema, + releaseTimestamp: Timestamp, isDraft: z.boolean(), isPrerelease: z.boolean(), url: z.string(), diff --git a/lib/util/github/graphql/query-adapters/tags-query-adapter.ts b/lib/util/github/graphql/query-adapters/tags-query-adapter.ts index c40c9d0fbbbfc1..6d025cdf4e6b2a 100644 --- a/lib/util/github/graphql/query-adapters/tags-query-adapter.ts +++ b/lib/util/github/graphql/query-adapters/tags-query-adapter.ts @@ -1,5 +1,5 @@ import { z } from 'zod'; -import { TimestampSchema } from '../../../timestamp'; +import { MaybeTimestamp } from '../../../timestamp'; import type { GithubGraphqlDatasourceAdapter, GithubTagItem } from '../types'; import { prepareQuery } from '../util'; @@ -11,7 +11,7 @@ const GithubGraphqlTag = z.object({ z.object({ type: z.literal('Commit'), oid: z.string(), - releaseTimestamp: TimestampSchema, + releaseTimestamp: MaybeTimestamp, }), z.object({ type: z.literal('Tag'), @@ -19,7 +19,7 @@ const GithubGraphqlTag = z.object({ oid: z.string(), }), tagger: z.object({ - releaseTimestamp: TimestampSchema, + releaseTimestamp: MaybeTimestamp, }), }), ]), diff --git a/lib/util/timestamp.spec.ts b/lib/util/timestamp.spec.ts index f210dfd0181214..9b7efe3732c2a8 100644 --- a/lib/util/timestamp.spec.ts +++ b/lib/util/timestamp.spec.ts @@ -1,4 +1,4 @@ -import { TimestampSchema, asTimestamp } from './timestamp'; +import { MaybeTimestamp, asTimestamp } from './timestamp'; describe('util/timestamp', () => { describe('asTimestamp', () => { @@ -33,7 +33,7 @@ describe('util/timestamp', () => { ${'202x0101000000'} | ${null} `('$input -> $expected', ({ input, expected }) => { expect(asTimestamp(input)).toBe(expected); - expect(TimestampSchema.parse(input)).toBe(expected); + expect(MaybeTimestamp.parse(input)).toBe(expected); }); }); }); diff --git a/lib/util/timestamp.ts b/lib/util/timestamp.ts index 2ce52b447b581b..adf44b1c346ca2 100644 --- a/lib/util/timestamp.ts +++ b/lib/util/timestamp.ts @@ -87,4 +87,16 @@ export function asTimestamp(input: unknown): Timestamp | null { return null; } -export const TimestampSchema = z.unknown().transform(asTimestamp); +export const Timestamp = z.unknown().transform((input, ctx) => { + const timestamp = asTimestamp(input); + if (!timestamp) { + ctx.addIssue({ + code: z.ZodIssueCode.custom, + message: 'Invalid timestamp', + }); + return z.NEVER; + } + + return timestamp; +}); +export const MaybeTimestamp = Timestamp.nullable().catch(null); From 524ec9a02386865c9d4737b610d1e8e71fb57919 Mon Sep 17 00:00:00 2001 From: Sergei Zharinov Date: Sun, 19 Jan 2025 19:38:41 -0300 Subject: [PATCH 8/8] Fix --- .../github/graphql/query-adapters/tags-query-adapter.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/util/github/graphql/query-adapters/tags-query-adapter.ts b/lib/util/github/graphql/query-adapters/tags-query-adapter.ts index 6d025cdf4e6b2a..bdc847b55d92c6 100644 --- a/lib/util/github/graphql/query-adapters/tags-query-adapter.ts +++ b/lib/util/github/graphql/query-adapters/tags-query-adapter.ts @@ -1,5 +1,5 @@ import { z } from 'zod'; -import { MaybeTimestamp } from '../../../timestamp'; +import { Timestamp } from '../../../timestamp'; import type { GithubGraphqlDatasourceAdapter, GithubTagItem } from '../types'; import { prepareQuery } from '../util'; @@ -11,7 +11,7 @@ const GithubGraphqlTag = z.object({ z.object({ type: z.literal('Commit'), oid: z.string(), - releaseTimestamp: MaybeTimestamp, + releaseTimestamp: Timestamp, }), z.object({ type: z.literal('Tag'), @@ -19,7 +19,7 @@ const GithubGraphqlTag = z.object({ oid: z.string(), }), tagger: z.object({ - releaseTimestamp: MaybeTimestamp, + releaseTimestamp: Timestamp, }), }), ]),