badges/shields · error · InvalidResponse
property 'latest' not found
Error message
property 'latest' not found
What it means
Thrown when strategy 'latestProperty' is requested but the parsed maven-metadata.xml has no <latest> element under <versioning>, so data.metadata.versioning.latest is undefined. The library treats a missing required field in the upstream XML as an InvalidResponse rather than silently returning undefined.
Source
Thrown at services/maven-metadata/maven-metadata.service.js:93
async fetch({ metadataUrl }) {
return this._requestXml({
schema,
url: metadataUrl,
parserOptions: { parseTagValue: false },
})
}
static applyFilter({ versions, filter }) {
if (!filter) {
return versions
}
return matcher(versions, filter)
}
static getLatestVersion({ data, strategy, filter }) {
if (strategy === 'latestProperty') {
if (data.metadata.versioning.latest === undefined) {
throw new InvalidResponse({
prettyMessage: "property 'latest' not found",
})
}
return data.metadata.versioning.latest
} else if (strategy === 'releaseProperty') {
if (data.metadata.versioning.release === undefined) {
throw new InvalidResponse({
prettyMessage: "property 'release' not found",
})
}
return data.metadata.versioning.release
} else if (strategy === 'highestVersion') {
if (
data.metadata.versioning.versions?.version === undefined ||
data.metadata.versioning.versions?.version?.length === 0
) {
throw new InvalidResponse({
prettyMessage: 'no versions found',View on GitHub (pinned to 766fd8bc89)
Solutions
- Switch strategy to 'releaseProperty' if the metadata has <release>, or 'highestVersion' which derives the version from the versions list.
- Inspect the raw maven-metadata.xml for the artifact and confirm which versioning fields it actually contains.
- Regenerate/republish the artifact so its maven-metadata.xml includes <latest>, or fix the repository manager (e.g. Nexus/Artifactory) metadata.
- Wrap the call in a try/catch and fall back to the highestVersion strategy when this error occurs.
Example fix
// before
const v = await service.getLatestVersion({ data, strategy: 'latestProperty', filter })
// after
const strategy = data.metadata.versioning.latest !== undefined ? 'latestProperty' : (data.metadata.versioning.release !== undefined ? 'releaseProperty' : 'highestVersion')
const v = await service.getLatestVersion({ data, strategy, filter }) Defensive patterns
Strategy: validation
Validate before calling
function hasLatest(data) {
return data?.metadata?.versioning?.latest !== undefined
}
if (!hasLatest(data)) {
return data.metadata?.versioning?.release !== undefined
? service.getLatestVersion({ data, strategy: 'releaseProperty' })
: service.getLatestVersion({ data, strategy: 'highestVersion' })
} Type guard
function hasLatest(data) {
return data?.metadata?.versioning?.latest !== undefined
} Try / catch
try {
return await service.getLatestVersion({ data, strategy: 'latestProperty' })
} catch (err) {
if (err && err.prettyMessage === "property 'latest' not found") {
return service.getLatestVersion({ data, strategy: 'highestVersion' })
}
throw err
} Prevention
- Check which versioning fields the target repository's maven-metadata.xml actually emits before choosing a strategy.
- Prefer 'highestVersion' for repos generated by modern build tools that omit <latest>.
- Guard with an optional-chain check on data.metadata.versioning.latest first.
- Keep a fallback chain: latestProperty → releaseProperty → highestVersion.
When it happens
Trigger: Calling handle/getLatestVersion with strategy='latestProperty' on metadata from a repository that omits the <latest> tag — common in modern maven-metadata.xml files generated by newer build tools where only <release> or <versions> is present.
Common situations: Publishing with Gradle or maven-publish plugins that no longer emit <latest>, pointing at artifact metadata for snapshot-free release-only repos, or third-party/mirror repositories with incomplete metadata.
Related errors
- property 'release' not found
- no versions found
- license not found
- invalid json response
- Field `message` is required
AI-assisted analysis of badges/shields@766fd8bc89 (2026-08-30).
Data as JSON: /api/errors/4910d4014bb081c4.
Report an issue: GitHub.