{"_id":"@api-buddy/cloudinary","_rev":"6-5aec531f64a51cd2ac6683cfac3383b0","name":"@api-buddy/cloudinary","dist-tags":{"latest":"3.0.0"},"versions":{"0.1.1":{"name":"@api-buddy/cloudinary","version":"0.1.1","keywords":["cloudinary","image","video","upload","optimization","transformation","nextjs","react","api"],"author":{"name":"API Buddy Team"},"license":"MIT","_id":"@api-buddy/cloudinary@0.1.1","maintainers":[{"name":"iamtomhanks","email":"brechanson@gmail.com"}],"homepage":"https://github.com/api-buddy/api-buddy/tree/main/packages/cloudinary#readme","bugs":{"url":"https://github.com/api-buddy/api-buddy/issues"},"bin":{"api-buddy-cloudinary":"cli.cjs"},"dist":{"shasum":"7b5055cab9c5e5ed7af2fe9a40002d7bb6e1e7e3","tarball":"https://registry.npmjs.org/@api-buddy/cloudinary/-/cloudinary-0.1.1.tgz","fileCount":18,"integrity":"sha512-IMDGE/GRr2EeX2MRUqvmWZpft18rdNIcPQ2M3HGUwiTEjplMVJ38m+cLgDw4AZOdY/UeTER6kTPQrsybqTmVnQ==","signatures":[{"sig":"MEUCIQDWodQxfb0C7+ixOcySTgOARZ9QWrVohmPvfcPZWhwR0wIgNgCyZk9pOVKJPG3AiOcX4UpRvzeknXT6muJxPTNhKg0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":222112},"main":"dist/index.js","types":"dist/index.d.ts","gitHead":"8b500e7d4996fe7d7b7147bd939e9a4468b3099e","scripts":{"dev":"tsup src/index.ts --format esm,cjs --dts --watch --external @cloudinary/url-builder,@cloudinary/react --tsconfig tsconfig.build.json","build":"tsup src/index.ts --format esm,cjs --dts --external @cloudinary/url-builder,@cloudinary/react --tsconfig tsconfig.build.json","clean":"rm -rf dist","prepublishOnly":"npm run build"},"_npmUser":{"name":"iamtomhanks","email":"brechanson@gmail.com"},"repository":{"url":"git+https://github.com/api-buddy/api-buddy.git#main","type":"git"},"_npmVersion":"9.8.1","description":"API Buddy integration for Cloudinary - Cloud-based image and video management","directories":{},"_nodeVersion":"18.18.0","dependencies":{"cloudinary":"^1.40.0","@api-buddy/core":"^0.1.0"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","typescript":"^5.0.0","@types/node":"^20.0.0","@types/react":"^18.0.0","@types/react-dom":"^18.0.0"},"peerDependencies":{"next":">=13.0.0","react":">=18.0.0","@cloudinary/react":"^1.0.0","@cloudinary/url-builder":"^0.2.0-beta"},"_npmOperationalInternal":{"tmp":"tmp/cloudinary_0.1.1_1749437077690_0.8789701004401831","host":"s3://npm-registry-packages-npm-production"}},"0.4.107":{"name":"@api-buddy/cloudinary","version":"0.4.107","keywords":["cloudinary","image","video","upload","optimization","transformation","nextjs","react","api"],"author":{"name":"API Buddy Team"},"license":"MIT","_id":"@api-buddy/cloudinary@0.4.107","maintainers":[{"name":"iamtomhanks","email":"brechanson@gmail.com"}],"homepage":"https://github.com/api-buddy/api-buddy/tree/main/packages/cloudinary#readme","bugs":{"url":"https://github.com/api-buddy/api-buddy/issues"},"bin":{"api-buddy-cloudinary":"cli.cjs"},"dist":{"shasum":"43b448f28369ccdc0e08f4830e9e54e98d2dc3db","tarball":"https://registry.npmjs.org/@api-buddy/cloudinary/-/cloudinary-0.4.107.tgz","fileCount":39,"integrity":"sha512-FPBiBGHRWPCUavWHYUjKoXXtIoCyREQNkSZ1HMvWskqpxmueShiJJcFQRk8Ja8VtKsf9Bh8Wy9Ez46MqwOpVnw==","signatures":[{"sig":"MEYCIQCR6xymAUI5LVCfZsWTyLpH0Fg0MBx3QuU5WlAZoOr5+gIhAPB+otUOoCjCHSzxro6300XvN4k6Gh+gfRCwHncDJXKR","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":292446},"main":"dist/index.js","types":"dist/index.d.ts","gitHead":"ce0089122abaa9fcfc04053fc31cd6afd64b01f7","scripts":{"dev":"tsup src/index.ts --format esm,cjs --dts --watch --external @cloudinary/url-builder,@cloudinary/react --tsconfig tsconfig.build.json","build":"tsup src/index.ts --format esm,cjs --dts --external @cloudinary/url-builder,@cloudinary/react --tsconfig tsconfig.build.json","clean":"rm -rf dist","prepublishOnly":"npm run build"},"_npmUser":{"name":"iamtomhanks","email":"brechanson@gmail.com"},"repository":{"url":"git+https://github.com/api-buddy/api-buddy.git#main","type":"git"},"_npmVersion":"9.8.1","description":"API Buddy integration for Cloudinary - Cloud-based image and video management","directories":{},"_nodeVersion":"18.18.0","dependencies":{"cloudinary":"^1.40.0","@api-buddy/core":"^0.4.107"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","typescript":"^5.0.0","@types/node":"^20.0.0","@types/react":"^18.0.0","@types/react-dom":"^18.0.0"},"peerDependencies":{"next":">=13.0.0","react":">=18.0.0","@cloudinary/react":"^1.0.0","@cloudinary/url-builder":"^0.2.0-beta"},"_npmOperationalInternal":{"tmp":"tmp/cloudinary_0.4.107_1749659021469_0.524381249962554","host":"s3://npm-registry-packages-npm-production"}},"0.4.108":{"name":"@api-buddy/cloudinary","version":"0.4.108","keywords":["cloudinary","image","video","upload","optimization","transformation","nextjs","react","api"],"author":{"name":"API Buddy Team"},"license":"MIT","_id":"@api-buddy/cloudinary@0.4.108","maintainers":[{"name":"iamtomhanks","email":"brechanson@gmail.com"}],"homepage":"https://github.com/api-buddy/api-buddy/tree/main/packages/cloudinary#readme","bugs":{"url":"https://github.com/api-buddy/api-buddy/issues"},"bin":{"api-buddy-cloudinary":"cli.cjs"},"dist":{"shasum":"af8e7cd21bb578cbc6adddcb86304bae4cf72a82","tarball":"https://registry.npmjs.org/@api-buddy/cloudinary/-/cloudinary-0.4.108.tgz","fileCount":39,"integrity":"sha512-RReUcRcmtT0HUNS5ZxLXAjo4q9PBNEczqzLCs495F82yyaRivOjYzP4764K1uhN1doqbyOlHxL36EJp53bHgxw==","signatures":[{"sig":"MEYCIQDEVoE9UoCEhTC4pa+fxB1/1QgOc1zds+OUohBEI8j2ugIhAKyXduwOoWWaOQmVCBqkPgEG9DvBhNAQtcQPOZ8/85NM","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":292446},"main":"dist/index.js","types":"dist/index.d.ts","gitHead":"ce0089122abaa9fcfc04053fc31cd6afd64b01f7","scripts":{"dev":"tsup src/index.ts --format esm,cjs --dts --watch --external @cloudinary/url-builder,@cloudinary/react --tsconfig tsconfig.build.json","build":"tsup src/index.ts --format esm,cjs --dts --external @cloudinary/url-builder,@cloudinary/react --tsconfig tsconfig.build.json","clean":"rm -rf dist","prepublishOnly":"npm run build"},"_npmUser":{"name":"iamtomhanks","email":"brechanson@gmail.com"},"repository":{"url":"git+https://github.com/api-buddy/api-buddy.git#main","type":"git"},"_npmVersion":"9.8.1","description":"API Buddy integration for Cloudinary - Cloud-based image and video management","directories":{},"_nodeVersion":"18.18.0","dependencies":{"cloudinary":"^1.40.0","@api-buddy/core":"^0.4.108"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","typescript":"^5.0.0","@types/node":"^20.0.0","@types/react":"^18.0.0","@types/react-dom":"^18.0.0"},"peerDependencies":{"next":">=13.0.0","react":">=18.0.0","@cloudinary/react":"^1.0.0","@cloudinary/url-builder":"^0.2.0-beta"},"_npmOperationalInternal":{"tmp":"tmp/cloudinary_0.4.108_1749659787939_0.506737270633028","host":"s3://npm-registry-packages-npm-production"}},"1.0.0":{"name":"@api-buddy/cloudinary","version":"1.0.0","keywords":["cloudinary","image","video","upload","optimization","transformation","nextjs","react","api"],"author":{"name":"API Buddy Team"},"license":"MIT","_id":"@api-buddy/cloudinary@1.0.0","maintainers":[{"name":"iamtomhanks","email":"brechanson@gmail.com"}],"homepage":"https://github.com/api-buddy/api-buddy/tree/main/packages/cloudinary#readme","bugs":{"url":"https://github.com/api-buddy/api-buddy/issues"},"bin":{"api-buddy-cloudinary":"cli.cjs"},"dist":{"shasum":"d9ddacdd68c8ea0d023db064ae9e6ee2209ea3b0","tarball":"https://registry.npmjs.org/@api-buddy/cloudinary/-/cloudinary-1.0.0.tgz","fileCount":37,"integrity":"sha512-hZJ/IRl4vLmi3+B8IFrWw56RB1odcfGZEThkk2GtlmAY+OVlkA8XBaT5eLgjFWfypErXawENLZKLyERSF73Q0w==","signatures":[{"sig":"MEQCIGy04HFDCabpOzE9x2nfuWVvXf/U0eXie2TGRqrwDA5pAiBD/I5N0uhH0/j6nfy7DqbT6/4uHG7iAE+nC7UpS435dg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":286014},"main":"dist/index.js","_from":"file:api-buddy-cloudinary-1.0.0.tgz","types":"dist/index.d.ts","scripts":{"dev":"tsup --watch","lint":"eslint src --ext .ts,.tsx","test":"jest","build":"pnpm clean && tsup","clean":"rimraf dist","format":"prettier --write \"src/**/*.{ts,tsx}\"","prebuild":"node -e \"const { execSync } = require('child_process'); const path = require('path'); const fs = require('fs'); let root = process.cwd(); while (root !== '/' && !fs.existsSync(path.join(root, 'pnpm-workspace.yaml'))) { root = path.dirname(root); } if (root === '/') { console.error('❌ Could not find project root directory'); process.exit(1); } require(path.join(root, 'scripts/ensure-tsup-config.js'));\"","type-check":"tsc --noEmit"},"_npmUser":{"name":"iamtomhanks","email":"brechanson@gmail.com"},"_resolved":"/private/var/folders/w3/00m0j5k95zjfx4vwz3csj_vc0000gn/T/e6b36099901ccef85e067c6032098088/api-buddy-cloudinary-1.0.0.tgz","_integrity":"sha512-hZJ/IRl4vLmi3+B8IFrWw56RB1odcfGZEThkk2GtlmAY+OVlkA8XBaT5eLgjFWfypErXawENLZKLyERSF73Q0w==","repository":{"url":"git+https://github.com/api-buddy/api-buddy.git#main","type":"git"},"_npmVersion":"9.8.1","description":"API Buddy integration for Cloudinary - Cloud-based image and video management","directories":{},"_nodeVersion":"18.18.0","dependencies":{"cloudinary":"^1.40.0","@api-buddy/plugin-core":"1.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","rimraf":"^5.0.5","typescript":"^5.0.0","@types/node":"^20.0.0","@types/react":"^18.0.0","@types/react-dom":"^18.0.0","@api-buddy/tsup-config":"1.0.0"},"peerDependencies":{"next":">=13.0.0","react":">=18.0.0","@cloudinary/react":"^1.0.0","@cloudinary/url-builder":"^0.2.0-beta"},"_npmOperationalInternal":{"tmp":"tmp/cloudinary_1.0.0_1750088007807_0.0720581700066305","host":"s3://npm-registry-packages-npm-production"}},"2.0.0":{"name":"@api-buddy/cloudinary","version":"2.0.0","keywords":["cloudinary","image","video","upload","optimization","transformation","nextjs","react","api"],"author":{"name":"API Buddy Team"},"license":"MIT","_id":"@api-buddy/cloudinary@2.0.0","maintainers":[{"name":"iamtomhanks","email":"brechanson@gmail.com"}],"homepage":"https://github.com/api-buddy/api-buddy/tree/main/packages/cloudinary#readme","bugs":{"url":"https://github.com/api-buddy/api-buddy/issues"},"bin":{"api-buddy-cloudinary":"cli.cjs"},"dist":{"shasum":"2fd798802219b09f0f6ea3576e01ad5193980c1a","tarball":"https://registry.npmjs.org/@api-buddy/cloudinary/-/cloudinary-2.0.0.tgz","fileCount":37,"integrity":"sha512-LQmfucdfze5olrIYGyb6oIvb+sklA8mXYzJvoadM7zXTclqgpwSH8df+waYtQX9EOZ1dZHTKpsTWINrQsw7uoA==","signatures":[{"sig":"MEQCICx5Az7h+NdI2Rw41bM3nu9YfTpdTV3ki75jxfgBHBPNAiBfOMljT8P6qf3biFjWGz6lqT0VwiV+JhtDruBk22enXQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":286014},"main":"dist/index.js","_from":"file:api-buddy-cloudinary-2.0.0.tgz","types":"dist/index.d.ts","scripts":{"dev":"tsup --watch","lint":"eslint src --ext .ts,.tsx","test":"jest","build":"pnpm clean && tsup","clean":"rimraf dist","format":"prettier --write \"src/**/*.{ts,tsx}\"","prebuild":"node -e \"const { execSync } = require('child_process'); const path = require('path'); const fs = require('fs'); let root = process.cwd(); while (root !== '/' && !fs.existsSync(path.join(root, 'pnpm-workspace.yaml'))) { root = path.dirname(root); } if (root === '/') { console.error('❌ Could not find project root directory'); process.exit(1); } require(path.join(root, 'scripts/ensure-tsup-config.js'));\"","type-check":"tsc --noEmit"},"_npmUser":{"name":"iamtomhanks","email":"brechanson@gmail.com"},"_resolved":"/private/var/folders/w3/00m0j5k95zjfx4vwz3csj_vc0000gn/T/2606687ec0e5337392b04853956deb1b/api-buddy-cloudinary-2.0.0.tgz","_integrity":"sha512-LQmfucdfze5olrIYGyb6oIvb+sklA8mXYzJvoadM7zXTclqgpwSH8df+waYtQX9EOZ1dZHTKpsTWINrQsw7uoA==","repository":{"url":"git+https://github.com/api-buddy/api-buddy.git#main","type":"git"},"_npmVersion":"9.8.1","description":"API Buddy integration for Cloudinary - Cloud-based image and video management","directories":{},"_nodeVersion":"18.18.0","dependencies":{"cloudinary":"^1.40.0","@api-buddy/plugin-core":"2.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","rimraf":"^5.0.5","typescript":"^5.0.0","@types/node":"^20.0.0","@types/react":"^18.0.0","@types/react-dom":"^18.0.0","@api-buddy/tsup-config":"2.0.0"},"peerDependencies":{"next":">=13.0.0","react":">=18.0.0","@cloudinary/react":"^1.0.0","@cloudinary/url-builder":"^0.2.0-beta"},"_npmOperationalInternal":{"tmp":"tmp/cloudinary_2.0.0_1750103170160_0.934440093877555","host":"s3://npm-registry-packages-npm-production"}},"3.0.0":{"name":"@api-buddy/cloudinary","version":"3.0.0","description":"API Buddy integration for Cloudinary - Cloud-based image and video management","main":"dist/index.js","types":"dist/index.d.ts","peerDependencies":{"@cloudinary/url-builder":"^0.2.0-beta","@cloudinary/react":"^1.0.0","next":">=13.0.0","react":">=18.0.0"},"dependencies":{"cloudinary":"^1.40.0","@api-buddy/plugin-core":"3.0.0"},"devDependencies":{"@types/node":"^20.0.0","@types/react":"^18.0.0","@types/react-dom":"^18.0.0","tsup":"^8.0.0","typescript":"^5.0.0","rimraf":"^5.0.5","@api-buddy/tsup-config":"3.0.0"},"bin":{"api-buddy-cloudinary":"cli.cjs"},"keywords":["cloudinary","image","video","upload","optimization","transformation","nextjs","react","api"],"author":{"name":"API Buddy Team"},"license":"MIT","repository":{"type":"git","url":"git+https://github.com/api-buddy/api-buddy.git#main"},"bugs":{"url":"https://github.com/api-buddy/api-buddy/issues"},"homepage":"https://github.com/api-buddy/api-buddy/tree/main/packages/cloudinary#readme","publishConfig":{"access":"public"},"scripts":{"build":"pnpm clean && tsup","dev":"tsup --watch","clean":"rimraf dist","test":"jest","lint":"eslint src --ext .ts,.tsx","type-check":"tsc --noEmit","format":"prettier --write \"src/**/*.{ts,tsx}\"","prebuild":"node -e \"const { execSync } = require('child_process'); const path = require('path'); const fs = require('fs'); let root = process.cwd(); while (root !== '/' && !fs.existsSync(path.join(root, 'pnpm-workspace.yaml'))) { root = path.dirname(root); } if (root === '/') { console.error('❌ Could not find project root directory'); process.exit(1); } require(path.join(root, 'scripts/ensure-tsup-config.js'));\""},"_id":"@api-buddy/cloudinary@3.0.0","_integrity":"sha512-7RL8nvWFWeafp1un0kedpcclP6gp/y8GUBHDs76lRB68Uu0EM0UbEsrJFxG6b5HHw3SdIskCd6jfAiWPxiXy+A==","_resolved":"/private/var/folders/w3/00m0j5k95zjfx4vwz3csj_vc0000gn/T/e0588936a8dc50669cff422ed8f2fdc8/api-buddy-cloudinary-3.0.0.tgz","_from":"file:api-buddy-cloudinary-3.0.0.tgz","_nodeVersion":"18.18.0","_npmVersion":"9.8.1","dist":{"integrity":"sha512-7RL8nvWFWeafp1un0kedpcclP6gp/y8GUBHDs76lRB68Uu0EM0UbEsrJFxG6b5HHw3SdIskCd6jfAiWPxiXy+A==","shasum":"654d21ff401af0ff5189fb21142a6d25897c8558","tarball":"https://registry.npmjs.org/@api-buddy/cloudinary/-/cloudinary-3.0.0.tgz","fileCount":37,"unpackedSize":286055,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIDzbyPphldyA1kgX5/XFIMU8k+7RXGNAENQGTEv8zTm7AiAwmijsAgHY1kKfkD04g9M2RXW+QmQU7ChvjCQ+0ZBpnA=="}]},"_npmUser":{"name":"iamtomhanks","email":"brechanson@gmail.com","actor":{"name":"iamtomhanks","email":"brechanson@gmail.com","type":"user"}},"directories":{},"maintainers":[{"name":"iamtomhanks","email":"brechanson@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/cloudinary_3.0.0_1751386883336_0.6529225700606363"},"_hasShrinkwrap":false}},"time":{"created":"2025-06-09T02:44:37.589Z","modified":"2025-07-01T16:21:23.733Z","0.1.1":"2025-06-09T02:44:37.906Z","0.4.107":"2025-06-11T16:23:41.700Z","0.4.108":"2025-06-11T16:36:28.133Z","1.0.0":"2025-06-16T15:33:28.009Z","2.0.0":"2025-06-16T19:46:10.376Z","3.0.0":"2025-07-01T16:21:23.530Z"},"bugs":{"url":"https://github.com/api-buddy/api-buddy/issues"},"author":{"name":"API Buddy Team"},"license":"MIT","homepage":"https://github.com/api-buddy/api-buddy/tree/main/packages/cloudinary#readme","keywords":["cloudinary","image","video","upload","optimization","transformation","nextjs","react","api"],"repository":{"type":"git","url":"git+https://github.com/api-buddy/api-buddy.git#main"},"description":"API Buddy integration for Cloudinary - Cloud-based image and video management","maintainers":[{"name":"iamtomhanks","email":"brechanson@gmail.com"}],"readme":"# @api-buddy/cloudinary\r\n\r\n[![npm version](https://img.shields.io/npm/v/@api-buddy/cloudinary.svg)](https://www.npmjs.com/package/@api-buddy/cloudinary)\r\n[![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](https://opensource.org/licenses/MIT)\r\n\r\nA comprehensive Cloudinary integration for Next.js applications, providing a simple and type-safe way to upload, transform, and deliver images and videos.\r\n\r\n## Features\r\n\r\n- 🚀 **Easy Setup**: Get started quickly with a few simple steps\r\n- 🔒 **Type-Safe**: Full TypeScript support for all Cloudinary options and responses\r\n- ⚡ **Performance Optimized**: Automatic image optimization and responsive images\r\n- 🎣 **React Hooks**: Custom hooks for easy file uploads and media management\r\n- 🖼️ **Components**: Pre-built React components for images and videos\r\n- 🛠 **CLI Tool**: Quick project setup with the included CLI\r\n- 🔄 **Server & Client Support**: Works with both server components and client components\r\n- 📱 **Responsive Images**: Automatic srcset generation for responsive images\r\n- 🎥 **Video Support**: Upload, transform, and deliver videos with ease\r\n\r\n## Installation\r\n\r\n```bash\r\n# Using npm\r\nnpm install @api-buddy/cloudinary cloudinary\r\n\r\n# Using yarn\r\nyarn add @api-buddy/cloudinary cloudinary\r\n\r\n# Using pnpm\r\npnpm add @api-buddy/cloudinary cloudinary\r\n```\r\n\r\nIf you're using TypeScript, you'll also want to install the Cloudinary types:\r\n\r\n```bash\r\nnpm install --save-dev @types/cloudinary\r\n```\r\n\r\n## Quick Start\r\n\r\n### 1. Set Up Environment Variables\r\n\r\nCreate a `.env.local` file in your project root and add your Cloudinary credentials:\r\n\r\n```env\r\nNEXT_PUBLIC_CLOUDINARY_CLOUD_NAME=your_cloud_name\r\nNEXT_PUBLIC_CLOUDINARY_API_KEY=your_api_key\r\nCLOUDINARY_API_SECRET=your_api_secret\r\nNEXT_PUBLIC_CLOUDINARY_UPLOAD_PRESET=your_upload_preset\r\n```\r\n\r\n### 2. Set Up the Cloudinary Provider\r\n\r\nWrap your application with the `CloudinaryProvider` in your root layout:\r\n\r\n```tsx\r\n// app/layout.tsx\r\n'use client';\r\n\r\nimport { CloudinaryProvider } from '@api-buddy/cloudinary';\r\n\r\nexport default function RootLayout({\r\n  children,\r\n}: {\r\n  children: React.ReactNode;\r\n}) {\r\n  return (\r\n    <html lang=\"en\">\r\n      <body>\r\n        <CloudinaryProvider \r\n          config={{\r\n            // Optional: Configure default settings here\r\n            cloudName: process.env.NEXT_PUBLIC_CLOUDINARY_CLOUD_NAME,\r\n            apiKey: process.env.NEXT_PUBLIC_CLOUDINARY_API_KEY,\r\n            apiSecret: process.env.CLOUDINARY_API_SECRET,\r\n            uploadPreset: process.env.NEXT_PUBLIC_CLOUDINARY_UPLOAD_PRESET,\r\n          }}\r\n        >\r\n          {children}\r\n        </CloudinaryProvider>\r\n      </body>\r\n    </html>\r\n  );\r\n}\r\n```\r\n\r\n### 3. Upload Files\r\n\r\nCreate an API route to handle file uploads:\r\n\r\n```typescript\r\n// app/api/upload/route.ts\r\nimport { NextResponse } from 'next/server';\r\nimport { upload } from '@api-buddy/cloudinary';\r\n\r\nexport async function POST(request: Request) {\r\n  try {\r\n    const formData = await request.formData();\r\n    const file = formData.get('file') as File;\r\n    \r\n    if (!file) {\r\n      return NextResponse.json(\r\n        { success: false, error: 'No file provided' },\r\n        { status: 400 }\r\n      );\r\n    }\r\n\r\n    // Convert the file to a buffer\r\n    const buffer = Buffer.from(await file.arrayBuffer());\r\n    \r\n    // Upload to Cloudinary\r\n    const result = await upload(buffer, {\r\n      folder: 'uploads',\r\n      resourceType: 'auto',\r\n      public_id: file.name.replace(/\\.[^/.]+$/, ''), // Remove file extension\r\n      filename_override: file.name,\r\n      context: {\r\n        filename: file.name,\r\n        format: file.type,\r\n        size: file.size,\r\n      },\r\n    });\r\n\r\n    return NextResponse.json({ success: true, data: result });\r\n  } catch (error) {\r\n    console.error('Upload error:', error);\r\n    return NextResponse.json(\r\n      { success: false, error: 'Failed to upload file' },\r\n      { status: 500 }\r\n    );\r\n  }\r\n}\r\n```\r\n\r\n### 4. Use the useCloudinaryUpload Hook\r\n\r\n```tsx\r\n'use client';\r\n\r\nimport { useCloudinaryUpload } from '@api-buddy/cloudinary';\r\n\r\nexport default function UploadForm() {\r\n  const { uploadFile, isUploading, progress, error } = useCloudinaryUpload({\r\n    options: {\r\n      folder: 'images',\r\n      resourceType: 'image',\r\n    },\r\n    onSuccess: (result) => {\r\n      console.log('Upload successful:', result);\r\n    },\r\n    onError: (error) => {\r\n      console.error('Upload error:', error);\r\n    },\r\n  });\r\n\r\n  const handleFileChange = async (e: React.ChangeEvent<HTMLInputElement>) => {\r\n    const file = e.target.files?.[0];\r\n    if (file) {\r\n      await uploadFile(file);\r\n    }\r\n  };\r\n\r\n  return (\r\n    <div className=\"p-6 max-w-md mx-auto bg-white rounded-xl shadow-md\">\r\n      <h2 className=\"text-xl font-semibold mb-4\">Upload an Image</h2>\r\n      \r\n      <div className=\"mb-4\">\r\n        <input\r\n          type=\"file\"\r\n          accept=\"image/*\"\r\n          onChange={handleFileChange}\r\n          disabled={isUploading}\r\n          className=\"block w-full text-sm text-gray-500\r\n            file:mr-4 file:py-2 file:px-4\r\n            file:rounded-md file:border-0\r\n            file:text-sm file:font-semibold\r\n            file:bg-blue-50 file:text-blue-700\r\n            hover:file:bg-blue-100\"\r\n        />\r\n      </div>\r\n\r\n      {isUploading && (\r\n        <div className=\"w-full bg-gray-200 rounded-full h-2.5\">\r\n          <div\r\n            className=\"bg-blue-600 h-2.5 rounded-full\"\r\n            style={{ width: `${progress}%` }}\r\n          ></div>\r\n          <p className=\"text-sm text-gray-600 mt-1\">Uploading: {progress}%</p>\r\n        </div>\r\n      )}\r\n\r\n      {error && (\r\n        <div className=\"mt-4 p-3 bg-red-100 text-red-700 rounded-md\">\r\n          Error: {error.message}\r\n        </div>\r\n      )}\r\n    </div>\r\n  );\r\n}\r\n```\r\n\r\n### 5. Display Images\r\n\r\n```tsx\r\nimport { CloudinaryImage } from '@api-buddy/cloudinary';\r\n\r\nexport default function ProfileImage({ publicId }: { publicId: string }) {\r\n  return (\r\n    <div className=\"w-32 h-32 rounded-full overflow-hidden\">\r\n      <CloudinaryImage\r\n        publicId={publicId}\r\n        alt=\"Profile image\"\r\n        width={128}\r\n        height={128}\r\n        className=\"w-full h-full object-cover\"\r\n        transformation={[\r\n          { width: 256, height: 256, crop: 'thumb', gravity: 'face' },\r\n          { radius: 'max' },\r\n        ]}\r\n      />\r\n    </div>\r\n  );\r\n}\r\n```\r\n\r\n## CLI Setup\r\n\r\nFor a quick setup, use the included CLI:\r\n\r\n```bash\r\nnpx @api-buddy/cloudinary setup\r\n```\r\n\r\nThis will:\r\n1. Install required dependencies\r\n2. Set up environment variables\r\n3. Create example components and API routes\r\n4. Configure your Next.js app to use Cloudinary\r\n\r\n## API Reference\r\n\r\n### `CloudinaryProvider`\r\n\r\nA context provider that makes the Cloudinary client available throughout your application.\r\n\r\n#### Props\r\n\r\n- `config`: Configuration object\r\n  - `cloudName`: Your Cloudinary cloud name (required)\r\n  - `apiKey`: Your Cloudinary API key (optional, defaults to `process.env.NEXT_PUBLIC_CLOUDINARY_API_KEY`)\r\n  - `apiSecret`: Your Cloudinary API secret (optional, defaults to `process.env.CLOUDINARY_API_SECRET`)\r\n  - `uploadPreset`: Your Cloudinary upload preset (optional)\r\n  - `defaultUploadOptions`: Default options for all uploads\r\n\r\n### `useCloudinary()`\r\n\r\nA hook to access the Cloudinary client from the nearest `CloudinaryProvider`.\r\n\r\n#### Returns\r\n\r\n- `client`: The Cloudinary client instance\r\n- `config`: The current Cloudinary configuration\r\n\r\n### `useCloudinaryUpload(options)`\r\n\r\nA hook for handling file uploads to Cloudinary.\r\n\r\n#### Parameters\r\n\r\n- `options`: Upload options\r\n  - `options`: Default upload options for all uploads\r\n  - `onSuccess`: Callback when an upload succeeds\r\n  - `onError`: Callback when an upload fails\r\n  - `onProgress`: Callback with upload progress (0-100)\r\n\r\n#### Returns\r\n\r\n- `uploadFile`: Function to upload a single file\r\n- `uploadFiles`: Function to upload multiple files\r\n- `isUploading`: Boolean indicating if an upload is in progress\r\n- `progress`: Current upload progress (0-100)\r\n- `error`: Error object if an upload failed\r\n- `reset`: Function to reset the hook state\r\n\r\n### `CloudinaryImage`\r\n\r\nA React component for displaying Cloudinary images with automatic optimization.\r\n\r\n#### Props\r\n\r\n- `publicId`: The public ID of the image (required)\r\n- `alt`: Alternative text for the image (required)\r\n- `width`: Width of the image\r\n- `height`: Height of the image\r\n- `className`: CSS class name\r\n- `style`: Inline styles\r\n- `loading`: Loading behavior (`lazy` or `eager`)\r\n- `transformation`: Array of Cloudinary transformations\r\n- `format`: Image format to convert to\r\n- `quality`: Image quality (1-100)\r\n- `responsive`: Whether to generate responsive images\r\n- `sizes`: Sizes attribute for responsive images\r\n- `srcSet`: Custom srcset for responsive images\r\n- `onLoad`: Callback when the image loads\r\n- `onError`: Callback when the image fails to load\r\n\r\n### `CloudinaryVideo`\r\n\r\nA React component for displaying Cloudinary videos.\r\n\r\n#### Props\r\n\r\n- `publicId`: The public ID of the video (required)\r\n- `width`: Width of the video player\r\n- `height`: Height of the video player\r\n- `className`: CSS class name\r\n- `style`: Inline styles\r\n- `autoPlay`: Whether to autoplay the video\r\n- `loop`: Whether to loop the video\r\n- `muted`: Whether to mute the video\r\n- `controls`: Whether to show video controls\r\n- `poster`: URL of the poster image\r\n- `transformation`: Array of Cloudinary transformations\r\n- `onPlay`: Callback when the video starts playing\r\n- `onPause`: Callback when the video is paused\r\n- `onEnded`: Callback when the video ends\r\n- `onError`: Callback when the video fails to load\r\n\r\n### `upload(file, options)`\r\n\r\nUpload a file to Cloudinary.\r\n\r\n#### Parameters\r\n\r\n- `file`: File to upload (Buffer, ReadStream, or base64 string)\r\n- `options`: Upload options (see [Cloudinary documentation](https://cloudinary.com/documentation/image_upload_api_reference#upload_method))\r\n\r\n#### Returns\r\n\r\nA promise that resolves to the upload result.\r\n\r\n### `deleteFile(publicId, options)`\r\n\r\nDelete a file from Cloudinary.\r\n\r\n#### Parameters\r\n\r\n- `publicId`: The public ID of the file to delete\r\n- `options`: Delete options\r\n  - `resourceType`: Type of resource (`image`, `video`, `raw`, or `auto`)\r\n  - `type`: The type of the resource\r\n  - `invalidate`: Whether to invalidate the CDN cache\r\n\r\n#### Returns\r\n\r\nA promise that resolves to the delete result.\r\n\r\n### `getUrl(publicId, options)`\r\n\r\nGenerate a URL for a Cloudinary resource.\r\n\r\n#### Parameters\r\n\r\n- `publicId`: The public ID of the resource\r\n- `options`: URL and transformation options\r\n  - `transformation`: Array of Cloudinary transformations\r\n  - `resourceType`: Type of resource (`image`, `video`, `raw`, or `auto`)\r\n  - `type`: The type of the resource\r\n  - `format`: Format to convert the resource to\r\n  - `secure`: Whether to use HTTPS\r\n  - `signUrl`: Whether to sign the URL\r\n  - `version`: The version of the resource\r\n\r\n#### Returns\r\n\r\nThe generated URL as a string.\r\n\r\n## Examples\r\n\r\n### Uploading a File\r\n\r\n```typescript\r\nimport { upload } from '@api-buddy/cloudinary';\r\n\r\n// In an API route or server component\r\nconst file = // your file buffer or stream\r\nconst result = await upload(file, {\r\n  folder: 'uploads',\r\n  resourceType: 'auto',\r\n  public_id: 'my-file',\r\n});\r\n\r\nconsole.log('File uploaded:', result.url);\r\n```\r\n\r\n### Using Transformations\r\n\r\n```typescript\r\nimport { CloudinaryImage } from '@api-buddy/cloudinary';\r\n\r\nfunction ProductImage({ publicId }: { publicId: string }) {\r\n  return (\r\n    <CloudinaryImage\r\n      publicId={publicId}\r\n      alt=\"Product image\"\r\n      width={400}\r\n      height={400}\r\n      transformation={[\r\n        { width: 800, height: 800, crop: 'fill' },\r\n        { effect: 'sharpen' },\r\n        { quality: 'auto' },\r\n      ]}\r\n    />\r\n  );\r\n}\r\n```\r\n\r\n### Responsive Images\r\n\r\n```typescript\r\nimport { CloudinaryImage } from '@api-buddy/cloudinary';\r\n\r\nfunction HeroImage({ publicId }: { publicId: string }) {\r\n  return (\r\n    <CloudinaryImage\r\n      publicId={publicId}\r\n      alt=\"Hero image\"\r\n      width={1200}\r\n      height={630}\r\n      className=\"w-full h-auto\"\r\n      responsive\r\n      sizes=\"(max-width: 768px) 100vw, 50vw\"\r\n      transformation={[\r\n        { width: 1200, height: 630, crop: 'fill' },\r\n        { quality: 'auto' },\r\n      ]}\r\n    />\r\n  );\r\n}\r\n```\r\n\r\n## Error Handling\r\n\r\nAll functions throw a `CloudinaryError` when something goes wrong. You can catch and handle these errors:\r\n\r\n```typescript\r\ntry {\r\n  await upload(file, options);\r\n} catch (error) {\r\n  if (error.name === 'CloudinaryError') {\r\n    console.error('Cloudinary error:', error.message);\r\n    // Handle specific error cases\r\n    if (error.code === 'LIMIT_FILE_SIZE') {\r\n      // Handle file size limit exceeded\r\n    } else if (error.code === 'UNAUTHORIZED') {\r\n      // Handle authentication error\r\n    } else {\r\n      // Handle other errors\r\n    }\r\n  } else {\r\n    // Handle non-Cloudinary errors\r\n    console.error('Unexpected error:', error);\r\n  }\r\n}\r\n```\r\n\r\n## Contributing\r\n\r\nContributions are welcome! Please open an issue or submit a pull request.\r\n\r\n## License\r\n\r\nMIT\r\n\r\n## Acknowledgments\r\n\r\n- [Cloudinary](https://cloudinary.com/) - Cloud-based image and video management\r\n- [@cloudinary/url-builder](https://www.npmjs.com/package/@cloudinary/url-builder) - Official Cloudinary URL builder\r\n- [@cloudinary/react](https://www.npmjs.com/package/@cloudinary/react) - Official Cloudinary React components\r\n","readmeFilename":"README.md"}