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

  1. Pass an integer major version (e.g., assertCliVersion(4)) or a full semver range string (e.g., assertCliVersion('^4.0.0')).
  2. 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

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


AI-assisted analysis of vuejs/vue-cli@7eb93c169c (2026-08-13). Data as JSON: /api/errors/4bdce29913c6bc72. Report an issue: GitHub.