{"id":"6f8e9658aa267aca","repo":"jestjs/jest","slug":"invalid-data-uri-encoding-encoding","errorCode":null,"errorMessage":"Invalid data URI encoding: ${encoding}","messagePattern":"Invalid data URI encoding: (.+?)","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"packages/jest-runtime/src/internals/EsmLoader.ts","lineNumber":142,"sourceCode":"\n// Decode a `data:` URI specifier into its mime type and decoded code/body.\n// `application/wasm` returns a Buffer; everything else returns a UTF-8 string.\nconst dataURIRegex =\n  /^data:(?<mime>text\\/javascript|application\\/json|application\\/wasm)(?:;(?<encoding>charset=utf-8|base64))?,(?<code>.*)$/;\n\nfunction parseDataUri(specifier: string): {\n  mime: string;\n  code: string | Buffer;\n} {\n  const match = specifier.match(dataURIRegex);\n  if (!match || !match.groups) {\n    throw new Error('Invalid data URI');\n  }\n  const {mime, encoding, code} = match.groups;\n  if (mime === 'application/wasm') {\n    if (!encoding) throw new Error('Missing data URI encoding');\n    if (encoding !== 'base64') {\n      throw new Error(`Invalid data URI encoding: ${encoding}`);\n    }\n    return {code: Buffer.from(code, 'base64'), mime};\n  }\n  if (!encoding || encoding === 'charset=utf-8') {\n    return {code: decodeURIComponent(code), mime};\n  }\n  if (encoding === 'base64') {\n    return {code: Buffer.from(code, 'base64').toString(), mime};\n  }\n  throw new Error(`Invalid data URI encoding: ${encoding}`);\n}\n\n// Mirrors Node's `validateAttributes` in lib/internal/modules/esm/assert.js.\n// The only deliberate divergence: missing `type: 'json'` warns instead of\n// throwing — see the JSON branch below.\nconst warnedMissingJsonAttributePairs = new Set<string>();\n// Soft cap so a long-lived process (watch mode, --runInBand) can't grow the\n// set without bound. When we hit it we drop everything; users see at most one","sourceCodeStart":124,"sourceCodeEnd":160,"githubUrl":"https://github.com/jestjs/jest/blob/f49721c78e195558b40913977c9230f5b7f559d8/packages/jest-runtime/src/internals/EsmLoader.ts#L124-L160","documentation":"Thrown by parseDataUri when a WASM data URI declares an encoding that is not `base64`. Since wasm is binary, the only valid encoding is base64 — anything else (e.g. `charset=utf-8`) is rejected at parse time.","triggerScenarios":"Importing `data:application/wasm;charset=utf-8,...` or any encoding token other than `base64` for a wasm URI.","commonSituations":"Reusing a JS data URI template (`;charset=utf-8`) for wasm; a bundler plugin emitting the wrong encoding for wasm modules.","solutions":["Change the encoding to `;base64`: `data:application/wasm;base64,<base64>`.","Regenerate the URI with `Buffer.from(bytes).toString('base64')`."],"exampleFix":"// before\nimport wasm from 'data:application/wasm;charset=utf-8,<text>';\n\n// after\nimport wasm from 'data:application/wasm;base64,<base64>';","handlingStrategy":"validation","validationCode":"function assertWasmEncoding(uri) {\n  const m = uri.match(/^data:application\\/wasm;([^,]+),/);\n  if (!m) throw new Error('not a wasm data URI');\n  if (m[1] !== 'base64') throw new Error(`wasm data URI must use base64, got ${m[1]}`);\n}","typeGuard":"function usesBase64WasmEncoding(s: string): boolean {\n  return /^data:application\\/wasm;base64,/.test(s);\n}","tryCatchPattern":null,"preventionTips":["For wasm, always use `;base64` — never `;charset=utf-8`.","Centralize data-URI building in one helper to avoid encoding drift."],"tags":["esm","data-uri","wasm","encoding"],"analyzedSha":"f49721c78e195558b40913977c9230f5b7f559d8","analyzedAt":"2026-08-03T20:16:28.571Z","schemaVersion":2}