{"record":{"id":"cf4e7cc01a592fc9","repo":"denoland/deno","slug":"typeerror-err-invalid-opt-value-encoding-the-va","errorCode":null,"errorMessage":"TypeError [ERR_INVALID_OPT_VALUE_ENCODING]: The value \"${encoding}\" is invalid for option \"encoding\"","messagePattern":"TypeError \\[ERR_INVALID_OPT_VALUE_ENCODING\\]: The value \"(.+?)\" is invalid for option \"encoding\"","errorType":"validation","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"ext/node/polyfills/_fs/_fs_readdir.ts","lineNumber":135,"sourceCode":"  }\n  return sortDirEntries(entries);\n}\n\n// Mirrors Node's lib/internal/fs/utils.js getOptions(): a bare string options\n// arg is treated as { encoding: <string> }.\nfunction normalizeOptions(\n  options: readDirOptions | string | null | undefined,\n): readDirOptions | null {\n  if (typeof options === \"string\") {\n    return { encoding: options };\n  }\n  return options ?? null;\n}\n\nfunction validateEncoding(encoding: string | undefined) {\n  if (!encoding || encoding === \"buffer\") return;\n  if (!Buffer.isEncoding(encoding)) {\n    throw new Error(\n      `TypeError [ERR_INVALID_OPT_VALUE_ENCODING]: The value \"${encoding}\" is invalid for option \"encoding\"`,\n    );\n  }\n}\n\nexport function readdir(\n  path: string | Buffer | URL,\n  options: readDirOptions | string,\n  callback: readDirCallback,\n): void;\nexport function readdir(\n  path: string | Buffer | URL,\n  options: readDirOptions | string,\n  callback: readDirCallbackDirent,\n): void;\nexport function readdir(path: string | URL, callback: readDirCallback): void;\nexport function readdir(\n  path: string | Buffer | URL,","sourceCodeStart":117,"sourceCodeEnd":153,"githubUrl":"https://github.com/denoland/deno/blob/89f33cbef296a2b287f323d42de54c871fa69c77/ext/node/polyfills/_fs/_fs_readdir.ts#L117-L153","documentation":"readdir's validateEncoding (ext/node/polyfills/_fs/_fs_readdir.ts:135) accepts a falsy encoding or the special value 'buffer' and otherwise requires Buffer.isEncoding(encoding). Any other string throws a plain Error whose text mimics Node's TypeError [ERR_INVALID_OPT_VALUE_ENCODING]. Valid values are the Buffer encodings ('utf8', 'utf-8', 'ascii', 'latin1', 'binary', 'base64', 'base64url', 'hex', 'ucs2', 'ucs-2', 'utf16le', 'utf-16le') plus 'buffer'.","triggerScenarios":"fs.readdir(dir, 'utf16', cb); fs.promises.readdir(dir, { encoding: 'unicode' }); forwarding a config-supplied encoding string that was never validated.","commonSituations":"Typos like 'utf-8' variants ('utf8 ', 'UTF16'), passing an object where a string was expected, or treating a Node-API option name (e.g., 'json') as an fs encoding.","solutions":["Use 'utf8' (default) or 'buffer'; for Dirent objects use { withFileTypes: true }","Validate unknown encoding strings with Buffer.isEncoding() before passing them","If the value arrives from config, whitelist it against Buffer.isEncoding and fail early with your own message"],"exampleFix":"// before\nconst entries = await fs.promises.readdir(dir, enc); // enc = 'utf16'\n\n// after\nif (enc && enc !== 'buffer' && !Buffer.isEncoding(enc)) throw new TypeError(`bad encoding: ${enc}`);\nconst entries = await fs.promises.readdir(dir, enc);","handlingStrategy":"validation","validationCode":"const isValidReaddirEncoding = (enc) =>\n  enc == null || enc === 'buffer' || (typeof enc === 'string' && Buffer.isEncoding(enc));\nif (!isValidReaddirEncoding(enc)) throw new TypeError(`invalid encoding: ${enc}`);","typeGuard":"function isReaddirEncoding(v) {\n  return v == null || v === 'buffer' || (typeof v === 'string' && Buffer.isEncoding(v));\n}","tryCatchPattern":null,"preventionTips":["Whitelist user/config-supplied encodings with Buffer.isEncoding","Default to omitting encoding (utf8) unless you need Buffers ('buffer')","Use withFileTypes for Dirent objects instead of encoding tricks"],"tags":["node-compat","fs","readdir","encoding","validation"],"backgroundTag":null,"analyzedSha":"89f33cbef296a2b287f323d42de54c871fa69c77","analyzedAt":"2026-08-16T07:54:21.310Z","schemaVersion":2},"datasetVersion":"2026-08-16T08:17:34.114Z"}