{"_id":"@el_saintt/adapter-express","name":"@el_saintt/adapter-express","dist-tags":{"latest":"1.0.0"},"versions":{"1.0.0":{"name":"@el_saintt/adapter-express","version":"1.0.0","description":"Express.js adapter for @el_saintt/core - Middleware and route handlers","main":"./dist/index.js","module":"./dist/index.mjs","types":"./dist/index.d.ts","exports":{".":{"require":"./dist/index.js","import":"./dist/index.mjs","types":"./dist/index.d.ts"}},"keywords":["portfolio","express","adapter","middleware"],"author":"","license":"MIT","repository":{"type":"git","url":"git+https://github.com/stElmitchay/crispy-goggles.git"},"bugs":{"url":"https://github.com/stElmitchay/crispy-goggles/issues"},"homepage":"https://github.com/stElmitchay/crispy-goggles#readme","dependencies":{"@el_saintt/core":"1.0.0"},"peerDependencies":{"express":"^4.18.0 || ^5.0.0"},"devDependencies":{"@types/express":"^4.17.21","@types/node":"^20.11.0","@types/supertest":"^6.0.3","express":"^4.18.2","supertest":"^7.1.4","tsup":"^8.0.1","typescript":"^5.3.3","vitest":"^1.2.0"},"publishConfig":{"access":"public"},"scripts":{"build":"tsup src/index.ts --format cjs,esm --dts","dev":"tsup src/index.ts --format cjs,esm --dts --watch","test":"vitest run","test:watch":"vitest"},"gitHead":"223363c33555a40217d8b6530d225c417c63f32e","_id":"@el_saintt/adapter-express@1.0.0","_integrity":"sha512-fCSgzSj1mipPZIoL/l7AZtDa9v1qXhO6KlIdbA2XWEHPjgxp8VsgKaEBzjmWHhxjxS2EJWW3xeV8JlNNtlhabQ==","_resolved":"/private/var/folders/60/fd86h0px5fg_3k_5k1s7h1dc0000gp/T/bff59520526ad8f2e20b54d6f8f08810/el_saintt-adapter-express-1.0.0.tgz","_from":"file:el_saintt-adapter-express-1.0.0.tgz","_nodeVersion":"21.7.3","_npmVersion":"10.5.0","dist":{"integrity":"sha512-fCSgzSj1mipPZIoL/l7AZtDa9v1qXhO6KlIdbA2XWEHPjgxp8VsgKaEBzjmWHhxjxS2EJWW3xeV8JlNNtlhabQ==","shasum":"80d73d71f540ab9424cfc5ab6c96d3508dd99ae6","tarball":"https://registry.npmjs.org/@el_saintt/adapter-express/-/adapter-express-1.0.0.tgz","fileCount":7,"unpackedSize":33200,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIE4EpOOPoX/2bjvJ9cGANw5TaT4Pa/DeaMxmePlF74pSAiBPDxgmdR4fX3+7552zRU+aaYz0ch98dXbN1DKyjQuY0g=="}]},"_npmUser":{"name":"el_saintt","email":"elmitchay@gmail.com"},"directories":{},"maintainers":[{"name":"el_saintt","email":"elmitchay@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/adapter-express_1.0.0_1760111355612_0.4058916401093149"},"_hasShrinkwrap":false}},"time":{"created":"2025-10-10T15:49:15.496Z","1.0.0":"2025-10-10T15:49:15.798Z","modified":"2025-10-10T15:49:16.083Z"},"maintainers":[{"name":"el_saintt","email":"elmitchay@gmail.com"}],"description":"Express.js adapter for @el_saintt/core - Middleware and route handlers","homepage":"https://github.com/stElmitchay/crispy-goggles#readme","keywords":["portfolio","express","adapter","middleware"],"repository":{"type":"git","url":"git+https://github.com/stElmitchay/crispy-goggles.git"},"bugs":{"url":"https://github.com/stElmitchay/crispy-goggles/issues"},"license":"MIT","readme":"# @el_saintt/adapter-express\n\nExpress.js adapter for Portfolio API - Provides middleware and route handlers for easy Express integration.\n\n## Installation\n\n```bash\nnpm install @el_saintt/adapter-express @el_saintt/core express\n```\n\n## Quick Start\n\n```typescript\nimport express from 'express';\nimport { PortfolioClient } from '@el_saintt/core';\nimport { githubPlugin } from '@el_saintt/plugin-github';\nimport { createPortfolioRouter, portfolioErrorHandler } from '@el_saintt/adapter-express';\n\n// Initialize portfolio client\nconst client = new PortfolioClient({\n  cache: {\n    provider: 'memory',\n    defaultTTL: 3600,\n  },\n  services: {\n    github: {\n      enabled: true,\n      credentials: {\n        username: 'your-username',\n      },\n    },\n  },\n});\n\n// Register plugins\nclient.use(githubPlugin);\n\n// Create Express app\nconst app = express();\n\n// Mount portfolio routes\nconst portfolioRouter = createPortfolioRouter({ client });\napp.use('/api/portfolio', portfolioRouter);\n\n// Error handling\napp.use(portfolioErrorHandler());\n\n// Start server\napp.listen(3000, () => {\n  console.log('Server running on http://localhost:3000');\n});\n```\n\n## API Endpoints\n\nThe adapter automatically creates the following REST API endpoints:\n\n### Services\n\n**GET /api/portfolio/services**\n- List all configured services\n- Response: `{ success: true, data: { services: [...] } }`\n\n**GET /api/portfolio/services/:service**\n- Get information about a specific service\n- Example: `/api/portfolio/services/github`\n- Response: Service details (name, version, description)\n\n**GET /api/portfolio/services/:service/health**\n- Check health of a specific service\n- Example: `/api/portfolio/services/github/health`\n- Response: Health check status\n\n### Content\n\n**GET /api/portfolio/content**\n- Get all content from all services\n- Query params:\n  - `limit` - Number of items (default: 10)\n  - `offset` - Pagination offset\n  - `since` - ISO date string (filter by date)\n  - `until` - ISO date string (filter by date)\n  - `skipCache` - Skip cache (true/false)\n\n**GET /api/portfolio/content/:service**\n- Get content from a specific service\n- Example: `/api/portfolio/content/github?limit=5`\n- Query params: Same as above\n\n### Health & Validation\n\n**GET /api/portfolio/health**\n- Check health of all services\n- Response: Overall health status + individual service health\n\n**GET /api/portfolio/validate**\n- Validate configuration\n- Response: Validation results with errors/warnings\n\n## Advanced Usage\n\n### Custom Base Path\n\n```typescript\nconst portfolioRouter = createPortfolioRouter({\n  client,\n  basePath: '/v1/portfolio' // Custom base path\n});\n\napp.use(portfolioRouter);\n```\n\n### Enable CORS\n\n```typescript\nconst portfolioRouter = createPortfolioRouter({\n  client,\n  enableCors: true // Enable CORS headers\n});\n```\n\n### Custom Error Handling\n\n```typescript\nimport { portfolioErrorHandler } from '@el_saintt/adapter-express';\n\napp.use(portfolioErrorHandler({\n  includeStack: process.env.NODE_ENV === 'development',\n  logErrors: true\n}));\n```\n\n### Async Route Wrapper\n\n```typescript\nimport { asyncHandler } from '@el_saintt/adapter-express';\n\napp.get('/custom', asyncHandler(async (req, res) => {\n  const content = await client.fetch('github');\n  res.json(content);\n}));\n```\n\n### Custom Routes\n\n```typescript\nimport { formatSuccessResponse, formatErrorResponse } from '@el_saintt/adapter-express';\n\napp.get('/custom-endpoint', async (req, res) => {\n  try {\n    const data = await client.fetch('github', { limit: 5 });\n    res.json(formatSuccessResponse(data, { count: data.length }));\n  } catch (error) {\n    res.status(500).json(formatErrorResponse(error.message));\n  }\n});\n```\n\n## Response Format\n\nAll responses follow a consistent format:\n\n### Success Response\n\n```json\n{\n  \"success\": true,\n  \"data\": { ... },\n  \"meta\": {\n    \"timestamp\": \"2024-10-10T12:00:00.000Z\",\n    \"count\": 10,\n    \"service\": \"github\"\n  }\n}\n```\n\n### Error Response\n\n```json\n{\n  \"success\": false,\n  \"error\": {\n    \"message\": \"Service not found\",\n    \"code\": \"SERVICE_NOT_FOUND\",\n    \"details\": { ... }\n  },\n  \"meta\": {\n    \"timestamp\": \"2024-10-10T12:00:00.000Z\"\n  }\n}\n```\n\n## Middleware\n\n### Portfolio Router\n\n```typescript\nimport { createPortfolioRouter } from '@el_saintt/adapter-express';\n\nconst router = createPortfolioRouter({\n  client: portfolioClient,\n  enableCors: true,\n});\n\napp.use('/api', router);\n```\n\n### Error Handler\n\n```typescript\nimport { portfolioErrorHandler, notFoundHandler } from '@el_saintt/adapter-express';\n\n// 404 handler (place before error handler)\napp.use(notFoundHandler());\n\n// Error handler (place at the end)\napp.use(portfolioErrorHandler({\n  includeStack: false,\n  logErrors: true\n}));\n```\n\n## TypeScript Support\n\nFull TypeScript support with proper types:\n\n```typescript\nimport {\n  PortfolioRequest,\n  PortfolioResponse,\n  PortfolioRouterOptions\n} from '@el_saintt/adapter-express';\n\nconst handler = (req: PortfolioRequest, res: Response) => {\n  const client = req.portfolioClient;\n  // ... typed client access\n};\n```\n\n## Examples\n\nSee the `/examples` directory for complete working examples:\n\n- Basic Express server\n- Express with multiple plugins\n- Express with custom routes\n- Express with authentication\n\n## License\n\nMIT\n","readmeFilename":"README.md","_rev":"1-b845d536ec9cdb34a364ac01906d4843"}