{"record":{"id":"2bf557a873fa8d04","repo":"neoclide/coc.nvim","slug":"illegal-argument-pattern","errorCode":null,"errorMessage":"Illegal argument: pattern","messagePattern":"Illegal argument: pattern","errorType":"validation","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"src/model/relativePattern.ts","lineNumber":17,"sourceCode":"'use strict'\nimport { URI } from 'vscode-uri'\nimport { illegalArgument } from '../util/errors'\nimport { WorkspaceFolder } from 'vscode-languageserver-types'\n\nexport default class RelativePattern {\n  public pattern: string\n  public baseUri: URI\n\n  constructor(base: WorkspaceFolder | URI | string, pattern: string) {\n    if (typeof base !== 'string') {\n      if (!base || !URI.isUri(base) && typeof base.uri !== 'string') {\n        throw illegalArgument('base')\n      }\n    }\n    if (typeof pattern !== 'string') {\n      throw illegalArgument('pattern')\n    }\n    if (typeof base === 'string') {\n      this.baseUri = URI.file(base)\n    } else if (URI.isUri(base)) {\n      this.baseUri = base\n    } else {\n      this.baseUri = URI.parse(base.uri)\n    }\n    this.pattern = pattern\n  }\n\n  public toJSON() {\n    return {\n      pattern: this.pattern,\n      baseUri: this.baseUri.toJSON()\n    }\n  }\n}","sourceCodeStart":1,"sourceCodeEnd":35,"githubUrl":"https://github.com/neoclide/coc.nvim/blob/50e974d9692461a69147d5cab146a8d3e439abe4/src/model/relativePattern.ts#L1-L35","documentation":"RelativePattern requires the pattern argument to be a string glob; passing any other type throws illegalArgument('pattern') with message \"Illegal argument: pattern\". This check runs after base validation in the constructor.","triggerScenarios":"new RelativePattern(base, someVar) where someVar is undefined, null, a RegExp, or an array of globs.","commonSituations":"Reading the glob from config where the key is missing (undefined); passing a RegExp instead of a glob string; arrays of patterns from settings not being joined into one string.","solutions":["Pass a glob string such as '**/*.ts'.","Coalesce config values with a default: pattern ?? '**/*'.","Convert RegExp or array inputs to a string (join array patterns with commas or build multiple RelativePatterns).","Validate typeof pattern === 'string' before constructing."],"exampleFix":"// before\nnew RelativePattern(folder, config.exclude) // array | undefined\n// after\nnew RelativePattern(folder, Array.isArray(config.exclude) ? config.exclude.join(',') : (config.exclude ?? '**/*'))","handlingStrategy":"type-guard","validationCode":"if (typeof pattern !== 'string') throw new Error('RelativePattern pattern must be a glob string')","typeGuard":"function isGlob(v: unknown): v is string { return typeof v === 'string' }","tryCatchPattern":"try { const rp = new RelativePattern(base, pattern) } catch (e) { if (String(e).includes('Illegal argument: pattern')) { const rp = new RelativePattern(base, String(pattern ?? '**/*')) } else throw e }","preventionTips":["Coalesce config glob values with defaults (pattern ?? '**/*')","Join array globs into one string or create multiple RelativePatterns","Use globs, not RegExp, for watcher patterns"],"tags":["argument-validation","filesystem-watcher","type-error"],"backgroundTag":"illegal-argument","analyzedSha":"50e974d9692461a69147d5cab146a8d3e439abe4","analyzedAt":"2026-08-31T11:17:23.966Z","schemaVersion":2},"datasetVersion":"2026-08-31T14:17:45.589Z"}