Ctrl K
ComunidadGuías…

lib/openapi-overlay.ts

Rama main · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
type Json=Record<string,unknown>;
function record(value:unknown):value is Json{return Boolean(value&&typeof value==="object"&&!Array.isArray(value));}
function segments(target:string){if(!target.startsWith("$"))throw new Error("Overlay target must start with $.");const parts:string[]=[];const pattern=/\.([A-Za-z0-9_-]+)|\[['"]([^'"]+)['"]\]/g;let match:RegExpExecArray|null;let consumed=1;while((match=pattern.exec(target))){if(match.index!==consumed)throw new Error("Only exact Overlay JSONPath targets are supported.");parts.push(match[1]??match[2]);consumed=pattern.lastIndex;}if(consumed!==target.length||parts.length>20)throw new Error("Invalid or overly deep Overlay target.");return parts;}
function merge(base:unknown,patch:unknown):unknown{if(!record(base)||!record(patch))return structuredClone(patch);const next={...base};for(const [key,value] of Object.entries(patch))next[key]=key in next?merge(next[key],value):structuredClone(value);return next;}
export function applyOpenApiOverlay(source:unknown,overlay:unknown){if(!record(source)||!record(overlay)||typeof overlay.overlay!=="string"||!overlay.overlay.startsWith("1.0")||!Array.isArray(overlay.actions))throw new Error("A valid OpenAPI Overlay 1.0 document is required.");if(overlay.actions.length>200)throw new Error("Overlay action limit exceeded.");const output=structuredClone(source) as Json;for(const raw of overlay.actions){if(!record(raw)||typeof raw.target!=="string")throw new Error("Every Overlay action requires an exact target.");const path=segments(raw.target);let parent:Json=output;for(const part of path.slice(0,-1)){if(!record(parent[part]))throw new Error(`Overlay target not found: ${raw.target}`);parent=parent[part] as Json;}const leaf=path.at(-1)!;if(!(leaf in parent))throw new Error(`Overlay target not found: ${raw.target}`);if(raw.remove===true)delete parent[leaf];else if("update" in raw)parent[leaf]=merge(parent[leaf],raw.update);else throw new Error("Overlay action requires update or remove.");}return output;}