{"_id":"@contiva/sap-cpi-client","_rev":"5-93a42068352235b8fcef468da1322f76","name":"@contiva/sap-cpi-client","dist-tags":{"latest":"0.1.1"},"versions":{"0.1.0":{"name":"@contiva/sap-cpi-client","version":"0.1.0","keywords":["sap","cpi","cloud-platform-integration","integration-suite","openapi","client","typescript","odata","cache","oauth2"],"author":{"name":"Contiva"},"license":"MIT","_id":"@contiva/sap-cpi-client@0.1.0","maintainers":[{"name":"robertfels","email":"robert.fels@contiva.com"}],"homepage":"https://github.com/contiva/sap-cpi-client#readme","bugs":{"url":"https://github.com/contiva/sap-cpi-client/issues"},"dist":{"shasum":"2eb0f6c0d047b5e90ee26a9f5fc6d93469413d29","tarball":"https://registry.npmjs.org/@contiva/sap-cpi-client/-/sap-cpi-client-0.1.0.tgz","fileCount":29,"integrity":"sha512-FduT4eSuE0cllRi/8wEYZSaBu1AGbAD9ezhcJh8xNdSIi3IeGWVBIP6LmBzvlLEDhcDIFJ67aFK3heqj4aqr4w==","signatures":[{"sig":"MEUCICAdKuOFixnDW2K16ROR2k7Af5QTgr3vF1jVW8Q174P+AiEA1oZS0VXzq1pZVLwOYEobdUmEpg594yHd4nMfcA9T8u8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":13612666},"main":"./dist/index.js","types":"./dist/index.d.ts","module":"./dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"},"./core":{"types":"./dist/core/index.d.ts","import":"./dist/core/index.mjs","require":"./dist/core/index.js"},"./services":{"types":"./dist/services/index.d.ts","import":"./dist/services/index.mjs","require":"./dist/services/index.js"}},"gitHead":"ee0488f75def78eea47869f8ea21c809c31e7133","scripts":{"dev":"tsup --watch","lint":"eslint src demo --ext .ts","test":"vitest","build":"tsup","check":"npm run type-check && npm run lint","generate":"tsx src/importer/granular-generate.ts","lint:fix":"eslint src demo --ext .ts --fix","type-check":"tsc --noEmit","generate:all":"npm run generate && npm run generate:catalog","prepublishOnly":"npm run lint && npm run build","generate:catalog":"tsx src/importer/catalog-generator.ts","type-check:strict":"tsc --noEmit --strict"},"_npmUser":{"name":"robertfels","email":"robert.fels@contiva.com"},"repository":{"url":"git+https://github.com/contiva/sap-cpi-client.git","type":"git"},"_npmVersion":"11.6.2","description":"TypeScript client library for SAP Cloud Platform Integration APIs with automatic code generation, caching, and full type safety","directories":{},"_nodeVersion":"24.4.1","dependencies":{"openapi-fetch":"^0.9.0","openapi-typescript":"^6.7.3"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.7.0","tsup":"^8.0.1","dotenv":"^16.3.1","eslint":"^8.54.0","vitest":"^1.0.4","typescript":"^5.9.3","@types/node":"^20.10.0","@typescript-eslint/parser":"^8.15.0","@typescript-eslint/eslint-plugin":"^8.15.0"},"optionalDependencies":{"ioredis":"^5.3.2","node-cache":"^5.1.2"},"_npmOperationalInternal":{"tmp":"tmp/sap-cpi-client_0.1.0_1763446605261_0.38166143927414664","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@contiva/sap-cpi-client","version":"0.1.1","keywords":["sap","cpi","cloud-platform-integration","integration-suite","openapi","client","typescript","odata","cache","oauth2"],"author":{"name":"Contiva"},"license":"MIT","_id":"@contiva/sap-cpi-client@0.1.1","maintainers":[{"name":"robertfels","email":"robert.fels@contiva.com"}],"homepage":"https://github.com/contiva/sap-cpi-client#readme","bugs":{"url":"https://github.com/contiva/sap-cpi-client/issues"},"dist":{"shasum":"5cbaa5605ba1737a2678ace18150214d5e8a68c7","tarball":"https://registry.npmjs.org/@contiva/sap-cpi-client/-/sap-cpi-client-0.1.1.tgz","fileCount":29,"integrity":"sha512-W4azq3SwKYhjdxoZI+15vNwAVRecx6E3x1h36HjJLENP9BRHjGg3KoAOAYgPp4YeqCLjl2D7hAK3A4CETyxjBQ==","signatures":[{"sig":"MEUCICSLDxmElGU1Z62cE1mBLfhdsA71EJwQPhgS7T1GF156AiEA1Dh8d8Vwj69nwIhp+CXS82HSu5ZGvQdHPSvAWXV+WFQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":13615611},"main":"./dist/index.js","types":"./dist/index.d.ts","module":"./dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"},"./core":{"types":"./dist/core/index.d.ts","import":"./dist/core/index.mjs","require":"./dist/core/index.js"},"./services":{"types":"./dist/services/index.d.ts","import":"./dist/services/index.mjs","require":"./dist/services/index.js"}},"gitHead":"1ddb7520c0706591fcc87801f70f105e5318fda6","scripts":{"dev":"tsup --watch","lint":"eslint src demo --ext .ts","test":"vitest","build":"tsup","check":"npm run type-check && npm run lint","generate":"tsx src/importer/granular-generate.ts","lint:fix":"eslint src demo --ext .ts --fix","type-check":"tsc --noEmit","generate:all":"npm run generate && npm run generate:catalog","prepublishOnly":"npm run lint && npm run build","generate:catalog":"tsx src/importer/catalog-generator.ts","type-check:strict":"tsc --noEmit --strict"},"_npmUser":{"name":"robertfels","email":"robert.fels@contiva.com"},"repository":{"url":"git+https://github.com/contiva/sap-cpi-client.git","type":"git"},"_npmVersion":"11.6.2","description":"TypeScript client library for SAP Cloud Platform Integration APIs with automatic code generation, caching, and full type safety","directories":{},"_nodeVersion":"24.4.1","dependencies":{"openapi-fetch":"^0.9.0","openapi-typescript":"^6.7.3"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.7.0","tsup":"^8.0.1","dotenv":"^16.3.1","eslint":"^8.54.0","vitest":"^1.0.4","typescript":"^5.9.3","@types/node":"^20.10.0","@typescript-eslint/parser":"^8.15.0","@typescript-eslint/eslint-plugin":"^8.15.0"},"optionalDependencies":{"ioredis":"^5.3.2","node-cache":"^5.1.2"},"_npmOperationalInternal":{"tmp":"tmp/sap-cpi-client_0.1.1_1763448803561_0.17497333770913293","host":"s3://npm-registry-packages-npm-production"}}},"time":{"created":"2025-11-18T06:16:45.160Z","modified":"2026-02-11T15:39:08.885Z","0.1.0":"2025-11-18T06:16:45.626Z","0.1.1":"2025-11-18T06:53:23.772Z"},"bugs":{"url":"https://github.com/contiva/sap-cpi-client/issues"},"author":{"name":"Contiva"},"license":"MIT","homepage":"https://github.com/contiva/sap-cpi-client#readme","keywords":["sap","cpi","cloud-platform-integration","integration-suite","openapi","client","typescript","odata","cache","oauth2"],"repository":{"url":"git+https://github.com/contiva/sap-cpi-client.git","type":"git"},"description":"TypeScript client library for SAP Cloud Platform Integration APIs with automatic code generation, caching, and full type safety","maintainers":[{"email":"amir.abassi@contiva.com","name":"amirnpmjs"},{"email":"benedikt.koch@contiva.com","name":"bkcon"},{"email":"robert.fels@contiva.com","name":"robertfels"}],"readme":"# SAP CPI Client Library\n\nTypeScript Client-Library für SAP Cloud Platform Integration APIs mit automatischer Code-Generierung aus OpenAPI Spezifikationen.\n\n## 🚀 Features\n\n### 🎯 Core Features\n- ✅ **Type-Safe**: Vollständig typisierte API-Clients generiert aus OpenAPI Specs\n- ✅ **OAuth2 & Basic Auth**: Unterstützt beide Authentifizierungsmethoden\n- ✅ **Auto-Generated**: Services und Types werden automatisch aus OpenAPI Specs generiert\n- ✅ **Service Manager**: Einfacher Zugriff auf alle Services über `client.services`\n- ✅ **Modern**: ESM und CommonJS Support mit Tree-Shaking\n- ✅ **TypeScript 5.0+**: Moderne TypeScript Features\n\n### 💾 Caching System\n- ✅ **4 Cache Backends**: `node-cache` (In-Memory), `redis` (Azure Redis), `file` (Persistent), `none`\n- ✅ **Service-spezifische TTLs**: Individuelle Cache-Zeiten pro Service mit Wildcard-Support\n- ✅ **Hostname-aware Keys**: Automatische Trennung von Dev/Test/Prod Cache-Daten\n- ✅ **Force Refresh**: Optional `forceCacheRefresh` Parameter für alle GET-Methoden\n- ✅ **Token Caching**: Automatisches Caching von OAuth2 Access Tokens\n- ✅ **Persistent Storage**: File-based Cache bleibt zwischen Prozess-Neustarts erhalten\n\n### 📊 OData Features\n- ✅ **Native OData Support**: Collections, Entities, Metadata\n- ✅ **Filter Builder**: Type-safe OData Filter-Konstruktion\n- ✅ **Pagination**: Automatische Paginierung mit async iterators\n- ✅ **Date Helpers**: OData Datum-Formate parsen und formatieren\n\n### 🔧 Developer Experience\n- ✅ **Retry Logic**: Exponential Backoff bei transienten Fehlern\n- ✅ **Custom Errors**: Spezifische Error-Klassen (AuthError, RateLimitError, etc.)\n- ✅ **Interceptors**: Request/Response Middleware für Logging\n- ✅ **Environment Config**: Einfache Konfiguration via `.env` Datei\n\n## 📦 Installation\n\n```bash\nnpm install @contiva/sap-cpi-client\n```\n\n### Quick Reference\n\n```typescript\n// Installation\nnpm install @contiva/sap-cpi-client\n\n// Einfachste Nutzung\nimport { createClientFromEnv } from '@contiva/sap-cpi-client/core';\nconst client = createClientFromEnv();\n\n// API aufrufen\nconst logs = await client.services.logs.getMessageProcessingLogs();\nconst packages = await client.services.integrationPackagesDesign.getIntegrationPackages();\n\n// Mit Cache\nSAP_CACHE_BACKEND=file  // in .env\nconst freshData = await client.services.logs.getMessageProcessingLogs(\n  undefined, undefined, undefined, undefined, true  // forceCacheRefresh\n);\n```\n\n## 🔧 Schnellstart\n\n### ✅ Empfohlene Verwendung: Service Manager\n\n**Wichtig**: Direkte Client-Aufrufe (`client.get/post/put/delete`) sind deprecated!  \nVerwenden Sie **ausschließlich** die Service Manager API für typsicheren Zugriff.\n\n```typescript\nimport { createClientFromEnv } from '@contiva/sap-cpi-client/core';\n\n// Client aus Umgebungsvariablen erstellen\nconst client = createClientFromEnv();\n\n// ✅ Empfohlen: Services über client.services verwenden\nconst logs = await client.services.logs.getMessageProcessingLogs();\nconst credentials = await client.services.userCredentials.getUserCredentials();\nconst packages = await client.services.integrationPackagesDesign.getIntegrationPackages();\n\n// Type-safe Zugriff auf typisierte Responses\nlogs.forEach(log => {\n  console.log(`${log.MessageGuid}: ${log.Status}`);\n});\n\n// ❌ NICHT empfohlen (deprecated):\n// const result = await client.get('/MessageProcessingLogs');\n// const pkg = await client.post('/IntegrationPackages', data);\n```\n\n### Mit manueller Konfiguration\n\n```typescript\nimport { SapCpiClient } from '@contiva/sap-cpi-client/core';\n\n// OAuth2 Client\nconst client = new SapCpiClient({\n  baseUrl: 'https://your-tenant-tmn.it-cpi123.cfapps.eu10.hana.ondemand.com/api/v1',\n  auth: {\n    type: 'oauth2',\n    clientId: 'your-client-id',\n    clientSecret: 'your-client-secret',\n    tokenUrl: 'https://your-tenant.authentication.eu10.hana.ondemand.com/oauth/token',\n  },\n});\n\n// Basic Auth Client\nconst basicClient = new SapCpiClient({\n  baseUrl: 'https://...',\n  auth: {\n    type: 'basic',\n    username: 'your-username',\n    password: 'your-password',\n  },\n});\n```\n\n### Umgebungsvariablen Setup\n\nErstellen Sie eine `.env` Datei:\n\n```env\nSAP_CPI_BASE_URL=https://your-tenant.it-cpi123.cfapps.eu10.hana.ondemand.com/api/v1\nSAP_CPI_AUTH_TYPE=oauth2\n\n# OAuth2\nSAP_CPI_CLIENT_ID=your-client-id\nSAP_CPI_CLIENT_SECRET=your-client-secret\nSAP_CPI_TOKEN_URL=https://your-tenant.authentication.eu10.hana.ondemand.com/oauth/token\n\n# Oder Basic Auth\n# SAP_CPI_AUTH_TYPE=basic\n# SAP_CPI_USERNAME=your-username\n# SAP_CPI_PASSWORD=your-password\n```\n\n## 💡 Erweiterte Features\n\n### Caching\n\nDie Library unterstützt flexibles Caching für API-Requests mit **hostname-aware Cache-Keys** für sicheres Multi-Environment-Caching:\n\n```bash\n# .env - Caching aktivieren\nSAP_CACHE_BACKEND=file        # 'node-cache' | 'redis' | 'file' | 'none'\nSAP_CACHE_DIR=.cache          # Nur für file-backend\nSAP_CACHE_DEFAULT_TTL=3600    # 1 Stunde\nSAP_CACHE_SERVICE_TTL='{\"MessageProcessingLogs*\":300,\"RuntimeArtifacts\":300}'\n```\n\n```typescript\n// Programmatische Konfiguration\nconst client = new SapCpiClient({\n  baseUrl: '...',\n  auth: { /* ... */ },\n  cache: {\n    backend: 'file',        // 'none' | 'node-cache' | 'redis' | 'file'\n    cacheDir: '.cache',     // Für file-backend\n    defaultTtl: 3600,       // 1 Stunde\n    serviceTtl: {\n      'MessageProcessingLogs*': 300,  // 5 Minuten\n      'RuntimeArtifacts': 300,\n    },\n  },\n});\n\n// Force Cache Refresh für einzelne Requests\nconst freshLogs = await client.services.logs.getMessageProcessingLogs(\n  undefined, undefined, undefined, undefined,\n  true  // forceCacheRefresh\n);\n\n// Cache-Management\nawait client.cache.clear();  // Gesamten Cache leeren\nawait client.cache.delete('ServiceName', '/path', 'GET');  // Einzelner Eintrag\n\n// Multi-Environment: Jedes System hat separate Cache-Einträge\nconst devClient = new SapCpiClient({ baseUrl: 'https://dev...' });  // Cache: sapcpi:abc123:...\nconst prodClient = new SapCpiClient({ baseUrl: 'https://prod...' }); // Cache: sapcpi:def456:...\n```\n\n**Cache-Backend Vergleich:**\n\n| Backend | Persistent | Performance | Use Case |\n|---------|-----------|-------------|----------|\n| `none` | ❌ | ⚡⚡⚡ | Development, Debugging |\n| `node-cache` | ❌ | ⚡⚡⚡ | Single-Instance Apps |\n| `file` | ✅ | ⚡⚡ | CI/CD, Multi-Process |\n| `redis` | ✅ | ⚡⚡ | Multi-Instance, Shared Cache |\n\n**📖 Detaillierte Dokumentation:** [Caching Guide](docs/CACHING.md)\n\n### Service Manager\n\nDer Service Manager bietet direkten Zugriff auf alle generierten Services:\n\n```typescript\nconst client = createClientFromEnv();\n\n// Message Processing Logs\nconst logs = await client.services.logs.getMessageProcessingLogs();\n\n// Security Content\nconst keyPairs = await client.services.keyPair.getKeyPairs();\nconst certificates = await client.services.certificate.getCertificates();\n\n// Integration Content\nconst packages = await client.services.integrationPackages.getIntegrationPackages();\n\n// Partner Directory\nconst partners = await client.services.partners.getPartners();\n\n// Message Store\nconst entries = await client.services.entries.getEntries();\n```\n\n**Verfügbare Service-Kategorien:**\n- `logs` - Message Processing Logs\n- `logFiles`, `logFileArchives` - Log-Dateien\n- `businessDocuments`, `functionalAcknowledgement` - B2B Scenarios\n- `keyPair`, `certificate`, `userCredentials`, `oAuth2ClientCredentials` - Security Content\n- `partners`, `stringParameters`, `binaryParameters` - Partner Directory\n- `entries`, `variables`, `numberRanges` - Message Store\n\n### OData Filter Builder\n\nType-safe Filter-Erstellung für OData Queries:\n\n```typescript\nimport { ODataFilterBuilder, createClientFromEnv } from '@contiva/sap-cpi-client/core';\n\nconst client = createClientFromEnv();\n\n// Erstelle Filter\nconst filter = new ODataFilterBuilder()\n  .equals('Status', 'FAILED')\n  .greaterThanOrEqual('LogStart', new Date('2025-01-01'))\n  .contains('IntegrationFlowName', 'Order')\n  .build();\n\n// Wende Filter an\nconst logs = await client.services.logs.getMessageProcessingLogs(\n  undefined, // $inlinecount\n  filter,    // $filter\n  ['LogStart desc'], // $orderby\n);\n\n// Datum-Bereiche\nconst dateFilter = new ODataFilterBuilder()\n  .dateRange('LogStart', thirtyDaysAgo, today)\n  .build();\n```\n\n**Verfügbare Filter-Methoden:**\n- `equals(field, value)` - Gleichheit\n- `notEquals(field, value)` - Ungleichheit\n- `greaterThan(field, value)` - Größer als\n- `greaterThanOrEqual(field, value)` - Größer oder gleich\n- `lessThan(field, value)` - Kleiner als\n- `lessThanOrEqual(field, value)` - Kleiner oder gleich\n- `contains(field, value)` - Enthält (substringof)\n- `startsWith(field, value)` - Beginnt mit\n- `endsWith(field, value)` - Endet mit\n- `dateRange(field, start, end?)` - Datum-Bereich\n- `custom(filter)` - Eigene Filter-Bedingung\n\n### OData Pagination\n\nAutomatische Paginierung für große Datenmengen:\n\n```typescript\nimport { ODataPaginator, createClientFromEnv } from '@contiva/sap-cpi-client/core';\n\nconst client = createClientFromEnv();\n\n// Erstelle Paginator\nconst paginator = new ODataPaginator(\n  async (skipToken) => {\n    return await client.services.logs.getMessageProcessingLogs();\n  },\n  {\n    maxPages: 10,\n    onPage: (pageNumber, items) => {\n      console.log(`Seite ${pageNumber}: ${items.length} Logs`);\n    },\n  }\n);\n\n// Methode 1: Seiten-weise iterieren\nfor await (const page of paginator) {\n  page.forEach(log => {\n    console.log(log.MessageGuid);\n  });\n}\n\n// Methode 2: Alle Daten auf einmal laden\nconst allLogs = await paginator.loadAll();\nconsole.log(`Insgesamt ${allLogs.length} Logs geladen`);\n\n// Statistiken abrufen\nconst stats = paginator.getStats();\nconsole.log(`${stats.currentPage} Seiten, ${stats.totalLoaded} Einträge`);\n```\n\n### OData Date Formatting\n\nHilfsklassen für OData Datum-Formate:\n\n```typescript\nimport { \n  parseODataDate, \n  formatODataDate, \n  toODataDateTime,\n  createDateRangeFilter \n} from '@contiva/sap-cpi-client/core';\n\n// Parse OData Datum\nconst date = parseODataDate('/Date(1763380800004)/'); // -> Date object\n\n// Formatiere für Ausgabe\nconst formatted = formatODataDate('/Date(1763380800004)/'); \n// -> \"17.11.2025, 12:00:00\"\n\n// Konvertiere zu OData DateTime String\nconst odataString = toODataDateTime(new Date()); \n// -> \"2025-11-17T12:00:00\"\n\n// Erstelle Datum-Bereich Filter\nconst filter = createDateRangeFilter('LogStart', thirtyDaysAgo, today);\n// -> \"LogStart ge datetime'2025-10-17T00:00:00' and LogStart le datetime'2025-11-17T23:59:59'\"\n```\n\n### Request/Response Interceptors\n\nMiddleware für Logging, Debugging und Custom Logic:\n\n```typescript\nconst client = createClientFromEnv();\n\n// Request Interceptor\nclient.interceptors.request.use((config) => {\n  console.log(`📤 ${config.method} ${config.url}`);\n  \n  // Füge Custom Headers hinzu\n  const headers = config.headers as Record<string, string>;\n  headers['X-Request-ID'] = generateRequestId();\n  \n  return { ...config, headers };\n});\n\n// Response Interceptor\nclient.interceptors.response.use((response) => {\n  console.log(`📥 ${response.status} ${response.statusText}`);\n  \n  // Logging, Metrics, etc.\n  logResponseTime(response);\n  \n  return response;\n});\n\n// Interceptors löschen\nclient.interceptors.request.clear();\nclient.interceptors.response.clear();\n```\n\n### Error Handling\n\nSpezifische Error-Klassen für präzise Fehlerbehandlung:\n\n```typescript\nimport { \n  AuthError, \n  NotFoundError, \n  ValidationError,\n  RateLimitError,\n  ServerError,\n  TimeoutError,\n  NetworkError,\n} from '@contiva/sap-cpi-client/core';\n\ntry {\n  const logs = await client.services.logs.getMessageProcessingLogs();\n} catch (error) {\n  if (error instanceof AuthError) {\n    console.error('Authentifizierungsfehler:', error.statusCode);\n    // Neuanmeldung erforderlich\n  } else if (error instanceof RateLimitError) {\n    console.error('Rate Limit erreicht. Retry nach:', error.retryAfter);\n    // Warte und versuche erneut\n  } else if (error instanceof TimeoutError) {\n    console.error('Request Timeout');\n    // Erhöhe Timeout oder versuche später\n  } else if (error instanceof NetworkError) {\n    console.error('Netzwerkfehler:', error.cause);\n    // Prüfe Verbindung\n  } else if (error instanceof NotFoundError) {\n    console.error('Ressource nicht gefunden');\n  }\n}\n```\n\n**Verfügbare Error-Klassen:**\n- `AuthError` (401, 403) - Authentifizierungsfehler\n- `NotFoundError` (404) - Ressource nicht gefunden\n- `ValidationError` (400, 422) - Validierungsfehler\n- `RateLimitError` (429) - Rate Limit erreicht\n- `ServerError` (500-599) - Server-Fehler\n- `TimeoutError` - Request Timeout\n- `NetworkError` - Netzwerkfehler\n\n### Retry Configuration\n\nAutomatische Wiederholungslogik bei transienten Fehlern:\n\n```typescript\nconst client = new SapCpiClient({\n  baseUrl: '...',\n  auth: { /* ... */ },\n  retry: {\n    maxRetries: 3,              // Max. Anzahl Wiederholungen\n    retryDelay: 1000,           // Initiale Verzögerung in ms\n    backoffFactor: 2,           // Exponentieller Backoff Faktor\n    maxRetryDelay: 30000,       // Maximale Verzögerung\n    retryableStatusCodes: [     // Status Codes für Retry\n      408, // Request Timeout\n      429, // Too Many Requests\n      500, // Internal Server Error\n      502, // Bad Gateway\n      503, // Service Unavailable\n      504, // Gateway Timeout\n    ],\n  },\n});\n```\n\n### Erweiterte Konfiguration\n\n```typescript\nconst client = new SapCpiClient({\n  baseUrl: 'https://...',\n  auth: { /* ... */ },\n  \n  // Timeout in Millisekunden\n  timeout: 60000,\n  \n  // Token-Cache aktivieren/deaktivieren\n  enableTokenCache: true,\n  \n  // Custom Headers für alle Requests\n  headers: {\n    'X-Custom-Header': 'value',\n    'User-Agent': 'My-App/1.0',\n  },\n  \n  // Retry Konfiguration\n  retry: {\n    maxRetries: 3,\n    retryDelay: 1000,\n    backoffFactor: 2,\n  },\n});\n```\n\n## 📚 Beispiele\n\nAlle Beispiele befinden sich im `demo/` Verzeichnis:\n\n```bash\n# Caching Demo\nnpx tsx demo/caching-example.ts\n\n# Multi-Environment Caching\nnpx tsx demo/multi-environment-cache-example.ts\n\n# Packages mit Artifacts auflisten\nnpx tsx demo/list-packages-with-artifacts.ts\n```\n\n**Beispiel-Code:**\n\n```typescript\n// demo/caching-example.ts\nimport { createClientFromEnv } from '@contiva/sap-cpi-client/core';\n\nconst client = createClientFromEnv();\n\n// Erster Request (nicht gecached)\nconsole.time('Erster Request');\nconst packages1 = await client.services.integrationPackagesDesign.getIntegrationPackages();\nconsole.timeEnd('Erster Request');\n// → ~250ms\n\n// Zweiter Request (aus Cache)\nconsole.time('Zweiter Request');\nconst packages2 = await client.services.integrationPackagesDesign.getIntegrationPackages();\nconsole.timeEnd('Zweiter Request');\n// → ~2ms ⚡\n\n// Force Refresh\nconst freshPackages = await client.services.integrationPackagesDesign.getIntegrationPackages(\n  undefined, undefined, true  // forceCacheRefresh\n);\n```\n\n## 🔨 Entwicklung\n\n### Projekt Setup\n\n```bash\n# Dependencies installieren\nnpm install\n\n# OpenAPI Specs generieren\nnpm run generate\n\n# Build\nnpm run build\n\n# Entwicklungsmodus mit Watch\nnpm run dev\n\n# Tests\nnpm run test\n\n# Linting\nnpm run lint\n```\n\n### OpenAPI Specs hinzufügen\n\n1. OpenAPI Spec als `.json` Datei im `import/` Verzeichnis ablegen\n2. Code-Generierung ausführen:\n\n```bash\nnpm run generate\n```\n\nDie Generierung erstellt automatisch:\n- TypeScript Interfaces aus den OpenAPI Schemas\n- Service-Klassen mit typisierten Methoden\n- OData Collection und Entity Types\n- Index-Dateien für einfache Imports\n\n### Projekt-Struktur\n\n```\nsap-cpi-lib/\n├── src/\n│   ├── core/                     # Core-Komponenten\n│   │   ├── client.ts             # HTTP Client mit Retry\n│   │   ├── auth-manager.ts       # Authentifizierung\n│   │   ├── token-cache.ts        # Token Caching\n│   │   ├── service-manager.ts    # Service Factory\n│   │   ├── odata-helpers.ts      # OData Utilities\n│   │   ├── errors.ts             # Error Classes\n│   │   ├── types.ts              # Core Types\n│   │   └── client-factory.ts     # Client Factory\n│   ├── importer/                 # Code-Generator\n│   │   ├── granular-generate.ts\n│   │   ├── granular-type-generator.ts\n│   │   └── granular-service-generator.ts\n│   ├── generated/                # Auto-generierter Code\n│   │   ├── b2BScenarios/         # B2B Scenarios Services\n│   │   ├── integrationContent/   # Integration Content Services\n│   │   ├── logFiles/             # Log Files Services\n│   │   ├── messageProcessingLogs/ # Message Logs Services\n│   │   ├── messageStore/         # Message Store Services\n│   │   ├── partnerDirectory/     # Partner Directory Services\n│   │   └── securityContent/      # Security Content Services\n│   └── index.ts                  # Haupt-Export\n├── import/                       # OpenAPI Specs (JSON)\n├── demo/                         # Beispiel-Scripts\n└── dist/                         # Kompilierte Ausgabe\n    ├── *.js                      # CommonJS\n    ├── *.mjs                     # ES Modules\n    └── *.d.ts                    # TypeScript Definitionen\n```\n\n## 🔐 Sicherheit\n\n- **Credentials nie im Code**: Verwenden Sie Umgebungsvariablen (`.env`)\n- **Token Caching**: Tokens werden nur im Memory gecacht (nicht persistent)\n- **HTTPS**: Verwenden Sie immer HTTPS URLs\n- **Token Rotation**: OAuth2 Tokens werden automatisch erneuert\n- **Retry bei Auth-Fehlern**: Automatischer Retry mit neuem Token bei 401\n\n## 🚀 CI/CD & Deployment\n\n### Azure DevOps Pipeline\n\nDas Projekt verfügt über eine vollautomatische CI/CD-Pipeline:\n\n```yaml\n# azure-pipelines.yml\nStages:\n  1. Build & Test     → Bei jedem Push/PR\n  2. Publish          → Automatic zu Azure Artifacts (main branch)\n  3. Tag              → Optional mit [release] im Commit-Message\n```\n\n**Features:**\n- ✅ Automatisches Build & Lint bei jedem Push\n- ✅ Service-Generierung aus OpenAPI Specs\n- ✅ Automatisches Publish zu Azure Artifacts\n- ✅ Node.js Dependency Caching für schnellere Builds\n- ✅ Optional: Automatische Git-Tag-Erstellung\n\n**Pipeline-Dokumentation**: [.azure/pipelines/README.md](.azure/pipelines/README.md)\n\n### Package veröffentlichen\n\n```bash\n# Version erhöhen\nnpm version patch  # 0.1.0 → 0.1.1\nnpm version minor  # 0.1.0 → 0.2.0\nnpm version major  # 0.1.0 → 1.0.0\n\n# Push mit Tags → triggert Pipeline\ngit push && git push --tags\n\n# Pipeline published automatisch zu Azure Artifacts\n```\n\n### Runtime Support\n\nDie Library unterstützt alle modernen JavaScript Runtimes:\n\n- ✅ Node.js 18+\n- ✅ Bun 1.0+\n- ✅ Deno (mit npm: Kompatibilität)\n- ✅ Browser (mit Bundlern wie Vite, Webpack, etc.)\n\n**Package Exports:**\n```json\n{\n  \"exports\": {\n    \".\": {\n      \"types\": \"./dist/index.d.ts\",\n      \"import\": \"./dist/index.mjs\",\n      \"require\": \"./dist/index.js\"\n    },\n    \"./core\": {\n      \"types\": \"./dist/core/index.d.ts\",\n      \"import\": \"./dist/core/index.mjs\",\n      \"require\": \"./dist/core/index.js\"\n    },\n    \"./services\": {\n      \"types\": \"./dist/services/index.d.ts\",\n      \"import\": \"./dist/services/index.mjs\",\n      \"require\": \"./dist/services/index.js\"\n    }\n  }\n}\n```\n\n## 📄 Lizenz\n\nMIT\n\n## 🤝 Contributing\n\nContributions sind willkommen! Öffne ein Issue oder erstelle einen Pull Request im Azure DevOps Repository.\n\n### Development Workflow\n\n1. Clone das Repository\n   ```bash\n   git clone https://dev.azure.com/contiva/sap-cpi-client/_git/sap-cpi-client\n   ```\n2. Erstelle einen Feature Branch\n   ```bash\n   git checkout -b feature/amazing-feature\n   ```\n3. Implementiere deine Änderungen\n   ```bash\n   npm run generate  # Falls OpenAPI Specs geändert\n   npm run build\n   npm run lint\n   ```\n4. Committe und pushe\n   ```bash\n   git commit -m 'feat: add amazing feature'\n   git push origin feature/amazing-feature\n   ```\n5. Erstelle einen Pull Request in Azure DevOps\n\n## 📚 Dokumentation\n\n### Projekt-Dokumentation\n- **[AZURE_ARTIFACTS.md](AZURE_ARTIFACTS.md)** - Azure Artifacts Setup & Publishing\n- **[.azure/pipelines/README.md](.azure/pipelines/README.md)** - CI/CD Pipeline Dokumentation\n- **[docs/CACHING.md](docs/CACHING.md)** - Umfassender Caching Guide\n- **[docs/SERVICE_CATALOG.md](docs/SERVICE_CATALOG.md)** - Übersicht aller Services\n- **[CHANGELOG.md](CHANGELOG.md)** - Release Notes & Änderungen\n\n### Externe Ressourcen\n- [SAP Integration Suite Dokumentation](https://help.sap.com/docs/integration-suite)\n- [SAP CPI API Referenz](https://api.sap.com/package/CloudIntegrationAPI)\n- [OpenAPI Specification](https://swagger.io/specification/)\n- [OData Protocol](https://www.odata.org/)\n- [Azure DevOps Pipelines](https://docs.microsoft.com/azure/devops/pipelines/)\n- [Azure Artifacts](https://docs.microsoft.com/azure/devops/artifacts/)\n\n## 🙏 Danksagungen\n\nBasiert auf den offiziellen SAP Cloud Integration APIs und nutzt moderne TypeScript Best Practices für maximale Type Safety und Developer Experience.\n\n---\n\nMade with ❤️ for the SAP Integration Community\n","readmeFilename":"README.md"}