neoclide/coc.nvim · error

${this.def} is not older than ${releaseAge} days.

Error message

${this.def} is not older than ${releaseAge} days.

What it means

getInfo enforces a minimum release age: when releaseAge > 0, the resolved version must have been published before the cutoff (older than releaseAge days). If its publish time is missing/invalid or too recent, the installer throws this error. It exists to avoid installing versions that are too new (stability/pinning policies).

Source

Thrown at src/extension/installer.ts:230

    if (!this.version) {
      this.version = res['dist-tags']['latest']
      if (releaseAge > 0) {
        let cutoff = Date.now() - releaseAge * 24 * 60 * 60 * 1000
        let published = Date.parse(res.time?.[this.version])
        if (!Number.isFinite(published) || published > cutoff) {
          let versions = Object.keys(res.versions ?? {}).filter(version => {
            let published = Date.parse(res.time?.[version])
            return Number.isFinite(published) && published <= cutoff
          })
          this.version = semver.maxSatisfying(versions, '*') ?? undefined
          if (!this.version) throw new Error(`${this.def} has no release older than ${releaseAge} days.`)
        }
      }
    } else if (releaseAge > 0) {
      let published = Date.parse(res.time?.[this.version])
      let cutoff = Date.now() - releaseAge * 24 * 60 * 60 * 1000
      if (!Number.isFinite(published) || published > cutoff) {
        throw new Error(`${this.def} is not older than ${releaseAge} days.`)
      }
    }
    let obj = res['versions'][this.version]
    if (!obj) throw new Error(`${this.def} doesn't exists in ${registry}.`)
    let requiredVersion = obj['engines'] && obj['engines']['coc']
    if (!requiredVersion) throw new Error(`${this.def} is not a valid coc extension, "engines" field with coc property required.`)
    extensionPath(this.root, res.name)
    return {
      'dist.tarball': obj['dist']['tarball'],
      'engines.coc': requiredVersion,
      version: obj['version'],
      name: res.name
    } as Info
  }

  public async getInfoFromUri(): Promise<Info> {
    let { url } = this
    let repository: URL

View on GitHub (pinned to 50e974d969)

Solutions

  1. Reduce the releaseAge setting (or set it to 0) to allow recent releases.
  2. Pin an explicit older version that satisfies the age requirement.
  3. Fix the system clock if the local date is wrong.
  4. Verify registry 'time' data for the version; a missing timestamp always triggers this.

Example fix

// before
let info = await installer.getInfo() // releaseAge=90, version published 10 days ago -> throws
// after
installer.releaseAge = 7 // allow releases older than 7 days
let info = await installer.getInfo()
Defensive patterns

Strategy: validation

Validate before calling

const published = Date.parse(registryRes.time?.[version])
const cutoff = Date.now() - releaseAge * 24 * 60 * 60 * 1000
if (!Number.isFinite(published) || published > cutoff) {
  // version too new or missing timestamp; pin an older version or drop releaseAge
}

Try / catch

try {
  await installer.getInfo()
} catch (e) {
  if (e.message.includes('is not older than')) {
    installer.releaseAge = 0
    await installer.getInfo() // accept the recent release
  } else throw e
}

Prevention

When it happens

Trigger: getInfo (via info) with a version whose res.time[version] parses to a date after cutoff — i.e. the pinned/current version was published within the last releaseAge days, or its timestamp is missing entirely.

Common situations: Extensions that publish very frequently; registry missing time entries for the version; system clock set far in the past making cutoff later than publish dates; user configured a large releaseAge (e.g. 90 days) against fast-moving extensions.

Related errors


AI-assisted analysis of neoclide/coc.nvim@50e974d969 (2026-08-31). Data as JSON: /api/errors/5895cdd9a9239527. Report an issue: GitHub.