{"_id":"@arcanalabs/query-builder","_rev":"7-fbd955969e28bf9f13edcb24835fbf1d","name":"@arcanalabs/query-builder","dist-tags":{"latest":"0.0.7"},"versions":{"0.0.1":{"name":"@arcanalabs/query-builder","version":"0.0.1","keywords":["query-builder","prisma","typescript"],"author":{"name":"Leonardo Caldas"},"license":"MIT","_id":"@arcanalabs/query-builder@0.0.1","maintainers":[{"name":"arcanalabs","email":"tech@arcanalabs.com.br"}],"dist":{"shasum":"98715e52d11fa825fda44a2a503a262e377a4095","tarball":"https://registry.npmjs.org/@arcanalabs/query-builder/-/query-builder-0.0.1.tgz","fileCount":14,"integrity":"sha512-HCUxTXGF4JKfsQjSNjyLPMp5e8Ya6IYPCN9Vc+JPq4dycsww8JcpNgXVVi5a93gNhtFUWygR1F4wv4M1Pi4cVg==","signatures":[{"sig":"MEUCIQD0+2Gtq9BDAGUm5fXwnt75xTexOpivwn/us3H15tW1zgIgV2WlpjDrRph2LAXegtkSikaK/tPrNGUwolSb3YJw59w=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":34706},"main":"dist/index.js","types":"dist/index.d.ts","module":"dist/index.mjs","gitHead":"1440644ad5afafcd08682679ddada0974e6981ce","scripts":{"lint":"eslint src/**/*.ts","test":"vitest run","build":"tsup src/index.ts --format cjs,esm --dts"},"_npmUser":{"name":"arcanalabs","email":"tech@arcanalabs.com.br"},"_npmVersion":"10.9.2","description":"Composable Query Builder for TypeScript","directories":{},"_nodeVersion":"22.17.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","vitest":"^1.0.0","typescript":"^5.0.0"},"peerDependencies":{"@prisma/client":"*"},"_npmOperationalInternal":{"tmp":"tmp/query-builder_0.0.1_1765302040035_0.2640270062274388","host":"s3://npm-registry-packages-npm-production"}},"0.0.2":{"name":"@arcanalabs/query-builder","version":"0.0.2","keywords":["query-builder","prisma","typescript"],"author":{"name":"Leonardo Caldas"},"license":"MIT","_id":"@arcanalabs/query-builder@0.0.2","maintainers":[{"name":"arcanalabs","email":"tech@arcanalabs.com.br"}],"dist":{"shasum":"44c7179b1678836837e2222e259507e2bbe00eeb","tarball":"https://registry.npmjs.org/@arcanalabs/query-builder/-/query-builder-0.0.2.tgz","fileCount":14,"integrity":"sha512-Rz1VuHngZF/8G526b7ZQRhyA58a0tljGvX50A/mT0mOOsMyUXdDK2ImvHuiUNJGV2VL/ROvupK/YlXHlXjhHXg==","signatures":[{"sig":"MEYCIQDzr4n8CI30gNoNFklzLTTQA9sz67juRW0VtisRmPo4iQIhAJdaHUzOaG+Jn1vfenBUK0TZu4xrMpOduWHRDcd/hNem","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":37393},"main":"dist/index.js","types":"dist/index.d.ts","module":"dist/index.mjs","gitHead":"1440644ad5afafcd08682679ddada0974e6981ce","scripts":{"lint":"eslint src/**/*.ts","test":"vitest run","build":"tsup src/index.ts --format cjs,esm --dts"},"_npmUser":{"name":"arcanalabs","email":"tech@arcanalabs.com.br"},"_npmVersion":"10.9.2","description":"Composable Query Builder for TypeScript","directories":{},"_nodeVersion":"22.17.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","vitest":"^1.0.0","typescript":"^5.0.0"},"peerDependencies":{"@prisma/client":"*"},"_npmOperationalInternal":{"tmp":"tmp/query-builder_0.0.2_1765302538654_0.32209420137137745","host":"s3://npm-registry-packages-npm-production"}},"0.0.3":{"name":"@arcanalabs/query-builder","version":"0.0.3","keywords":["query-builder","prisma","typescript"],"author":{"name":"Leonardo Caldas"},"license":"MIT","_id":"@arcanalabs/query-builder@0.0.3","maintainers":[{"name":"arcanalabs","email":"tech@arcanalabs.com.br"}],"dist":{"shasum":"9bf42b29c5f72da912dbf98556afdf3065a1b5ed","tarball":"https://registry.npmjs.org/@arcanalabs/query-builder/-/query-builder-0.0.3.tgz","fileCount":14,"integrity":"sha512-+YxYCmQPFMui1S6QL+Qub3caj0cJEWOb0McVocKSTfK5u7OMgVK8+k9WW03+CsuVI9PCZXCIfuM8ZTwCQ1QHrg==","signatures":[{"sig":"MEUCIQDyqvKzVlhfA4EMPk7LSogDW5bpKqeoHcuzQvDz8r0kdgIgKAyUjYDXfjg3qV7sF/teqNZJ6Qn5JCmAl+QXAz5aZt0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":38181},"main":"dist/index.js","types":"dist/index.d.ts","module":"dist/index.mjs","gitHead":"1440644ad5afafcd08682679ddada0974e6981ce","scripts":{"lint":"eslint src/**/*.ts","test":"vitest run","build":"tsup src/index.ts --format cjs,esm --dts"},"_npmUser":{"name":"arcanalabs","email":"tech@arcanalabs.com.br"},"_npmVersion":"10.9.2","description":"Composable Query Builder for TypeScript","directories":{},"_nodeVersion":"22.17.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","vitest":"^1.0.0","typescript":"^5.0.0"},"peerDependencies":{"@prisma/client":"*"},"_npmOperationalInternal":{"tmp":"tmp/query-builder_0.0.3_1765419191515_0.6965384529070129","host":"s3://npm-registry-packages-npm-production"}},"0.0.4":{"name":"@arcanalabs/query-builder","version":"0.0.4","keywords":["query-builder","prisma","typescript"],"author":{"name":"Leonardo Caldas"},"license":"MIT","_id":"@arcanalabs/query-builder@0.0.4","maintainers":[{"name":"arcanalabs","email":"tech@arcanalabs.com.br"}],"dist":{"shasum":"88f26a5469562a6e4df983ce999e1cfa595ecb35","tarball":"https://registry.npmjs.org/@arcanalabs/query-builder/-/query-builder-0.0.4.tgz","fileCount":14,"integrity":"sha512-VJ8dlj4E5mWwKaIU28VpAtYwXH9rxiJ6MW0Z4GsDaPFoIa2KiYO+iNh6r4gK8LW/72LlPU8W+9G+RvvkGt7grA==","signatures":[{"sig":"MEQCIC+6r43Zq1DiLWPwX9qlQeMSLaaAql/g9ZBgmXP3v8H+AiA1tI11UyZk0gy5L7w34jv3drpz/TtefDE3aOXpSnF1Yw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":38357},"main":"dist/index.js","types":"dist/index.d.ts","module":"dist/index.mjs","gitHead":"1440644ad5afafcd08682679ddada0974e6981ce","scripts":{"lint":"eslint src/**/*.ts","test":"vitest run","build":"tsup src/index.ts --format cjs,esm --dts"},"_npmUser":{"name":"arcanalabs","email":"tech@arcanalabs.com.br"},"_npmVersion":"10.9.2","description":"Composable Query Builder for TypeScript","directories":{},"_nodeVersion":"22.17.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","vitest":"^1.0.0","typescript":"^5.0.0"},"peerDependencies":{"@prisma/client":"*"},"_npmOperationalInternal":{"tmp":"tmp/query-builder_0.0.4_1765421833514_0.44594501501279793","host":"s3://npm-registry-packages-npm-production"}},"0.0.5":{"name":"@arcanalabs/query-builder","version":"0.0.5","keywords":["query-builder","prisma","typescript"],"author":{"name":"Leonardo Caldas"},"license":"MIT","_id":"@arcanalabs/query-builder@0.0.5","maintainers":[{"name":"arcanalabs","email":"tech@arcanalabs.com.br"}],"dist":{"shasum":"a506aac39762db5c38104d1ff50a11992568bb9e","tarball":"https://registry.npmjs.org/@arcanalabs/query-builder/-/query-builder-0.0.5.tgz","fileCount":14,"integrity":"sha512-/XspqgWmI/5xKoVMsnudMzuZWjbLMU895HjYDDAKe3CBf09IQzrOp7E2/C9+BE7kDGI6GJBTDBA0fVtgdmpcyg==","signatures":[{"sig":"MEUCIQDFXnQ6RwLWJDwHui81amcgNhqHZZp/o0eswMYWnD0YLAIgKjkGte/OhyzeWEGrC2mwQB0+PJLywV8ueq9X9neGgU4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":38435},"main":"dist/index.js","types":"dist/index.d.ts","module":"dist/index.mjs","gitHead":"1440644ad5afafcd08682679ddada0974e6981ce","scripts":{"lint":"eslint src/**/*.ts","test":"vitest run","build":"tsup src/index.ts --format cjs,esm --dts"},"_npmUser":{"name":"arcanalabs","email":"tech@arcanalabs.com.br"},"_npmVersion":"10.9.2","description":"Composable Query Builder for TypeScript","directories":{},"_nodeVersion":"22.17.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","vitest":"^1.0.0","typescript":"^5.0.0"},"peerDependencies":{"@prisma/client":"*"},"_npmOperationalInternal":{"tmp":"tmp/query-builder_0.0.5_1765422221468_0.8016527423243236","host":"s3://npm-registry-packages-npm-production"}},"0.0.6":{"name":"@arcanalabs/query-builder","version":"0.0.6","keywords":["query-builder","prisma","typescript"],"author":{"name":"Leonardo Caldas"},"license":"MIT","_id":"@arcanalabs/query-builder@0.0.6","maintainers":[{"name":"arcanalabs","email":"tech@arcanalabs.com.br"}],"dist":{"shasum":"854d3701b12f403698ed5f4c88039f90224aa1e1","tarball":"https://registry.npmjs.org/@arcanalabs/query-builder/-/query-builder-0.0.6.tgz","fileCount":14,"integrity":"sha512-UlZ77j7YdVyqqUmoD+e6pNrNx2D5Gthhuxk7YhdsSURTRFQR84jEmnAcig3Nr6qrU2eZIMywjU0+0vXN+J1PNw==","signatures":[{"sig":"MEUCIAxg2nBl/br6Ig9iiyou9fYQgRAy+4bRfgmNXrU9Tlw6AiEArT8MWJaNkBoR8Ey+p+pm7HxZK+a0PsnAf9YVAvjmLMo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":39017},"main":"dist/index.js","types":"dist/index.d.ts","module":"dist/index.mjs","gitHead":"1440644ad5afafcd08682679ddada0974e6981ce","scripts":{"lint":"eslint src/**/*.ts","test":"vitest run","build":"tsup src/index.ts --format cjs,esm --dts"},"_npmUser":{"name":"arcanalabs","email":"tech@arcanalabs.com.br"},"_npmVersion":"10.9.2","description":"Composable Query Builder for TypeScript","directories":{},"_nodeVersion":"22.17.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","vitest":"^1.0.0","typescript":"^5.0.0"},"peerDependencies":{"@prisma/client":"*"},"_npmOperationalInternal":{"tmp":"tmp/query-builder_0.0.6_1765599772231_0.8892195867032888","host":"s3://npm-registry-packages-npm-production"}},"0.0.7":{"name":"@arcanalabs/query-builder","version":"0.0.7","description":"Composable Query Builder for TypeScript","main":"dist/index.js","module":"dist/index.mjs","types":"dist/index.d.ts","scripts":{"build":"tsup src/index.ts --format cjs,esm --dts","lint":"eslint src/**/*.ts","test":"vitest run"},"keywords":["query-builder","prisma","typescript"],"author":{"name":"Leonardo Caldas"},"license":"MIT","devDependencies":{"tsup":"^8.0.0","typescript":"^5.0.0","vitest":"^1.0.0"},"peerDependencies":{"@prisma/client":"*"},"publishConfig":{"access":"public"},"gitHead":"01bee72d49615e752ac19cc6c80804d6e35ebc2c","_id":"@arcanalabs/query-builder@0.0.7","_nodeVersion":"24.12.0","_npmVersion":"11.6.2","dist":{"integrity":"sha512-9M14dQlG2W1rkABJkAVmJEAbcEOVZhmlfWjurC7jWE8Ea9xbDJzu672Rgdw0KvD9RroKs2PMMUoucHZE2z3Rag==","shasum":"d68055fd2ffea4bc0c7eef12840bbacc36daeaa3","tarball":"https://registry.npmjs.org/@arcanalabs/query-builder/-/query-builder-0.0.7.tgz","fileCount":10,"unpackedSize":38375,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQCnT3totlXlLynWQOKxQrigNJ9e00x2QmnYjYInJQW8UQIhAJi+FdQmX0vnP2x4mTunDlWGzNlmdJw6b+V5/Q8KnyrY"}]},"_npmUser":{"name":"arcanalabs","email":"tech@arcanalabs.com.br"},"directories":{},"maintainers":[{"name":"arcanalabs","email":"tech@arcanalabs.com.br"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/query-builder_0.0.7_1765656824331_0.5335956761954053"},"_hasShrinkwrap":false}},"time":{"created":"2025-12-09T17:40:39.923Z","modified":"2025-12-13T20:13:44.641Z","0.0.1":"2025-12-09T17:40:40.161Z","0.0.2":"2025-12-09T17:48:58.802Z","0.0.3":"2025-12-11T02:13:11.676Z","0.0.4":"2025-12-11T02:57:13.652Z","0.0.5":"2025-12-11T03:03:41.620Z","0.0.6":"2025-12-13T04:22:52.412Z","0.0.7":"2025-12-13T20:13:44.472Z"},"author":{"name":"Leonardo Caldas"},"license":"MIT","keywords":["query-builder","prisma","typescript"],"description":"Composable Query Builder for TypeScript","maintainers":[{"name":"arcanalabs","email":"tech@arcanalabs.com.br"}],"readme":"# @arcanalabs/query-builder\n\nA composable, type-safe query builder for TypeScript and Prisma.\nEfficiently handles filtering, sorting, and pagination from request parameters.\n\n## Installation\n\n```bash\nnpm install @arcanalabs/query-builder\n```\n\n## Usage\n\n### Basic Usage\n\nImport `QueryBuilder` and `QueryBuilderParams` to start transforming request objects into Prisma-compatible arguments.\n\n```typescript\nimport { QueryBuilder, QueryBuilderParams } from '@arcanalabs/query-builder';\nimport { PrismaClient } from '@prisma/client';\n\nconst prisma = new PrismaClient();\n\n// Assume 'request.query' comes from your API framework (Express, Fastify, etc.)\n// e.g. ?filter[name]=Alice&page=2&perPage=10\nasync function getUsers(requestQuery: any) {\n    const params = QueryBuilderParams.fromRequest(requestQuery);\n    \n    // Create params, applying logic like allowed filters\n    params.setAllowedFilters(['name', 'email']);\n\n    const qb = QueryBuilder.for(prisma.user, params);\n    \n    // Execute query\n    const result = await qb.get();\n    \n    return result; \n    // Returns: { data: [...], meta: { total, page, per_page, last_page }, aggregates: {} }\n}\n```\n\n### Advanced Filtering\n\n#### Name Mapping\nMap public API parameters to different internal database fields.\n\n```typescript\nconst params = QueryBuilderParams.fromRequest(requestQuery)\n    .filterNameMapping({\n        'q': 'name', // ?filter[q]=Alice -> where: { name: 'Alice' }\n        'active': 'status'\n    });\n```\n\n#### Custom Behaviors\nDefine custom logic for specific fields, such as date ranges or complex lookups.\n\n```typescript\nconst params = QueryBuilderParams.fromRequest(requestQuery)\n    .setFilterBehaviors({\n        'created_at': (value) => {\n             // ?filter[created_at]=2023-01-01\n            return {\n                gte: `${value}T00:00:00.000Z`,\n                lte: `${value}T23:59:59.999Z`\n            };\n        }\n    });\n```\n\n#### Where In\nPass comma-separated values or an array to automatically generate `in` clauses.\n\n```typescript\n// ?filter[status]=active,pending\n// OR ?filter[status][]=active&filter[status][]=pending\n// Generates: where: { status: { in: ['active', 'pending'] } }\n```\n\n#### Relation Filtering\nUse dot notation to filter by related records.\n\n```typescript\n// ?filter[profile.age]=25\n// Generates: where: { profile: { age: 25 } }\n```\n\n## Pagination\n\nPagination is handled automatically.\n- Default `page`: 1\n- Default `perPage`: 15 (Configurable via `params.setPerPage(20)`)\n\nSupports both `per_page` (snake_case) and `perPage` (camelCase) in query parameters.\n\n## License\n\nMIT\n","readmeFilename":"README.md"}