{"record":{"id":"bca30ce975195e6c","repo":"JuliusBrussee/caveman","slug":"unknown-caveman-adapter-adapter","errorCode":null,"errorMessage":"Unknown Caveman adapter: ${adapter}","messagePattern":"Unknown Caveman adapter: (.+?)","errorType":"exception","errorClass":"TypeError","httpStatus":null,"severity":"error","filePath":"packages/middleware/typescript/src/compatibility.ts","lineNumber":64,"sourceCode":"}\n\nexport function frameworkCompatible(name: Framework, version = frameworkVersion(name)): boolean {\n  const spec = frameworks[name];\n  return inRange(version, spec.tested, spec.high);\n}\n\nexport function adapterCompatible(adapter: AdapterName): boolean {\n  return adapters[adapter].every(name => frameworkCompatible(name));\n}\n\n/** Read-only, content-free local check. Does not import optional frameworks or\n * contact the compression runtime. Unknown metadata never enables compression.\n * Node ESM bundles must keep framework packages external with metadata intact. */\nexport function inspectFrameworkCompatibility(adapter: AdapterName): {\n  schema_version: 1; adapter: AdapterName; compatible: boolean; frameworks: FrameworkCompatibility[];\n} {\n  const entries = adapters[adapter];\n  if (!entries) throw new TypeError(`Unknown Caveman adapter: ${adapter}`);\n  const checks: FrameworkCompatibility[] = entries.map(name => {\n    const spec = frameworks[name], version = frameworkVersion(name);\n    const compatible = frameworkCompatible(name, version), tested = version === spec.tested;\n    const reason = compatible ? 'compatible' : version === null ? 'version_unavailable' : 'unsupported_version';\n    const action = compatible\n      ? tested ? 'Exact test pin detected; run your workload acceptance checks.' : `Range accepted; only ${spec.tested} is the tested pin. Run your workload acceptance checks.`\n      : version === null\n        ? `Install ${name}@${spec.tested}. For Node ESM bundles, keep framework packages external and preserve package.json metadata.`\n        : `Use ${name}@${spec.tested}, or keep optimization bypassed until this version is supported.`;\n    return { package: name, installed_version: version, supported_range: `>=${spec.tested} <${spec.high}`,\n      tested_version: spec.tested, tested, compatible, reason, action };\n  });\n  return { schema_version: 1, adapter, compatible: checks.every(check => check.compatible), frameworks: checks };\n}\n","sourceCodeStart":46,"sourceCodeEnd":79,"githubUrl":"https://github.com/JuliusBrussee/caveman/blob/3ee70a102609e550bd2e68004bf5990a9341c851/packages/middleware/typescript/src/compatibility.ts#L46-L79","documentation":"inspectFrameworkCompatibility looks up the adapter name in the adapters registry; if the key is absent it throws this TypeError. Only registered Caveman adapter names (e.g. 'langchain') can be inspected. This is a programmer-error guard against typos or unsupported adapters.","triggerScenarios":"Calling inspectFrameworkCompatibility(adapter) with an adapter string that is not a key of the adapters registry — typically a typo, an adapter for another library version, or a dynamically constructed name.","commonSituations":"Typos like 'langchainjs' or 'LangChain', passing user-supplied adapter names without validation, or using an adapter added in a newer package version than installed.","solutions":["Check the spelling and exact casing of the adapter string against the adapters registry exported by the package.","List available adapters by inspecting the adapters export (or package docs) and pick a valid AdapterName.","Upgrade @caveman/middleware if the adapter exists only in a newer release.","Validate adapter names from external input against the registry before calling the function."],"exampleFix":"// before\ninspectFrameworkCompatibility('langchain-js'); // TypeError\n// after\nconst adapter: AdapterName = 'langchain';\ninspectFrameworkCompatibility(adapter);","handlingStrategy":"validation","validationCode":"import { adapters } from '@caveman/middleware/typescript/compatibility';\nfunction isValidAdapter(a: string): a is AdapterName { return a in adapters; }","typeGuard":"const isAdapterName = (v: unknown): v is AdapterName =>\n  typeof v === 'string' && v in adapters;","tryCatchPattern":"try {\n  inspectFrameworkCompatibility(adapter);\n} catch (e) {\n  if (e instanceof TypeError && e.message.startsWith('Unknown Caveman adapter')) {\n    throw new Error(`Unsupported adapter '${adapter}'; expected one of: ${Object.keys(adapters).join(', ')}`);\n  } else throw e;\n}","preventionTips":["Use the exported AdapterName type so typos are compile errors","Never pass raw user input as an adapter name without validation","Keep the middleware package updated with the adapters you use","Autocomplete from the registry instead of typing names manually"],"tags":["typescript","validation","adapter","invalid-argument"],"backgroundTag":"invalid-enum-value","analyzedSha":"3ee70a102609e550bd2e68004bf5990a9341c851","analyzedAt":"2026-09-20T15:53:39.229Z","contentChangedAt":"2026-09-20T15:53:39.229Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}