vuejs/vue-cli · error · Error
Expected string or integer value.
Error message
Expected string or integer value.
What it means
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.
Source
Thrown at packages/@vue/cli/lib/GeneratorAPI.js:115
/**
* Resolve path for a project.
*
* @param {string} _paths - A sequence of relative paths or path segments
* @return {string} The resolved absolute path, caculated based on the current project root.
*/
resolve (..._paths) {
return path.resolve(this.generator.context, ..._paths)
}
get cliVersion () {
return require('../package.json').version
}
assertCliVersion (range) {
if (typeof range === 'number') {
if (!Number.isInteger(range)) {
throw new Error('Expected string or integer value.')
}
range = `^${range}.0.0-0`
}
if (typeof range !== 'string') {
throw new Error('Expected string or integer value.')
}
if (semver.satisfies(this.cliVersion, range, { includePrerelease: true })) return
throw new Error(
`Require global @vue/cli "${range}", but was invoked by "${this.cliVersion}".`
)
}
get cliServiceVersion () {
// In generator unit tests, we don't write the actual file back to the disk.
// So there is no cli-service module to load.
// In that case, just return the cli version.View on GitHub (pinned to 7eb93c169c)
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.
Example fix
// before
generatorAPI.assertCliVersion(4.2)
// after
generatorAPI.assertCliVersion(4)
// or
generatorAPI.assertCliVersion('^4.2.0') Defensive patterns
Strategy: validation
Validate before calling
function isValidVersionRange(range) {
if (typeof range === 'number') return Number.isInteger(range);
return typeof range === 'string';
}
// before calling:
if (!isValidVersionRange(myRange)) {
throw new TypeError('range must be an integer or semver string');
} Type guard
function isVersionRange(range) {
return (typeof range === 'number' && Number.isInteger(range)) || typeof range === 'string';
} Try / catch
try {
generatorAPI.assertCliVersion(range);
} catch (e) {
if (e.message === 'Expected string or integer value.') {
console.error('Invalid version range passed to assertCliVersion:', range);
}
throw e;
} Prevention
- 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.
When it happens
Trigger: Calling generatorAPI.assertCliVersion(3.5) or assertCliVersion(4.2) where a non-integer number is passed as the version range.
Common situations: A plugin generator author passes a float instead of an integer major version, or accidentally passes a computed version number that ends up fractional.
Related errors
- Expected string or integer value.
- Require @vue/cli-service "${range}", but was loaded with "${
- Require global @vue/cli "${range}", but was invoked by "${th
- Require @vue/cli-service "${range}", but was loaded with "${
- Invalid package name ${packageName}
AI-assisted analysis of vuejs/vue-cli@7eb93c169c (2026-08-13).
Data as JSON: /api/errors/4bdce29913c6bc72.
Report an issue: GitHub.