{"record":{"id":"b7890780f346ebff","repo":"clockworklabs/SpacetimeDB","slug":"invalid-version-string-version","errorCode":null,"errorMessage":"Invalid version string: ${version}","messagePattern":"Invalid version string: (.+?)","errorType":"validation","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"crates/bindings-typescript/src/sdk/version.ts","lineNumber":99,"sourceCode":"    return 0; // versions are equal\n  }\n\n  clone(): SemanticVersion {\n    return new SemanticVersion(\n      this.major,\n      this.minor,\n      this.patch,\n      this.preRelease ? [...this.preRelease] : null,\n      this.buildInfo\n    );\n  }\n\n  static parseVersionString(version: string): SemanticVersion {\n    const regex =\n      /^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-([\\da-zA-Z-]+(?:\\.[\\da-zA-Z-]+)*))?(?:\\+([\\da-zA-Z-]+(?:\\.[\\da-zA-Z-]+)*))?$/;\n    const match = version.match(regex);\n    if (!match) {\n      throw new Error(`Invalid version string: ${version}`);\n    }\n\n    const major = parseInt(match[1], 10);\n    const minor = parseInt(match[2], 10);\n    const patch = parseInt(match[3], 10);\n    const preRelease = match[4]\n      ? match[4].split('.').map(id => (isNaN(Number(id)) ? id : Number(id)))\n      : null;\n    const buildInfo = match[5] || null;\n\n    return new SemanticVersion(major, minor, patch, preRelease, buildInfo);\n  }\n}\n\n// The SDK depends on some module information that was not generated before this version.\nexport const _MINIMUM_CLI_VERSION: SemanticVersion = new SemanticVersion(\n  1,\n  4,","sourceCodeStart":81,"sourceCodeEnd":117,"githubUrl":"https://github.com/clockworklabs/SpacetimeDB/blob/6dee26c6efc2856793e12b148a59742964f5d783/crates/bindings-typescript/src/sdk/version.ts#L81-L117","documentation":"SemanticVersion.parseVersionString applies a strict semver regex: MAJOR.MINOR.PATCH in decimal with no leading zeros, an optional -prerelease and optional +build segment built from [0-9A-Za-z-] and dots. Anything else — missing fields, a leading 'v', underscores, surrounding whitespace, 'latest' — throws 'Invalid version string'. It is used on path such as build()'s minimum-version check against the remote module's cliVersion metadata, so malformed generated metadata can also surface it.","triggerScenarios":"SemanticVersion.parseVersionString('v1.2.3'), ('1.2'), ('1.02.0'), ('1.2.3-beta_1'), or a version string with whitespace; also build() throwing because remoteModule.versionInfo.cliVersion is malformed.","commonSituations":"Parsing git tag output ('v' prefix); versions assembled by string concatenation that drop a component; CLI banner strings with extra text; channel labels like 'latest' or 'main' passed where a semver is expected; stale generated bindings containing a bad cliVersion.","solutions":["Normalize before parsing: v.trim().replace(/^v/, '')","Validate with a semver regex before calling parseVersionString","Regenerate bindings when the error comes from cliVersion metadata inside remoteModule.versionInfo"],"exampleFix":"// before\nconst v = SemanticVersion.parseVersionString(rawTag); // 'v1.2.3' -> throws\n\n// after\nconst v = SemanticVersion.parseVersionString(rawTag.trim().replace(/^v/, ''));","handlingStrategy":"type-guard","validationCode":"const SEMVER_RE = /^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-[\\da-zA-Z-]+(?:\\.[\\da-zA-Z-]+)*)?(?:\\+[\\da-zA-Z-]+(?:\\.[\\da-zA-Z-]+)*)?$/;\nconst normalized = raw.trim().replace(/^v/, '');\nif (!SEMVER_RE.test(normalized)) {\n  throw new Error(`not a semver string: ${raw}`);\n}\nconst v = SemanticVersion.parseVersionString(normalized);","typeGuard":"const SEMVER_RE = /^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-[\\da-zA-Z-]+(?:\\.[\\da-zA-Z-]+)*)?(?:\\+[\\da-zA-Z-]+(?:\\.[\\da-zA-Z-]+)*)?$/;\nfunction isSemverString(s: unknown): s is string {\n  return typeof s === 'string' && SEMVER_RE.test(s.trim().replace(/^v/, ''));\n}","tryCatchPattern":null,"preventionTips":["Normalize version strings (trim, strip 'v') before parsing","Never pass git tags, channel labels, or banner text into parseVersionString","Regenerate bindings when cliVersion metadata is the malformed source"],"tags":["version","semver","parsing","typescript"],"backgroundTag":"invalid-semver-format","analyzedSha":"6dee26c6efc2856793e12b148a59742964f5d783","analyzedAt":"2026-08-20T06:08:37.179Z","contentChangedAt":"2026-08-20T06:08:37.179Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}