{"record":{"id":"4bdce29913c6bc72","repo":"vuejs/vue-cli","slug":"expected-string-or-integer-value-4bdce2","errorCode":null,"errorMessage":"Expected string or integer value.","messagePattern":"Expected string or integer value\\.","errorType":"validation","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"packages/@vue/cli/lib/GeneratorAPI.js","lineNumber":115,"sourceCode":"\n  /**\n   * Resolve path for a project.\n   *\n   * @param {string} _paths - A sequence of relative paths or path segments\n   * @return {string} The resolved absolute path, caculated based on the current project root.\n   */\n  resolve (..._paths) {\n    return path.resolve(this.generator.context, ..._paths)\n  }\n\n  get cliVersion () {\n    return require('../package.json').version\n  }\n\n  assertCliVersion (range) {\n    if (typeof range === 'number') {\n      if (!Number.isInteger(range)) {\n        throw new Error('Expected string or integer value.')\n      }\n      range = `^${range}.0.0-0`\n    }\n    if (typeof range !== 'string') {\n      throw new Error('Expected string or integer value.')\n    }\n\n    if (semver.satisfies(this.cliVersion, range, { includePrerelease: true })) return\n\n    throw new Error(\n      `Require global @vue/cli \"${range}\", but was invoked by \"${this.cliVersion}\".`\n    )\n  }\n\n  get cliServiceVersion () {\n    // In generator unit tests, we don't write the actual file back to the disk.\n    // So there is no cli-service module to load.\n    // In that case, just return the cli version.","sourceCodeStart":97,"sourceCodeEnd":133,"githubUrl":"https://github.com/vuejs/vue-cli/blob/7eb93c169c7520935252e2473387f923ef80d856/packages/@vue/cli/lib/GeneratorAPI.js#L97-L133","documentation":"Thrown by assertCliVersion when the `range` argument is a number that is not an integer (e.g., a float like 3.5). The method expects either a semver range string or a whole integer major version, which it converts into a caret range. Passing a fractional number is treated as a programmer error.","triggerScenarios":"Calling generatorAPI.assertCliVersion(3.5) or assertCliVersion(4.2) where a non-integer number is passed as the version range.","commonSituations":"A plugin generator author passes a float instead of an integer major version, or accidentally passes a computed version number that ends up fractional.","solutions":["Pass an integer major version (e.g., assertCliVersion(4)) or a full semver range string (e.g., assertCliVersion('^4.0.0')).","If you computed the version dynamically, wrap it with Math.floor() before passing."],"exampleFix":"// before\ngeneratorAPI.assertCliVersion(4.2)\n// after\ngeneratorAPI.assertCliVersion(4)\n// or\ngeneratorAPI.assertCliVersion('^4.2.0')","handlingStrategy":"validation","validationCode":"function isValidVersionRange(range) {\n  if (typeof range === 'number') return Number.isInteger(range);\n  return typeof range === 'string';\n}\n// before calling:\nif (!isValidVersionRange(myRange)) {\n  throw new TypeError('range must be an integer or semver string');\n}","typeGuard":"function isVersionRange(range) {\n  return (typeof range === 'number' && Number.isInteger(range)) || typeof range === 'string';\n}","tryCatchPattern":"try {\n  generatorAPI.assertCliVersion(range);\n} catch (e) {\n  if (e.message === 'Expected string or integer value.') {\n    console.error('Invalid version range passed to assertCliVersion:', range);\n  }\n  throw e;\n}","preventionTips":["Always pass integer major versions or full semver range strings to assertCliVersion.","If computing versions dynamically, floor the number: Math.floor(version).","Validate with Number.isInteger() before passing numeric arguments."],"tags":["validation","version","plugin-api","programmer-error"],"backgroundTag":null,"analyzedSha":"7eb93c169c7520935252e2473387f923ef80d856","analyzedAt":"2026-08-13T10:13:37.803Z","schemaVersion":2},"datasetVersion":"2026-08-13T14:17:21.547Z"}