{"_id":"@cap-sf-sdk/odata-transformer","_rev":"2-56e42ff7a7aaf8fde7c5bece024b9822","name":"@cap-sf-sdk/odata-transformer","dist-tags":{"latest":"1.0.1"},"versions":{"1.0.0":{"name":"@cap-sf-sdk/odata-transformer","version":"1.0.0","keywords":["odata","transformer","cap","successfactors"],"author":{"name":"Samad & Soultan Hatsijev"},"license":"MIT","_id":"@cap-sf-sdk/odata-transformer@1.0.0","maintainers":[{"name":"samadh90","email":"s.hatsijev@hotmail.com"}],"dist":{"shasum":"f26efcc26a39a93ad181568357e0c3beace2b019","tarball":"https://registry.npmjs.org/@cap-sf-sdk/odata-transformer/-/odata-transformer-1.0.0.tgz","fileCount":19,"integrity":"sha512-wVxInQcktajie8VmcbE0Lj3OOnQkFxvNf2uUGgkuuNKXTKoylowDX6ySG534qi2yOl6MZruBepwDjLyy4I5sXA==","signatures":[{"sig":"MEQCIFa8NDqyqEOT8Sxitu1NDO7/sc0LwUpnL4RejeiVDWgTAiBpRsCHsUs1HK6bwhmLdla+lS1K+QmXDPAel1ri6WV9MA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":20976},"main":"dist/odata-transformer/index.js","types":"dist/odata-transformer/index.d.ts","module":"dist/odata-transformer/index.mjs","gitHead":"33aafe2e224307930d52361ffe973ca01bfcf8a9","scripts":{"docs":"cd ../.. && npm run docs","test":"cd ../.. && npx jest --selectProjects odata-transformer","build":"tsup src/index.ts --dts","clean":"rimraf dist"},"_npmUser":{"name":"samadh90","email":"s.hatsijev@hotmail.com"},"_npmVersion":"10.9.0","description":"Transforms SAP CAP CQN queries into OData v2 query strings for SuccessFactors.","directories":{},"_nodeVersion":"22.12.0","dependencies":{},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{},"_npmOperationalInternal":{"tmp":"tmp/odata-transformer_1.0.0_1759706108129_0.7922171137294298","host":"s3://npm-registry-packages-npm-production"}},"1.0.1":{"name":"@cap-sf-sdk/odata-transformer","version":"1.0.1","description":"Transforms SAP CAP CQN queries into OData v2 query strings for SuccessFactors.","main":"dist/odata-transformer/index.js","module":"dist/odata-transformer/index.mjs","types":"dist/odata-transformer/index.d.ts","scripts":{"build":"tsup src/index.ts --dts","clean":"rimraf dist","docs":"cd ../.. && npm run docs","test":"cd ../.. && npx jest --selectProjects odata-transformer"},"keywords":["odata","transformer","cap","successfactors"],"author":{"name":"Samad & Soultan Hatsijev"},"license":"MIT","dependencies":{},"devDependencies":{},"publishConfig":{"access":"public"},"_id":"@cap-sf-sdk/odata-transformer@1.0.1","gitHead":"6c26fecf0d91574031e1a6b4eb886996b71ad481","_nodeVersion":"22.12.0","_npmVersion":"10.9.0","dist":{"integrity":"sha512-doCa6jU3NCXF3YB4zSeCswkDPfm/kXmuaKr01I5W0io3fYfBERcKVzwxscQdYOik4oztmqsjnL793jJqv0EA8Q==","shasum":"65a4a9dcea6c951c52b98c5b4318946fa02d5b57","tarball":"https://registry.npmjs.org/@cap-sf-sdk/odata-transformer/-/odata-transformer-1.0.1.tgz","fileCount":21,"unpackedSize":27840,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQC1nS9CGGSv6rw20Jw+9sR/RbBYyFF50AdEHXYGwCOpQAIgBjSr9ioIAw5S4bHe6f6Ze2s/0aStzuiNNGdZdISU8QY="}]},"_npmUser":{"name":"samadh90","email":"s.hatsijev@hotmail.com"},"directories":{},"maintainers":[{"name":"samadh90","email":"s.hatsijev@hotmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/odata-transformer_1.0.1_1759958331368_0.011607964945160587"},"_hasShrinkwrap":false}},"time":{"created":"2025-10-05T23:15:08.022Z","modified":"2025-10-08T21:18:51.825Z","1.0.0":"2025-10-05T23:15:08.323Z","1.0.1":"2025-10-08T21:18:51.606Z"},"author":{"name":"Samad & Soultan Hatsijev"},"license":"MIT","keywords":["odata","transformer","cap","successfactors"],"description":"Transforms SAP CAP CQN queries into OData v2 query strings for SuccessFactors.","maintainers":[{"name":"samadh90","email":"s.hatsijev@hotmail.com"}],"readme":"# @cap-sf-sdk/odata-transformer\r\n\r\n> Transform SAP CAP CQN queries into OData v2 query strings for SuccessFactors integration.\r\n\r\nPart of the [CAP SuccessFactors SDK](../../README.md) monorepo.\r\n\r\n## 🚀 Installation\r\n\r\n```bash\r\n# Install this package individually\r\nnpm install @cap-sf-sdk/odata-transformer\r\n\r\n# Or install the complete SDK\r\nnpm install @cap-sf-sdk/core\r\n```\r\n\r\n## 📖 Overview\r\n\r\nThe OData Transformer converts SAP CAP CQN (Common Query Notation) objects into OData v2 query strings, making it easy to integrate CAP services with SuccessFactors APIs.\r\n\r\n### Supported OData Parameters\r\n\r\n- `$select` (from CQN columns)\r\n- `$filter` (from CQN where conditions)\r\n- `$orderby` (from CQN orderBy)\r\n- `$top` / `$skip` (from CQN limit)\r\n- `$expand` (from CQN columns with expand)\r\n- SuccessFactors date parameters: `fromDate`, `toDate`, `asOfDate`\r\n\r\n## 🧩 Usage\r\n\r\n### Basic Usage\r\n\r\n```typescript\r\nimport { cqnToOData } from '@cap-sf-sdk/odata-transformer'\r\n\r\n// In your CAP service handler\r\nthis.on('READ', 'Employees', async (req) => {\r\n  const odataQuery = cqnToOData(req.query, {\r\n    fromDate: '2024-01-01',\r\n    toDate: '2024-12-31',\r\n  })\r\n\r\n  console.log(odataQuery)\r\n  // Result: $format=json&$select=externalCode,startDate&$filter=status eq 'A'&fromDate=2024-01-01&toDate=2024-12-31\r\n\r\n  // Use with SuccessFactors API\r\n  const response = await fetch(`https://api.successfactors.com/odata/v2/PerPerson?${odataQuery}`)\r\n})\r\n```\r\n\r\n### Advanced Examples\r\n\r\n```typescript\r\n// Complex query with joins and filters\r\nconst complexQuery = {\r\n  columns: [\r\n    { ref: ['externalCode'] },\r\n    { ref: ['startDate'] },\r\n    { ref: ['companyNav'], expand: ['code', 'name'] },\r\n  ],\r\n  where: [\r\n    'and',\r\n    [{ ref: ['status'] }, '=', { val: 'A' }],\r\n    [{ ref: ['startDate'] }, '>=', { val: '2024-01-01' }],\r\n  ],\r\n  orderBy: [{ ref: ['startDate'], sort: 'desc' }],\r\n  limit: { rows: { val: 100 }, offset: { val: 0 } },\r\n}\r\n\r\nconst queryString = cqnToOData(complexQuery, { asOfDate: '2024-06-01' })\r\n// Result: $format=json&$select=externalCode,startDate,companyNav($select=code,name)&$filter=status eq 'A' and startDate ge '2024-01-01'&$orderby=startDate desc&$top=100&$skip=0&asOfDate=2024-06-01\r\n```\r\n\r\n## 📅 SuccessFactors Date Parameters\r\n\r\nThe transformer supports SuccessFactors-specific date parameters with intelligent logic:\r\n\r\n### Date Parameter Rules\r\n\r\n- **`asOfDate` is exclusive**: If provided, `fromDate` and `toDate` are ignored\r\n- **`fromDate` and `toDate`** can be used individually or together\r\n\r\n```typescript\r\n// asOfDate takes precedence\r\ncqnToOData(\r\n  { columns: [{ ref: ['id'] }] },\r\n  {\r\n    asOfDate: '2024-06-01',\r\n    fromDate: '2024-01-01', // Ignored\r\n    toDate: '2024-12-31', // Ignored\r\n  }\r\n)\r\n// → ...&asOfDate=2024-06-01\r\n\r\n// fromDate only\r\ncqnToOData(query, { fromDate: '2024-02-01' })\r\n// → ...&fromDate=2024-02-01\r\n\r\n// toDate only\r\ncqnToOData(query, { toDate: '2024-03-01' })\r\n// → ...&toDate=2024-03-01\r\n\r\n// Both fromDate and toDate\r\ncqnToOData(query, { fromDate: '2024-01-01', toDate: '2024-12-31' })\r\n// → ...&fromDate=2024-01-01&toDate=2024-12-31\r\n```\r\n\r\n## 🔧 API Reference\r\n\r\n### `cqnToOData(cqn, options?)`\r\n\r\nConverts a CAP CQN query to an OData v2 query string.\r\n\r\n**Parameters:**\r\n\r\n- `cqn: CqnSelect` - The CAP CQN query object\r\n- `options?: ODataOptions` - Optional SuccessFactors parameters\r\n\r\n**Returns:** `string` - The OData query string\r\n\r\n**Types:**\r\n\r\n```typescript\r\ninterface ODataOptions {\r\n  fromDate?: string // YYYY-MM-DD format\r\n  toDate?: string // YYYY-MM-DD format\r\n  asOfDate?: string // YYYY-MM-DD format (exclusive)\r\n}\r\n\r\ninterface CqnSelect {\r\n  columns?: Column[]\r\n  where?: Condition[]\r\n  orderBy?: OrderBy[]\r\n  limit?: { rows?: { val: number }; offset?: { val: number } }\r\n}\r\n```\r\n\r\n## 🏗️ Project Structure\r\n\r\n```\r\nsrc/\r\n├── index.ts              # Main entry point & cqnToOData function\r\n├── types.ts              # TypeScript type definitions\r\n├── builders/             # Query string builders\r\n│   └── buildQueryString.ts\r\n├── parsers/              # CQN to OData parsers\r\n│   ├── select.ts         # $select parameter\r\n│   ├── filter.ts         # $filter parameter\r\n│   ├── orderby.ts        # $orderby parameter\r\n│   ├── limit.ts          # $top/$skip parameters\r\n│   └── expand.ts         # $expand parameter\r\n└── utils/                # Utility functions\r\n    └── encode.ts         # URL encoding helpers\r\n```\r\n\r\n## 🧪 Testing\r\n\r\n```bash\r\n# Run tests for this package\r\nnpm test\r\n\r\n# Run tests from package directory\r\ncd packages/odata-transformer\r\nnpm test\r\n\r\n# Coverage report\r\nnpm run test:coverage\r\n```\r\n\r\n## 📚 Related Packages\r\n\r\n- [`@cap-sf-sdk/sf-normalizer`](../sf-normalizer) - Normalize SuccessFactors responses\r\n- [`@cap-sf-sdk/core`](../core) - Complete SDK with all packages\r\n\r\n## 🤝 Contributing\r\n\r\nSee the [main repository](../../README.md#contributing) for contribution guidelines.\r\n\r\n## 📄 License\r\n\r\nMIT - see [LICENSE](../../LICENSE) for details.\r\n\r\nGenerated API reference is available locally after running the docs task. It uses TypeDoc to extract JSDoc from the TypeScript source.\r\n\r\nGenerate docs:\r\n\r\n```powershell\r\nnpm run docs\r\n```\r\n\r\nThis produces static HTML in the `docs/` directory. Open `docs/index.html` in a browser.\r\n","readmeFilename":"README.md"}