{"record":{"id":"a774b2fd1d4debf8","repo":"badges/shields","slug":"unknown-releasetype-releasetype","errorCode":null,"errorMessage":"Unknown releaseType: ${releaseType}","messagePattern":"Unknown releaseType: (.+?)","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"services/version.js","lineNumber":199,"sourceCode":" */\nfunction slice(v, releaseType) {\n  if (!semver.valid(v, /* loose */ true)) {\n    return null\n  }\n\n  const major = semver.major(v, /* loose */ true)\n  const minor = semver.minor(v, /* loose */ true)\n  const patch = semver.patch(v, /* loose */ true)\n  const prerelease = semver.prerelease(v, /* loose */ true)\n\n  const dottedParts = {\n    major: [major],\n    minor: [major, minor],\n    patch: [major, minor, patch],\n  }[releaseType]\n\n  if (dottedParts === undefined) {\n    throw Error(`Unknown releaseType: ${releaseType}`)\n  }\n\n  const dotted = dottedParts.join('.')\n  if (prerelease) {\n    return `${dotted}-${prerelease.join('.')}`\n  } else {\n    return dotted\n  }\n}\n\n/**\n * Returns the start of the range that matches a given version string.\n *\n * @param {string} v - A version string that follows the Semantic Versioning specification. The function will accept and coerce invalid versions into valid ones.\n * @returns {string} The start of the range that matches the given version string, or null if no match is found.\n * @throws {TypeError} If v is an invalid semver range\n * @example\n * rangeStart('^1.2.3') // returns '1.2.3'","sourceCodeStart":181,"sourceCodeEnd":217,"githubUrl":"https://github.com/badges/shields/blob/766fd8bc89a90b8534dc573ab72dec30215ab1ec/services/version.js#L181-L217","documentation":"slice() in services/version.js truncates a parsed version to the requested release level. It looks up the releaseType in a map of 'major' | 'minor' | 'patch' to dotted parts; if releaseType is anything else the lookup is undefined and the function throws this plain Error. It guards against unsupported granularity values passed by callers such as capitalize, format, coalesceBadge and extension.","triggerScenarios":"Calling slice(version, releaseType) with a value other than 'major', 'minor', or 'patch' — e.g. 'build', 'prerelease', an empty string, or a user-provided granularity from a service config or route parameter.","commonSituations":"A badge/service config exposes 'which parts of the version to show' to users and a bad value ('full', 'semver') is forwarded; a typo in a route parameter; a new releaseType added in one place but not to slice's map.","solutions":["Fix the caller to pass exactly 'major', 'minor' or 'patch'","Validate/normalize the user- or route-supplied releaseType before calling slice (whitelist check, lowercase trim)","If other granularities are needed, add them to the { major: [...], minor: [...], patch: [...] } map"],"exampleFix":"// before\nconst sliced = slice(version, 'semver')\n// after\nconst sliced = slice(version, 'patch')","handlingStrategy":"type-guard","validationCode":"const RELEASE_TYPES = ['major', 'minor', 'patch']\nif (!RELEASE_TYPES.includes(releaseType)) {\n  throw new Error(`Invalid releaseType: ${releaseType}`)\n}","typeGuard":"function isReleaseType(v) {\n  return v === 'major' || v === 'minor' || v === 'patch'\n}","tryCatchPattern":"try {\n  return slice(version, releaseType)\n} catch (err) {\n  if (err.message.startsWith('Unknown releaseType:')) {\n    return version // fall back to the full version string\n  }\n  throw err\n}","preventionTips":["Constrain releaseType to the literal union 'major'|'minor'|'patch' in TypeScript","Whitelist-validate route/query parameters before passing them to slice","Lowercase/trim user input used as releaseType","Add a unit test covering every allowed releaseType value"],"tags":["invalid-argument","version-parsing","internal-guard"],"backgroundTag":"invalid-argument-value","analyzedSha":"766fd8bc89a90b8534dc573ab72dec30215ab1ec","analyzedAt":"2026-08-30T01:40:27.499Z","schemaVersion":2},"datasetVersion":"2026-08-30T03:17:51.788Z"}