{"_id":"@api-buddy/firebase-utils","_rev":"2-1677c4b747337a94bf6740c89fe5f664","name":"@api-buddy/firebase-utils","dist-tags":{"latest":"1.0.0"},"versions":{"0.1.0":{"name":"@api-buddy/firebase-utils","version":"0.1.0","keywords":["api-buddy","firebase","utilities"],"author":{"name":"API Buddy Team"},"license":"MIT","_id":"@api-buddy/firebase-utils@0.1.0","maintainers":[{"name":"iamtomhanks","email":"brechanson@gmail.com"}],"homepage":"https://github.com/api-buddy/api-buddy/tree/main#readme","bugs":{"url":"https://github.com/api-buddy/api-buddy/issues"},"dist":{"shasum":"ad64383b69ea93cfbef1231b35a0be2361d53356","tarball":"https://registry.npmjs.org/@api-buddy/firebase-utils/-/firebase-utils-0.1.0.tgz","fileCount":37,"integrity":"sha512-84x6AVQqNZNH/nVElvLiVvQY4dHPL/Q5BwsTgsyMaHZYYzeo69vyxGFzatLyrtoLjQJijppdw+cnCm9AJKMNjA==","signatures":[{"sig":"MEUCIDx3ztcGfY5+879xor3Njcs2i3pk8C2vZh00Q6eOLVwcAiEAzJtOpONFlyt+sofctRlJ3pZ0BiRXu2ea0ZrCr3eHmtk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2847508},"main":"dist/index.js","type":"module","_from":"file:api-buddy-firebase-utils-0.1.0.tgz","types":"dist/index.d.ts","module":"dist/index.mjs","engines":{"node":">=16.0.0"},"scripts":{"dev":"tsup --watch","lint":"eslint src --ext .ts,.tsx","test":"jest","build":"tsup","clean":"rimraf dist","format":"prettier --write \"src/**/*.{ts,tsx}\"","prebuild":"pnpm run clean && 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'));\"","postbuild":"pnpm run build:types","test:watch":"pnpm test --watch","type-check":"tsc --noEmit","build:types":"tsc --emitDeclarationOnly --declaration --declarationMap","test:coverage":"pnpm test --coverage"},"_npmUser":{"name":"iamtomhanks","actor":{"name":"iamtomhanks","type":"user","email":"brechanson@gmail.com"},"email":"brechanson@gmail.com"},"_resolved":"/private/var/folders/w3/00m0j5k95zjfx4vwz3csj_vc0000gn/T/d4d9ae1a600f343d3785b2b01a2cd258/api-buddy-firebase-utils-0.1.0.tgz","_integrity":"sha512-84x6AVQqNZNH/nVElvLiVvQY4dHPL/Q5BwsTgsyMaHZYYzeo69vyxGFzatLyrtoLjQJijppdw+cnCm9AJKMNjA==","repository":{"url":"git+https://github.com/api-buddy/api-buddy.git#main","type":"git"},"_npmVersion":"9.8.1","description":"Shared Firebase utilities for API Buddy plugins","directories":{},"_nodeVersion":"18.18.0","dependencies":{"zod":"^3.22.4","firebase":"^10.11.1","firebase-admin":"^12.1.0","@api-buddy/types":"3.0.0","@api-buddy/tsup-config":"2.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","tsup":"^8.5.0","eslint":"^8.55.0","rimraf":"^5.0.5","vitest":"^1.0.0","ts-jest":"^29.1.2","prettier":"^3.2.5","typescript":"^5.3.3","@types/jest":"^29.5.12","@types/node":"^20.11.28","@api-buddy/tsup-config":"2.0.0","eslint-config-prettier":"^9.1.0","eslint-plugin-prettier":"^5.1.3","@typescript-eslint/parser":"^7.3.1","@typescript-eslint/eslint-plugin":"^7.3.1"},"peerDependencies":{"typescript":">=5.0.0"},"_npmOperationalInternal":{"tmp":"tmp/firebase-utils_0.1.0_1751333422489_0.3570326524346519","host":"s3://npm-registry-packages-npm-production"}},"1.0.0":{"name":"@api-buddy/firebase-utils","version":"1.0.0","description":"Shared Firebase utilities for API Buddy plugins","type":"module","main":"dist/index.js","module":"dist/index.mjs","types":"dist/index.d.ts","keywords":["api-buddy","firebase","utilities"],"author":{"name":"API Buddy Team"},"license":"MIT","repository":{"type":"git","url":"git+https://github.com/api-buddy/api-buddy.git#main"},"dependencies":{"firebase":"^10.11.1","firebase-admin":"^12.1.0","zod":"^3.22.4","@api-buddy/types":"4.0.0","@api-buddy/tsup-config":"3.0.0"},"peerDependencies":{"typescript":">=5.0.0"},"devDependencies":{"vitest":"^1.0.0","@types/jest":"^29.5.12","@types/node":"^20.11.28","@typescript-eslint/eslint-plugin":"^7.3.1","@typescript-eslint/parser":"^7.3.1","eslint":"^8.55.0","eslint-config-prettier":"^9.1.0","eslint-plugin-prettier":"^5.1.3","jest":"^29.7.0","prettier":"^3.2.5","ts-jest":"^29.1.2","typescript":"^5.3.3","rimraf":"^5.0.5","tsup":"^8.5.0","@api-buddy/tsup-config":"3.0.0"},"engines":{"node":">=16.0.0"},"publishConfig":{"access":"public"},"scripts":{"clean":"rimraf dist","build":"tsup","build:types":"tsc --emitDeclarationOnly --declaration --declarationMap","prebuild":"pnpm run clean && 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'));\"","postbuild":"pnpm run build:types","dev":"tsup --watch","test":"jest","test:watch":"pnpm test --watch","test:coverage":"pnpm test --coverage","lint":"eslint src --ext .ts,.tsx","type-check":"tsc --noEmit","format":"prettier --write \"src/**/*.{ts,tsx}\""},"bugs":{"url":"https://github.com/api-buddy/api-buddy/issues"},"homepage":"https://github.com/api-buddy/api-buddy/tree/main#readme","_id":"@api-buddy/firebase-utils@1.0.0","_integrity":"sha512-vjsgB3HPrPxUzZB/VkXNTam6NcLZoiTOdGex61qou80aGuEYYjxZvSEqJtBjK011JKsjPxO/OUrjcVlEzsUBwQ==","_resolved":"/private/var/folders/w3/00m0j5k95zjfx4vwz3csj_vc0000gn/T/5ad23fd512cc9cc2aa8c873d8a012f32/api-buddy-firebase-utils-1.0.0.tgz","_from":"file:api-buddy-firebase-utils-1.0.0.tgz","_nodeVersion":"18.18.0","_npmVersion":"9.8.1","dist":{"integrity":"sha512-vjsgB3HPrPxUzZB/VkXNTam6NcLZoiTOdGex61qou80aGuEYYjxZvSEqJtBjK011JKsjPxO/OUrjcVlEzsUBwQ==","shasum":"766b160d221e53404a24d9fb209af5bee05fac7e","tarball":"https://registry.npmjs.org/@api-buddy/firebase-utils/-/firebase-utils-1.0.0.tgz","fileCount":8,"unpackedSize":2827335,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIFnubq0UG93sClLcXySRPdMwSHniG3bt3NLhC9YriqgvAiEA1gJO5dAemcCDQyQTet4Q6fL+1YbJhvtLMnMTVwuhxIA="}]},"_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/firebase-utils_1.0.0_1751386913760_0.7578588339411301"},"_hasShrinkwrap":false}},"time":{"created":"2025-07-01T01:30:22.375Z","modified":"2025-07-01T16:21:54.495Z","0.1.0":"2025-07-01T01:30:22.667Z","1.0.0":"2025-07-01T16:21:53.970Z"},"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#readme","keywords":["api-buddy","firebase","utilities"],"repository":{"type":"git","url":"git+https://github.com/api-buddy/api-buddy.git#main"},"description":"Shared Firebase utilities for API Buddy plugins","maintainers":[{"name":"iamtomhanks","email":"brechanson@gmail.com"}],"readme":"# @api-buddy/firebase-utils\n\nShared Firebase utilities for API Buddy plugins, providing consistent Firebase initialization, emulator support, and error handling.\n\n## Features\n\n- 🔥 **Firebase Admin & Client Initialization** - Simple and consistent initialization of Firebase Admin and Client SDKs\n- 🧪 **Emulator Support** - Built-in support for Firebase emulators with automatic configuration\n- 🛡️ **Type Safety** - Full TypeScript support with comprehensive type definitions\n- 🚦 **Error Handling** - Consistent error handling with custom error types and utilities\n- 🔍 **Validation** - Runtime validation for Firebase configurations\n- 🔌 **Modular** - Import only what you need to keep your bundle size small\n\n## Installation\n\n```bash\n# Using pnpm (recommended)\npnpm add @api-buddy/firebase-utils firebase firebase-admin\n\n# Using npm\nnpm install @api-buddy/firebase-utils firebase firebase-admin\n\n# Using yarn\nyarn add @api-buddy/firebase-utils firebase firebase-admin\n```\n\n## Usage\n\n### Basic Initialization\n\n```typescript\nimport {\n  initializeFirebaseAdmin,\n  initializeFirebaseClient,\n  validateFirebaseConfig,\n} from '@api-buddy/firebase-utils';\n\n// Define your Firebase configuration\nconst config = {\n  projectId: 'your-project-id',\n  useEmulators: process.env.NODE_ENV === 'development',\n  emulatorHosts: {\n    auth: 'localhost:9099',\n    firestore: 'localhost:8080',\n    // ... other emulator hosts\n  },\n  clientConfig: {\n    apiKey: 'your-api-key',\n    authDomain: 'your-project-id.firebaseapp.com',\n    projectId: 'your-project-id',\n    // ... other Firebase config\n  },\n};\n\n// Validate configuration\nconst validatedConfig = validateFirebaseConfig(config);\n\n// Initialize Firebase Admin\nconst { adminApp, adminAuth, firestore } = await initializeFirebaseAdmin(validatedConfig);\n\n// Initialize Firebase Client (browser)\nconst { app, auth, firestore: clientFirestore } = await initializeFirebaseClient(validatedConfig);\n```\n\n### Error Handling\n\n```typescript\nimport { ERROR_CODES, isFirebaseUtilsError } from '@api-buddy/firebase-utils';\n\ntry {\n  // Your Firebase operations\n} catch (error) {\n  if (isFirebaseUtilsError(error)) {\n    console.error(`Firebase error (${error.code}):`, error.message);\n    \n    if (error.code === ERROR_CODES.ADMIN_INIT_FAILED) {\n      // Handle specific error\n    }\n  } else {\n    console.error('Unexpected error:', error);\n  }\n}\n```\n\n### Emulator Configuration\n\n```typescript\nimport { getDefaultEmulatorHosts } from '@api-buddy/firebase-utils';\n\n// Get default emulator hosts\nconst emulatorHosts = getDefaultEmulatorHosts();\n// {\n//   auth: 'localhost:9099',\n//   firestore: 'localhost:8080',\n//   database: 'localhost:9000',\n//   storage: 'localhost:9199',\n//   functions: 'localhost:5001'\n// }\n\n// Use with your config\nconst config = {\n  projectId: 'your-project-id',\n  useEmulators: true,\n  emulatorHosts: {\n    ...emulatorHosts,\n    // Override specific hosts if needed\n    auth: 'localhost:9999',\n  },\n};\n```\n\n## API Reference\n\n### Functions\n\n#### `initializeFirebaseAdmin(config: FirebaseUtilsConfig): Promise<FirebaseAdminInstances>`\n\nInitializes the Firebase Admin SDK with the provided configuration.\n\n#### `initializeFirebaseClient(config: FirebaseUtilsConfig): Promise<FirebaseClientInstances>`\n\nInitializes the Firebase Client SDK with the provided configuration.\n\n#### `validateFirebaseConfig(config: unknown): FirebaseUtilsConfig`\n\nValidates the Firebase configuration object against the expected schema.\n\n#### `getDefaultEmulatorHosts(): Record<string, string>`\n\nReturns the default emulator host configuration.\n\n### Error Handling\n\n#### `FirebaseUtilsError`\n\nCustom error class for Firebase-related errors.\n\n#### `ERROR_CODES`\n\nEnum of possible error codes.\n\n#### `isFirebaseUtilsError(error: unknown): error is FirebaseUtilsError`\n\nType guard to check if an error is a FirebaseUtilsError.\n\n## License\n\nMIT\n","readmeFilename":"README.md"}