{"record":{"id":"c561d05c62c03611","repo":"badges/shields","slug":"unknown-strategy","errorCode":null,"errorMessage":"unknown strategy","messagePattern":"unknown strategy","errorType":"exception","errorClass":"InvalidParameter","httpStatus":null,"severity":"error","filePath":"services/maven-metadata/maven-metadata.service.js","lineNumber":123,"sourceCode":"    } else if (strategy === 'highestVersion') {\n      if (\n        data.metadata.versioning.versions?.version === undefined ||\n        data.metadata.versioning.versions?.version?.length === 0\n      ) {\n        throw new InvalidResponse({\n          prettyMessage: 'no versions found',\n        })\n      }\n      const versions = this.applyFilter({\n        versions: data.metadata.versioning.versions.version,\n        filter,\n      })\n      if (versions.length === 0) {\n        throw new NotFound({ prettyMessage: 'no matching versions found' })\n      }\n      return versions.sort(compare).reverse()[0]\n    }\n    throw new InvalidParameter({ prettyMessage: 'unknown strategy' })\n  }\n\n  async handle(\n    _namedParams,\n    { metadataUrl, versionPrefix, versionSuffix, strategy, filter },\n  ) {\n    if (\n      (versionPrefix !== undefined ||\n        versionSuffix !== undefined ||\n        filter !== undefined) &&\n      strategy !== 'highestVersion'\n    ) {\n      throw new InvalidParameter({\n        prettyMessage: `filter is not valid with strategy ${strategy}`,\n      })\n    }\n\n    if (versionPrefix !== undefined || versionSuffix !== undefined) {","sourceCodeStart":105,"sourceCodeEnd":141,"githubUrl":"https://github.com/badges/shields/blob/766fd8bc89a90b8534dc573ab72dec30215ab1ec/services/maven-metadata/maven-metadata.service.js#L105-L141","documentation":"This InvalidParameter is thrown by the Maven metadata service's getLatestVersion when the requested version-selection `strategy` does not match any implemented strategy. The function only reaches the throw after strategy-specific branches have been exhausted, so it is the catch-all for unrecognized strategy values. Shields.io validates query parameters early, so this surfaces immediately as a user-input error badge rather than a network failure.","triggerScenarios":"Passing a `strategy` query parameter whose value is not one of the supported maven-metadata strategies (e.g. `strategy=semver` or a typo like `strategy=highest` when the service expects `highestVersion`/`latest-release` style values). Any badge URL where the strategy branch in getLatestVersion falls through without matching.","commonSituations":"Copy-pasting badge URLs between services with different strategy names; typos in query strings; documentation drift after strategy options were renamed; URL generators emitting stale strategy values.","solutions":["Check the service docs for the exact list of supported `strategy` values and use one verbatim","If you only need the newest version, omit `strategy` entirely so the default branch applies","Fix typos/casing in the strategy query parameter (values are matched exactly)","If you control the code, extend getLatestVersion to accept the strategy you need instead of inventing a value"],"exampleFix":"// before\n/maven-metadata/v/com.example/artifact.svg?strategy=highest\n// after\n/maven-metadata/v/com.example/artifact.svg?strategy=highestVersion","handlingStrategy":"validation","validationCode":"const VALID_STRATEGIES = ['highestVersion'] // per service docs\nif (strategy !== undefined && !VALID_STRATEGIES.includes(strategy)) {\n  throw new Error(`unknown strategy: ${strategy}; valid: ${VALID_STRATEGIES.join(', ')}`)\n}","typeGuard":"function isKnownStrategy(s) {\n  return typeof s === 'string' && ['highestVersion'].includes(s)\n}","tryCatchPattern":"try {\n  await getBadge({ strategy })\n} catch (e) {\n  if (e instanceof InvalidParameter && /unknown strategy/.test(e.message)) {\n    console.error(`Bad strategy '${strategy}', falling back to default`)\n    return getBadge({})\n  }\n  throw e\n}","preventionTips":["Build badge URLs from a whitelist of documented strategy constants, never free-form strings","Validate query params at the edge of your app before constructing badge URLs","Pin strategy names in shared URL-builder helpers with unit tests","When docs and code disagree, test against the live endpoint and record accepted values"],"tags":["invalid-parameter","maven","bad-input","query-string"],"backgroundTag":"invalid-query-parameter","analyzedSha":"766fd8bc89a90b8534dc573ab72dec30215ab1ec","analyzedAt":"2026-08-30T01:40:27.499Z","schemaVersion":2},"datasetVersion":"2026-08-30T03:17:51.788Z"}