{"_id":"@asaidimu/query-pocketbase","name":"@asaidimu/query-pocketbase","dist-tags":{"latest":"1.0.0"},"versions":{"1.0.0":{"name":"@asaidimu/query-pocketbase","version":"1.0.0","description":"Pocketbase Query Executor","main":"index.js","types":"index.d.ts","keywords":["typescript"],"author":{"name":"Saidimu","email":"47994458+asaidimu@users.noreply.github.com"},"license":"MIT","repository":{"type":"git","url":"git+https://github.com/asaidimu/query-pocketbase.git"},"bugs":{"url":"https://github.com/asaidimu/query-pocketbase/issues"},"homepage":"https://github.com/asaidimu/query-pocketbase#readme","publishConfig":{"registry":"https://registry.npmjs.org/","tag":"latest","access":"public"},"dependencies":{},"_id":"@asaidimu/query-pocketbase@1.0.0","gitHead":"b99cebde192f589866ac6436da1ca7473a030b4c","_nodeVersion":"20.18.0","_npmVersion":"10.8.2","dist":{"integrity":"sha512-uLCa80rFrQuBpoU5EpV/z4y7X43H1O1/L0GZwQYv0AvkA8dmHajlWnrVl03lgBlED/TrTej4fUyBJ79dI0V2KA==","shasum":"c654bb9c9048eddb4c7397f4006b0d3c37fe5328","tarball":"https://registry.npmjs.org/@asaidimu/query-pocketbase/-/query-pocketbase-1.0.0.tgz","fileCount":7,"unpackedSize":6919,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIC0t+QcAcl1OTxyxK3lYT9uWBaRUTM68kLTvJtEWOVUbAiB2nAj46g7LpwSK40QJucAUS5XeHF4e0Igo+dhXyQohtw=="}]},"_npmUser":{"name":"asaidimu","email":"lolokilesaidimu@gmail.com"},"directories":{},"maintainers":[{"name":"asaidimu","email":"lolokilesaidimu@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/query-pocketbase_1.0.0_1738073522979_0.3650222649006367"},"_hasShrinkwrap":false}},"time":{"created":"2025-01-28T14:12:02.827Z","1.0.0":"2025-01-28T14:12:03.203Z","modified":"2025-01-28T14:12:03.571Z"},"maintainers":[{"name":"asaidimu","email":"lolokilesaidimu@gmail.com"}],"description":"Pocketbase Query Executor","homepage":"https://github.com/asaidimu/query-pocketbase#readme","keywords":["typescript"],"repository":{"type":"git","url":"git+https://github.com/asaidimu/query-pocketbase.git"},"author":{"name":"Saidimu","email":"47994458+asaidimu@users.noreply.github.com"},"bugs":{"url":"https://github.com/asaidimu/query-pocketbase/issues"},"license":"MIT","readme":"# @asaidimu/query-pocketbase\n\nA PocketBase executor for @asaidimu/query, providing a flexible and type-safe way to build and execute complex queries against PocketBase collections.\n\n## Features\n\n- 🎯 **Type-safe**: Full TypeScript support with generic types for your data models\n- 🔄 **Query Builder Integration**: Seamless integration with @asaidimu/query's QueryBuilder\n- 🚀 **Advanced Querying**: Support for complex filters, sorting, pagination, and more\n- 📊 **Data Processing**: Built-in support for aggregations, window functions, and computed fields\n- 🔍 **Smart Caching**: Automatic caching of subquery results for better performance\n- 🛠️ **Extended Functions**: Simulated support for additional functions not natively available in PocketBase\n\n## Installation\n\n```bash\n# Using npm\nnpm install @asaidimu/query @asaidimu/query-pocketbase pocketbase\n\n# Using yarn\nyarn add @asaidimu/query @asaidimu/query-pocketbase pocketbase\n\n# Using pnpm\npnpm add @asaidimu/query @asaidimu/query-pocketbase pocketbase\n```\n\n## Quick Start\n\n```typescript\nimport PocketBase from 'pocketbase';\nimport { QueryBuilder } from '@asaidimu/query';\nimport { PocketBaseQueryExecutor } from '@asaidimu/query-pocketbase';\n\n// Define your data model\ninterface User {\n  id: string;\n  name: string;\n  email: string;\n  age: number;\n  status: 'active' | 'inactive';\n}\n\n// Initialize PocketBase client and executor\nconst pb = new PocketBase('http://127.0.0.1:8090');\nconst executor = new PocketBaseQueryExecutor<User>(pb, 'users');\n\n// Build and execute a query\nasync function getActiveAdultUsers() {\n  const query = new QueryBuilder<User>()\n    .where({\n      operator: 'and',\n      conditions: [\n        { field: 'age', operator: 'gte', value: 18 },\n        { field: 'status', operator: 'eq', value: 'active' }\n      ]\n    })\n    .orderBy('name', 'asc')\n    .offset(0, 10)\n    .include(['id', 'name', 'email'])\n    .build();\n\n  const result = await executor.execute(query);\n  return result;\n}\n```\n\n## Supported Operations\n\n### Filtering\n\n```typescript\n// Simple filter\n.where({ field: 'age', operator: 'gte', value: 18 })\n\n// Complex conditions\n.where({\n  operator: 'and',\n  conditions: [\n    { field: 'age', operator: 'gte', value: 18 },\n    {\n      operator: 'or',\n      conditions: [\n        { field: 'status', operator: 'eq', value: 'active' },\n        { field: 'role', operator: 'eq', value: 'admin' }\n      ]\n    }\n  ]\n})\n```\n\n### Sorting\n\n```typescript\n.orderBy('name', 'asc')\n```\n\n### Pagination\n\n```typescript\n// Offset-based\n.offset(0, 10)\n\n// Cursor-based\n.cursor('last_id', 10, 'forward')\n```\n\n### Projections\n\n```typescript\n// Include specific fields\n.include(['id', 'name', 'email'])\n\n// Exclude fields\n.exclude(['password', 'secretKey'])\n\n// Computed fields\n.computed({\n  function: 'CONCAT',\n  arguments: [\n    { type: 'field', field: 'firstName' },\n    ' ',\n    { type: 'field', field: 'lastName' }\n  ]\n}, 'fullName')\n```\n\n### Aggregations\n\n```typescript\n.aggregate(['department'], [\n  { operation: 'sum', field: 'salary', alias: 'totalSalary' },\n  { operation: 'avg', field: 'age', alias: 'averageAge' }\n])\n```\n\n## Supported Functions\n\n- String Operations:\n  - `CONCAT`: Concatenate multiple strings\n  - `UPPER`: Convert to uppercase\n  - `LOWER`: Convert to lowercase\n  - `LENGTH`: Get string length\n\n- Numeric Operations:\n  - `ROUND`: Round to nearest integer\n\n- Date Operations:\n  - `NOW`: Current timestamp\n  - `DATE_FORMAT`: Format date strings\n\n- Utility Functions:\n  - `COALESCE`: Return first non-null value\n\n## PocketBase-Specific Considerations\n\n### Limitations\n\n1. **Subqueries**: Not natively supported by PocketBase. The executor simulates them using multiple queries.\n2. **Complex Joins**: Limited by PocketBase's capabilities. Implemented as separate queries.\n3. **Window Functions**: Simulated in memory as PocketBase doesn't support them natively.\n\n### Performance Tips\n\n1. **Use Indexes**: Ensure fields used in filters and sorts are indexed in PocketBase.\n2. **Limit Results**: Always use pagination to limit result sets.\n3. **Optimize Projections**: Only request needed fields to reduce data transfer.\n\n## Error Handling\n\nThe executor provides detailed error messages for common issues:\n\n```typescript\ntry {\n  const result = await executor.execute(query);\n} catch (error) {\n  if (error.message.includes('Query execution failed')) {\n    // Handle query execution errors\n  }\n}\n```\n\n## TypeScript Support\n\nThe executor is fully typed and provides type inference:\n\n```typescript\ninterface MyModel {\n  id: string;\n  name: string;\n  // ... other fields\n}\n\nconst executor = new PocketBaseQueryExecutor<MyModel>(pb, 'collection');\n// Now all queries will be type-checked against MyModel\n```\n\n## Contributing\n\nContributions are welcome! Please read our [Contributing Guide](CONTRIBUTING.md) for details on our code of conduct and the process for submitting pull requests.\n\n## License\n\nMIT License - see the [LICENSE](LICENSE) file for details.\n","readmeFilename":"README.md"}