{"id":"489de54e9ccf86a3","repo":"colinhacks/zod","slug":"invalid-template-literal-part-part","errorCode":null,"errorMessage":"Invalid template literal part: ${part}","messagePattern":"Invalid template literal part: (.+?)","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"packages/zod/src/v4/core/schemas.ts","lineNumber":4311,"sourceCode":"    for (const part of def.parts) {\n      if (typeof part === \"object\" && part !== null) {\n        // is Zod schema\n        if (!part._zod.pattern) {\n          // if (!source)\n          throw new Error(`Invalid template literal part, no pattern found: ${[...(part as any)._zod.traits].shift()}`);\n        }\n\n        const source = part._zod.pattern instanceof RegExp ? part._zod.pattern.source : part._zod.pattern;\n\n        if (!source) throw new Error(`Invalid template literal part: ${part._zod.traits}`);\n\n        const start = source.startsWith(\"^\") ? 1 : 0;\n        const end = source.endsWith(\"$\") ? source.length - 1 : source.length;\n        regexParts.push(source.slice(start, end));\n      } else if (part === null || util.primitiveTypes.has(typeof part)) {\n        regexParts.push(util.escapeRegex(`${part}`));\n      } else {\n        throw new Error(`Invalid template literal part: ${part}`);\n      }\n    }\n    inst._zod.pattern = new RegExp(`^${regexParts.join(\"\")}$`);\n\n    inst._zod.parse = (payload, _ctx) => {\n      if (typeof payload.value !== \"string\") {\n        payload.issues.push({\n          input: payload.value,\n          inst,\n          expected: \"string\",\n          code: \"invalid_type\",\n        });\n        return payload;\n      }\n\n      inst._zod.pattern.lastIndex = 0;\n\n      if (!inst._zod.pattern.test(payload.value)) {","sourceCodeStart":4293,"sourceCodeEnd":4329,"githubUrl":"https://github.com/colinhacks/zod/blob/912f0f51b0ced654d0069741e7160834dca742ee/packages/zod/src/v4/core/schemas.ts#L4293-L4329","documentation":"Thrown in `$ZodTemplateLiteral` when a part is neither a Zod schema object (no `_zod`), nor `null`, nor a primitive (string/number/boolean/undefined per `util.primitiveTypes`). Template literal parts must be primitives (interpolated literally) or string-patterned Zod schemas; anything else is rejected.","triggerScenarios":"Passing a plain JS object, an array, a `Date`, a `Symbol`, or any non-schema non-primitive as a part to `z.templateLiteral([...])`. E.g. `z.templateLiteral([{ foo: 1 }])`.","commonSituations":"Passing config objects or class instances expecting them to be stringified; spreading an array of mixed parts that includes objects.","solutions":["Only pass primitives (string/number/boolean) or Zod schemas as template parts.","If you need a dynamic object's value, extract a primitive field (e.g. `obj.id`) or stringify it into a `z.literal(String(obj))`.","Filter/map the parts array before passing it to ensure every element is a primitive or schema."],"exampleFix":"// before\nconst T = z.templateLiteral([z.literal('u:'), { id: 5 }]);\n\n// after\nconst T = z.templateLiteral([z.literal('u:'), z.literal('5')]);\n// or build the literal from a primitive string:\nconst T2 = z.templateLiteral(['u:', String(5)]);","handlingStrategy":"type-guard","validationCode":"const PRIMS = new Set(['string','number','boolean','bigint','symbol','undefined']);\nfunction isValidTemplatePart(p) {\n  if (p === null) return true;\n  if (PRIMS.has(typeof p)) return true;\n  if (typeof p === 'object' && p !== null && p._zod) return true;\n  return false;\n}\nparts.forEach((p) => { if (!isValidTemplatePart(p)) throw new Error('invalid template part'); });","typeGuard":"const PRIMS = new Set(['string','number','boolean','bigint','symbol','undefined']);\nfunction isValidTemplatePart(p): boolean {\n  if (p === null) return true;\n  if (PRIMS.has(typeof p)) return true;\n  return typeof p === 'object' && p !== null && !!p._zod;\n}","tryCatchPattern":"try {\n  const T = z.templateLiteral(parts);\n} catch (e) {\n  if (e instanceof Error && e.message.startsWith('Invalid template literal part:')) {\n    // filter parts to primitives/schemas before rebuilding\n  }\n  throw e;\n}","preventionTips":["Map/filter mixed input arrays to primitives or schemas before passing to z.templateLiteral.","Never pass plain objects, Dates, or class instances as template parts.","Stringify non-primitive values into z.literal(...) explicitly."],"tags":["template-literal","schema-definition","validation"],"analyzedSha":"912f0f51b0ced654d0069741e7160834dca742ee","analyzedAt":"2026-08-03T17:41:55.908Z","schemaVersion":2}