{
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
  "name": "block-media",
  "title": "Block media resolver",
  "description": "Local-first image and video URL resolution with extension-flexible overrides for uiception blocks.",
  "files": [
    {
      "path": "lib/block-media.ts",
      "content": "import { existsSync } from \"node:fs\"\nimport { extname, join } from \"node:path\"\n\nconst CDN_ORIGIN = \"https://uiception.com\"\n\n/** Most-used web image formats, in popularity order for alternate lookup. */\nexport const IMAGE_EXTENSIONS = [\n  \".jpg\",\n  \".jpeg\",\n  \".png\",\n  \".webp\",\n  \".avif\",\n  \".gif\",\n  \".svg\",\n] as const\n\n/** Most-used web video formats, in popularity order for alternate lookup. */\nexport const VIDEO_EXTENSIONS = [\".mp4\", \".webm\", \".mov\", \".m4v\", \".mkv\"] as const\n\nfunction basenameWithoutExt(filename: string): string {\n  const ext = extname(filename)\n  return ext ? filename.slice(0, -ext.length) : filename\n}\n\n/**\n * Finds a local file matching the canonical slot name. Exact filename wins;\n * otherwise tries the same basename with each allowed extension in order.\n */\nexport function resolveLocalMediaFilename(\n  dir: string,\n  canonicalFilename: string,\n  allowedExtensions: readonly string[],\n): string | null {\n  const exactPath = join(dir, canonicalFilename)\n  if (existsSync(exactPath)) return canonicalFilename\n\n  const base = basenameWithoutExt(canonicalFilename)\n  for (const ext of allowedExtensions) {\n    const candidate = `${base}${ext}`\n    if (candidate !== canonicalFilename && existsSync(join(dir, candidate))) {\n      return candidate\n    }\n  }\n\n  return null\n}\n\nfunction resolveCollectionMediaUrl(\n  kind: \"images\" | \"videos\",\n  collection: \"blocks\" | \"templates\",\n  id: string,\n  filename: string,\n  allowedExtensions: readonly string[],\n  origin: string,\n): string {\n  const dir = join(process.cwd(), \"public\", kind, collection, id)\n  const resolved = resolveLocalMediaFilename(dir, filename, allowedExtensions)\n  const relPath = `${kind}/${collection}/${id}/${resolved ?? filename}`\n  return resolved ? `/${relPath}` : `${origin}/${relPath}`\n}\n\nexport function createBlockImage(blockId: string, origin = CDN_ORIGIN) {\n  return (filename: string) =>\n    resolveCollectionMediaUrl(\n      \"images\",\n      \"blocks\",\n      blockId,\n      filename,\n      IMAGE_EXTENSIONS,\n      origin,\n    )\n}\n\nexport function createBlockVideo(blockId: string, origin = CDN_ORIGIN) {\n  return (filename: string) =>\n    resolveCollectionMediaUrl(\n      \"videos\",\n      \"blocks\",\n      blockId,\n      filename,\n      VIDEO_EXTENSIONS,\n      origin,\n    )\n}\n\nexport function createTemplateImage(templateId: string, origin = CDN_ORIGIN) {\n  return (filename: string) =>\n    resolveCollectionMediaUrl(\n      \"images\",\n      \"templates\",\n      templateId,\n      filename,\n      IMAGE_EXTENSIONS,\n      origin,\n    )\n}\n\nexport function createTemplateVideo(templateId: string, origin = CDN_ORIGIN) {\n  return (filename: string) =>\n    resolveCollectionMediaUrl(\n      \"videos\",\n      \"templates\",\n      templateId,\n      filename,\n      VIDEO_EXTENSIONS,\n      origin,\n    )\n}\n",
      "type": "registry:lib",
      "target": "lib/block-media.ts"
    }
  ],
  "type": "registry:lib"
}