{"_id":"@dava96/osrs-wiki-bucket-builder","_rev":"8-7e0d3efe707ef4ffe059c24e89cfcd68","name":"@dava96/osrs-wiki-bucket-builder","dist-tags":{"latest":"1.0.12"},"versions":{"1.0.0":{"name":"@dava96/osrs-wiki-bucket-builder","version":"1.0.0","keywords":[],"author":"","license":"ISC","_id":"@dava96/osrs-wiki-bucket-builder@1.0.0","maintainers":[{"name":"dava96","email":"Davidlomath@hotmail.co.uk"}],"dist":{"shasum":"b8af5979ffd8c668aa9006fdd4cb05d417876599","tarball":"https://registry.npmjs.org/@dava96/osrs-wiki-bucket-builder/-/osrs-wiki-bucket-builder-1.0.0.tgz","fileCount":18,"integrity":"sha512-AOOPxeGEL2H4rHRKsfcxtpWh5kmhLj12YN0ZhBWGlwnd32zqrZ+BYT9uOuLuXQ29M3Qgdi+WC2Qq1EFiJ8o3jA==","signatures":[{"sig":"MEQCIGUoE6hLekK+iYtF39yzIMdMELYFYZnVi1nZsQSPDBb4AiBNWoDB1uUi5xFpw7iRSxX+gSILzC4hHwcRHaJwDEe9vw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":102588},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","gitHead":"b3a437906a4bb326c686f64bbdaff9427c847963","scripts":{"lint":"eslint \"src/**/*.ts\"","test":"node --experimental-vm-modules node_modules/jest/bin/jest.js","build":"tsc","format":"prettier --write \"src/**/*.{ts,json}\"","buckets":"npx tsx .\\scripts\\sync_buckets.ts","prepare":"husky","pretest":"npm run lint","format:check":"prettier --check \"src/**/*.{ts,json}\""},"_npmUser":{"name":"dava96","email":"Davidlomath@hotmail.co.uk"},"_npmVersion":"10.7.0","description":"A strictly typed, zero-dependency query builder for the [Old School RuneScape Wiki Bucket API](https://meta.weirdgloop.org/w/Extension:Bucket/Usage).","directories":{},"lint-staged":{"src/**/*.ts":["prettier --write","eslint --fix"],"src/**/*.json":["prettier --write"]},"_nodeVersion":"24.13.0","dependencies":{"@dava96/osrs-icons":"github:dava96/osrs-icons"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.2.0","axios":"^1.13.4","husky":"^9.1.7","eslint":"^9.39.2","globals":"^17.3.0","ts-jest":"^29.4.6","ts-node":"^10.9.2","prettier":"^3.8.1","@eslint/js":"^9.39.2","typescript":"^5.9.3","@types/jest":"^30.0.0","@types/node":"^25.2.1","lint-staged":"^16.2.7","@jest/globals":"^30.2.0","typescript-eslint":"^8.54.0","eslint-config-prettier":"^10.1.8","eslint-plugin-prettier":"^5.5.5","@typescript-eslint/parser":"^8.54.0","@typescript-eslint/eslint-plugin":"^8.54.0"},"_npmOperationalInternal":{"tmp":"tmp/osrs-wiki-bucket-builder_1.0.0_1770588234566_0.711994384500277","host":"s3://npm-registry-packages-npm-production"}},"1.0.5":{"name":"@dava96/osrs-wiki-bucket-builder","version":"1.0.5","keywords":["osrs","runescape","wiki","bucket","query-builder","typescript"],"author":{"name":"Dava96"},"license":"MIT","_id":"@dava96/osrs-wiki-bucket-builder@1.0.5","maintainers":[{"name":"dava96","email":"Davidlomath@hotmail.co.uk"}],"homepage":"https://dava96.github.io/osrs-wiki-bucket-builder","bugs":{"url":"https://github.com/Dava96/osrs-wiki-bucket-builder/issues"},"dist":{"shasum":"acb450c17dbff8b81e6af2a1f437579f766d65d4","tarball":"https://registry.npmjs.org/@dava96/osrs-wiki-bucket-builder/-/osrs-wiki-bucket-builder-1.0.5.tgz","fileCount":19,"integrity":"sha512-dUX7kZ64u0vqQT+3N60trRnTsEX+1VTEmGJWN0Ii9RuXdfdCcNhnRp2lQ+G4zsJkDm/COl1lebLlNwyARacGOA==","signatures":[{"sig":"MEQCIDCdJMVgnp3ocHjs/olx5DLAh75UsjnDNnwHRrSWhSefAiBX9sGcvk8fxSpnZJcVOwDiRffhTiK9VHVmwRTohXr0YQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@dava96%2fosrs-wiki-bucket-builder@1.0.5","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":102645},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","gitHead":"743e8228f8375e63f97afc52a80167588e9d1ffb","scripts":{"lint":"eslint \"src/**/*.ts\"","test":"node --experimental-vm-modules node_modules/jest/bin/jest.js","build":"tsc","clean":"node -e \"require('fs').rmSync('dist',{recursive:true,force:true})\"","format":"prettier --write \"src/**/*.{ts,json}\"","buckets":"npx tsx ./scripts/sync_buckets.ts","prepare":"husky","pretest":"npm run lint","prebuild":"npm run clean","format:check":"prettier --check \"src/**/*.{ts,json}\""},"_npmUser":{"name":"dava96","email":"Davidlomath@hotmail.co.uk"},"repository":{"url":"git+https://github.com/Dava96/osrs-wiki-bucket-builder.git","type":"git"},"_npmVersion":"10.8.2","description":"A strictly typed, zero-dependency TypeScript query builder for the Old School RuneScape Wiki Bucket API.","directories":{},"lint-staged":{"src/**/*.ts":["prettier --write","eslint --fix"],"src/**/*.json":["prettier --write"]},"_nodeVersion":"20.20.0","_hasShrinkwrap":false,"devDependencies":{"jest":"^30.2.0","axios":"^1.13.4","husky":"^9.1.7","eslint":"^9.39.2","globals":"^17.3.0","ts-jest":"^29.4.6","ts-node":"^10.9.2","prettier":"^3.8.1","@eslint/js":"^9.39.2","typescript":"^5.9.3","@types/jest":"^30.0.0","@types/node":"^25.2.1","lint-staged":"^16.2.7","@jest/globals":"^30.2.0","typescript-eslint":"^8.54.0","eslint-config-prettier":"^10.1.8","eslint-plugin-prettier":"^5.5.5","@typescript-eslint/parser":"^8.54.0","@typescript-eslint/eslint-plugin":"^8.54.0"},"_npmOperationalInternal":{"tmp":"tmp/osrs-wiki-bucket-builder_1.0.5_1770640458315_0.3576653675677597","host":"s3://npm-registry-packages-npm-production"}},"1.0.6":{"name":"@dava96/osrs-wiki-bucket-builder","version":"1.0.6","keywords":["osrs","runescape","wiki","bucket","query-builder","typescript"],"author":{"name":"Dava96"},"license":"MIT","_id":"@dava96/osrs-wiki-bucket-builder@1.0.6","maintainers":[{"name":"dava96","email":"Davidlomath@hotmail.co.uk"}],"homepage":"https://dava96.github.io/osrs-wiki-bucket-builder","bugs":{"url":"https://github.com/Dava96/osrs-wiki-bucket-builder/issues"},"dist":{"shasum":"405c8711262c18f268cdcd278cb8b3ffcb8a3798","tarball":"https://registry.npmjs.org/@dava96/osrs-wiki-bucket-builder/-/osrs-wiki-bucket-builder-1.0.6.tgz","fileCount":23,"integrity":"sha512-E8NmxTV3PHTTuQ/jZEmY9j9gDUf04ePPm7yWyUUGMocESLrhM16rR3XDoktBl/6D+zKBbmVPiRdWDddIA+U35A==","signatures":[{"sig":"MEYCIQC6p2lO5+zAxaPbJs/OdsK8Cl596xFi9k2CoV83pHcWRwIhANyDdVxUwFP10YC2I4YwcxQJP8kl1Vubm1aSeoK+f6wH","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@dava96%2fosrs-wiki-bucket-builder@1.0.6","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":129761},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","gitHead":"6e9825327d4a9159b383b2e30a7938e835121fb5","scripts":{"lint":"eslint \"src/**/*.ts\"","test":"node --experimental-vm-modules node_modules/jest/bin/jest.js","build":"tsc","clean":"node -e \"require('fs').rmSync('dist',{recursive:true,force:true})\"","format":"prettier --write \"src/**/*.{ts,json}\"","buckets":"npx tsx ./scripts/sync_buckets.ts","prepare":"husky","pretest":"npm run lint","prebuild":"npm run clean","format:check":"prettier --check \"src/**/*.{ts,json}\""},"_npmUser":{"name":"dava96","email":"Davidlomath@hotmail.co.uk"},"repository":{"url":"git+https://github.com/Dava96/osrs-wiki-bucket-builder.git","type":"git"},"_npmVersion":"10.8.2","description":"A strictly typed, zero-dependency TypeScript query builder for the Old School RuneScape Wiki Bucket API.","directories":{},"lint-staged":{"src/**/*.ts":["prettier --write","eslint --fix"],"src/**/*.json":["prettier --write"]},"_nodeVersion":"20.20.0","_hasShrinkwrap":false,"devDependencies":{"jest":"^30.2.0","axios":"^1.13.4","husky":"^9.1.7","eslint":"^9.39.2","globals":"^17.3.0","ts-jest":"^29.4.6","ts-node":"^10.9.2","prettier":"^3.8.1","@eslint/js":"^9.39.2","typescript":"^5.9.3","@types/jest":"^30.0.0","@types/node":"^25.2.1","lint-staged":"^16.2.7","@jest/globals":"^30.2.0","typescript-eslint":"^8.54.0","eslint-config-prettier":"^10.1.8","eslint-plugin-prettier":"^5.5.5","@typescript-eslint/parser":"^8.54.0","@typescript-eslint/eslint-plugin":"^8.54.0"},"_npmOperationalInternal":{"tmp":"tmp/osrs-wiki-bucket-builder_1.0.6_1770664997363_0.01341128852218132","host":"s3://npm-registry-packages-npm-production"}},"1.0.7":{"name":"@dava96/osrs-wiki-bucket-builder","version":"1.0.7","keywords":["osrs","runescape","wiki","bucket","query-builder","typescript"],"author":{"name":"Dava96"},"license":"MIT","_id":"@dava96/osrs-wiki-bucket-builder@1.0.7","maintainers":[{"name":"dava96","email":"Davidlomath@hotmail.co.uk"}],"homepage":"https://dava96.github.io/osrs-wiki-bucket-builder","bugs":{"url":"https://github.com/Dava96/osrs-wiki-bucket-builder/issues"},"dist":{"shasum":"c36cbe90c7deaf4300081a5b652a1b13ed57f0f1","tarball":"https://registry.npmjs.org/@dava96/osrs-wiki-bucket-builder/-/osrs-wiki-bucket-builder-1.0.7.tgz","fileCount":23,"integrity":"sha512-EO7GNf/1CATNfpqSHkoof2xgDGe2Od0r5sHfpGncipEvhFbkHTgPTockUWMzCEDwzlORPNnJyJ/tB42xnEbSRQ==","signatures":[{"sig":"MEUCIGZojxvMyv6DlBsatmX0qOzV2AJ/ezgTFFmpEu3D2T5VAiEA2CcDyYf4nttO6XYaVofOMrweUSQmqLCQS8NTBL/ODjI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@dava96%2fosrs-wiki-bucket-builder@1.0.7","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":130518},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","gitHead":"7e3abdaaf9865b03d9e1c8b07aa2ab5a57b7c4c1","scripts":{"lint":"eslint \"src/**/*.ts\"","test":"node --experimental-vm-modules node_modules/jest/bin/jest.js","build":"tsc","clean":"node -e \"require('fs').rmSync('dist',{recursive:true,force:true})\"","format":"prettier --write \"src/**/*.{ts,json}\"","buckets":"npx tsx ./scripts/sync_buckets.ts","prepare":"husky","pretest":"npm run lint","prebuild":"npm run clean","format:check":"prettier --check \"src/**/*.{ts,json}\""},"_npmUser":{"name":"dava96","email":"Davidlomath@hotmail.co.uk"},"repository":{"url":"git+https://github.com/Dava96/osrs-wiki-bucket-builder.git","type":"git"},"_npmVersion":"10.8.2","description":"A strictly typed, zero-dependency TypeScript query builder for the Old School RuneScape Wiki Bucket API.","directories":{},"lint-staged":{"src/**/*.ts":["prettier --write","eslint --fix"],"src/**/*.json":["prettier --write"]},"_nodeVersion":"20.20.0","_hasShrinkwrap":false,"devDependencies":{"jest":"^30.2.0","axios":"^1.13.4","husky":"^9.1.7","eslint":"^9.39.2","globals":"^17.3.0","ts-jest":"^29.4.6","ts-node":"^10.9.2","prettier":"^3.8.1","@eslint/js":"^9.39.2","typescript":"^5.9.3","@types/jest":"^30.0.0","@types/node":"^25.2.1","lint-staged":"^16.2.7","@jest/globals":"^30.2.0","typescript-eslint":"^8.54.0","eslint-config-prettier":"^10.1.8","eslint-plugin-prettier":"^5.5.5","@typescript-eslint/parser":"^8.54.0","@typescript-eslint/eslint-plugin":"^8.54.0"},"_npmOperationalInternal":{"tmp":"tmp/osrs-wiki-bucket-builder_1.0.7_1770677018519_0.5356053677073065","host":"s3://npm-registry-packages-npm-production"}},"1.0.8":{"name":"@dava96/osrs-wiki-bucket-builder","version":"1.0.8","keywords":["osrs","runescape","wiki","bucket","query-builder","typescript"],"author":{"name":"Dava96"},"license":"MIT","_id":"@dava96/osrs-wiki-bucket-builder@1.0.8","maintainers":[{"name":"dava96","email":"Davidlomath@hotmail.co.uk"}],"homepage":"https://dava96.github.io/osrs-wiki-bucket-builder","bugs":{"url":"https://github.com/Dava96/osrs-wiki-bucket-builder/issues"},"dist":{"shasum":"63c6dc7eb6e9480e7f6ffbdb401eed16099b4543","tarball":"https://registry.npmjs.org/@dava96/osrs-wiki-bucket-builder/-/osrs-wiki-bucket-builder-1.0.8.tgz","fileCount":23,"integrity":"sha512-vGnToPOYEvwG/l1s47NVdNLXT/GOTASs7kquNR+PjfkryfjdQf/2pJjGtuXyJ6RCgxPWEqdSZc4bc59lDTTKaA==","signatures":[{"sig":"MEYCIQDEpSbHDIIHVhGEsbEqenuIL4Dq6lMLyQLA2tA2DbCdrgIhANi/sOTAeh5nakUAzuRNDfo05Csb2A4If1X2LL9DIhk9","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@dava96%2fosrs-wiki-bucket-builder@1.0.8","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":131279},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","gitHead":"8f4c5491279868eb7964ef09249386031918febe","scripts":{"lint":"eslint \"src/**/*.ts\"","test":"node --experimental-vm-modules node_modules/jest/bin/jest.js","build":"tsc","clean":"node -e \"require('fs').rmSync('dist',{recursive:true,force:true})\"","format":"prettier --write \"src/**/*.{ts,json}\"","buckets":"npx tsx ./scripts/sync_buckets.ts","prepare":"husky","pretest":"npm run lint","prebuild":"npm run clean","format:check":"prettier --check \"src/**/*.{ts,json}\""},"_npmUser":{"name":"dava96","email":"Davidlomath@hotmail.co.uk"},"repository":{"url":"git+https://github.com/Dava96/osrs-wiki-bucket-builder.git","type":"git"},"_npmVersion":"10.8.2","description":"A strictly typed, zero-dependency TypeScript query builder for the Old School RuneScape Wiki Bucket API.","directories":{},"lint-staged":{"src/**/*.ts":["prettier --write","eslint --fix"],"src/**/*.json":["prettier --write"]},"_nodeVersion":"20.20.0","_hasShrinkwrap":false,"devDependencies":{"jest":"^30.2.0","axios":"^1.13.4","husky":"^9.1.7","eslint":"^9.39.2","globals":"^17.3.0","ts-jest":"^29.4.6","ts-node":"^10.9.2","prettier":"^3.8.1","@eslint/js":"^9.39.2","typescript":"^5.9.3","@types/jest":"^30.0.0","@types/node":"^25.2.1","lint-staged":"^16.2.7","@jest/globals":"^30.2.0","typescript-eslint":"^8.54.0","eslint-config-prettier":"^10.1.8","eslint-plugin-prettier":"^5.5.5","@typescript-eslint/parser":"^8.54.0","@typescript-eslint/eslint-plugin":"^8.54.0"},"_npmOperationalInternal":{"tmp":"tmp/osrs-wiki-bucket-builder_1.0.8_1770726864361_0.19145820060556495","host":"s3://npm-registry-packages-npm-production"}},"1.0.9":{"name":"@dava96/osrs-wiki-bucket-builder","version":"1.0.9","keywords":["osrs","runescape","wiki","bucket","query-builder","typescript"],"author":{"name":"Dava96"},"license":"MIT","_id":"@dava96/osrs-wiki-bucket-builder@1.0.9","maintainers":[{"name":"dava96","email":"Davidlomath@hotmail.co.uk"}],"homepage":"https://dava96.github.io/osrs-wiki-bucket-builder","bugs":{"url":"https://github.com/Dava96/osrs-wiki-bucket-builder/issues"},"dist":{"shasum":"f7b23921b9eafaf7ff4b724d810db849cdd15846","tarball":"https://registry.npmjs.org/@dava96/osrs-wiki-bucket-builder/-/osrs-wiki-bucket-builder-1.0.9.tgz","fileCount":23,"integrity":"sha512-Ai4NwWZV2uMTS4Q8SnrO02rKWAfuY+FtEdmymDVq3T8A3NPYTY2dnPBMxBeVUB/PzDyRL2LvMNcnkn7smYdszA==","signatures":[{"sig":"MEUCIQDU3l0nJgx9b9H+OeoPn4NJWQ2JQHPuxQGPjoEll/ULkAIgAO8Q7JdP98y/MleLJPEAQnAXOAXoi1pZp1wadUK+AIk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@dava96%2fosrs-wiki-bucket-builder@1.0.9","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":133109},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","gitHead":"61eba6291d203c1dff8993bf1ff771c42229de66","scripts":{"knip":"knip","lint":"eslint \"src/**/*.ts\"","test":"node --experimental-vm-modules node_modules/jest/bin/jest.js","build":"tsc","clean":"node -e \"require('fs').rmSync('dist',{recursive:true,force:true})\"","format":"prettier --write \"src/**/*.{ts,json}\"","buckets":"npx tsx ./scripts/sync_buckets.ts","prepare":"husky","pretest":"npm run lint","prebuild":"npm run clean","format:check":"prettier --check \"src/**/*.{ts,json}\""},"_npmUser":{"name":"dava96","email":"Davidlomath@hotmail.co.uk"},"repository":{"url":"git+https://github.com/Dava96/osrs-wiki-bucket-builder.git","type":"git"},"_npmVersion":"10.8.2","description":"A strictly typed, zero-dependency TypeScript query builder for the Old School RuneScape Wiki Bucket API.","directories":{},"lint-staged":{"src/**/*.ts":["prettier --write","eslint --fix"],"src/**/*.json":["prettier --write"]},"_nodeVersion":"20.20.0","_hasShrinkwrap":false,"devDependencies":{"jest":"^30.2.0","knip":"^5.85.0","axios":"^1.13.4","husky":"^9.1.7","eslint":"^9.39.2","globals":"^17.3.0","ts-jest":"^29.4.6","prettier":"^3.8.1","@eslint/js":"^9.39.2","typescript":"^5.9.3","@types/jest":"^30.0.0","@types/node":"^25.3.3","lint-staged":"^16.2.7","@jest/globals":"^30.2.0","typescript-eslint":"^8.54.0","eslint-config-prettier":"^10.1.8","eslint-plugin-prettier":"^5.5.5"},"_npmOperationalInternal":{"tmp":"tmp/osrs-wiki-bucket-builder_1.0.9_1772495839781_0.40052408040154286","host":"s3://npm-registry-packages-npm-production"}},"1.0.11":{"name":"@dava96/osrs-wiki-bucket-builder","version":"1.0.11","keywords":["osrs","runescape","wiki","bucket","query-builder","typescript"],"author":{"name":"Dava96"},"license":"MIT","_id":"@dava96/osrs-wiki-bucket-builder@1.0.11","maintainers":[{"name":"dava96","email":"Davidlomath@hotmail.co.uk"}],"homepage":"https://dava96.github.io/osrs-wiki-bucket-builder","bugs":{"url":"https://github.com/Dava96/osrs-wiki-bucket-builder/issues"},"dist":{"shasum":"9ea3e0697b50c08b0efc2c82c96c2aad932a4fe7","tarball":"https://registry.npmjs.org/@dava96/osrs-wiki-bucket-builder/-/osrs-wiki-bucket-builder-1.0.11.tgz","fileCount":23,"integrity":"sha512-Zv7a9u1/xfgPM0jc0ZtIFNAwaE7IDk1PlU8OnWsT4OXhCEnUy6UTFGqxLN7KIWufZjcNy64MGFeAdAze+7xVEA==","signatures":[{"sig":"MEUCIGP5VW1ODP7JYZesBG/NF+C0MCMNWRcQPM0G0MMJqgfRAiEAo9VAUaq5/LHrlQ4m1qfXcfwSMe+B0TEas5IGBrSSTLA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@dava96%2fosrs-wiki-bucket-builder@1.0.11","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":136606},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","gitHead":"e2a6f037ea211537d82666878fa65fa5575a5963","scripts":{"knip":"knip","lint":"eslint \"src/**/*.ts\"","test":"node --experimental-vm-modules node_modules/jest/bin/jest.js","build":"tsc","clean":"node -e \"require('fs').rmSync('dist',{recursive:true,force:true})\"","format":"prettier --write \"src/**/*.{ts,json}\"","buckets":"npx tsx ./scripts/sync_buckets.ts","prepare":"husky","pretest":"npm run lint","prebuild":"npm run clean","format:check":"prettier --check \"src/**/*.{ts,json}\""},"_npmUser":{"name":"dava96","email":"Davidlomath@hotmail.co.uk"},"repository":{"url":"git+https://github.com/Dava96/osrs-wiki-bucket-builder.git","type":"git"},"_npmVersion":"10.8.2","description":"A strictly typed, zero-dependency TypeScript query builder for the Old School RuneScape Wiki Bucket API.","directories":{},"lint-staged":{"src/**/*.ts":["prettier --write","eslint --fix"],"src/**/*.json":["prettier --write"]},"_nodeVersion":"20.20.2","_hasShrinkwrap":false,"devDependencies":{"jest":"^30.2.0","knip":"^5.85.0","axios":"^1.13.4","husky":"^9.1.7","eslint":"^9.39.2","globals":"^17.3.0","ts-jest":"^29.4.6","prettier":"^3.8.1","@eslint/js":"^9.39.2","typescript":"^5.9.3","@types/jest":"^30.0.0","@types/node":"^25.3.3","lint-staged":"^16.2.7","@jest/globals":"^30.2.0","typescript-eslint":"^8.54.0","eslint-config-prettier":"^10.1.8","eslint-plugin-prettier":"^5.5.5"},"_npmOperationalInternal":{"tmp":"tmp/osrs-wiki-bucket-builder_1.0.11_1775479006293_0.6198047428645805","host":"s3://npm-registry-packages-npm-production"}},"1.0.12":{"name":"@dava96/osrs-wiki-bucket-builder","version":"1.0.12","main":"dist/index.js","types":"dist/index.d.ts","type":"module","scripts":{"test":"node --experimental-vm-modules node_modules/jest/bin/jest.js","lint":"eslint \"src/**/*.ts\"","format":"prettier --write \"src/**/*.{ts,json}\"","format:check":"prettier --check \"src/**/*.{ts,json}\"","pretest":"npm run lint","build":"tsc","clean":"node -e \"require('fs').rmSync('dist',{recursive:true,force:true})\"","prebuild":"npm run clean","buckets":"npx tsx ./scripts/sync_buckets.ts","prepare":"husky","knip":"knip"},"description":"A strictly typed, zero-dependency TypeScript query builder for the Old School RuneScape Wiki Bucket API.","keywords":["osrs","runescape","wiki","bucket","query-builder","typescript"],"author":{"name":"Dava96"},"license":"MIT","repository":{"type":"git","url":"git+https://github.com/Dava96/osrs-wiki-bucket-builder.git"},"homepage":"https://dava96.github.io/osrs-wiki-bucket-builder","bugs":{"url":"https://github.com/Dava96/osrs-wiki-bucket-builder/issues"},"devDependencies":{"@eslint/js":"^9.39.2","@jest/globals":"^30.2.0","@types/jest":"^30.0.0","@types/node":"^25.3.3","axios":"^1.13.4","eslint":"^9.39.2","eslint-config-prettier":"^10.1.8","eslint-plugin-prettier":"^5.5.5","globals":"^17.3.0","husky":"^9.1.7","jest":"^30.2.0","knip":"^5.85.0","lint-staged":"^16.2.7","prettier":"^3.8.1","ts-jest":"^29.4.6","typescript":"^5.9.3","typescript-eslint":"^8.54.0"},"lint-staged":{"src/**/*.ts":["prettier --write","eslint --fix"],"src/**/*.json":["prettier --write"]},"gitHead":"f575e610b39aed6d452830db10cc42498c283d98","_id":"@dava96/osrs-wiki-bucket-builder@1.0.12","_nodeVersion":"24.18.0","_npmVersion":"11.16.0","dist":{"integrity":"sha512-jKP+AgzJNqIOdPRLMX/v7xCl47+u9MntrmqpkDFDoGWrL43YjTVKdPC9/5YCotZhjVeq0S9fpx8GK5Eypi38ow==","shasum":"ee2db4a943c888bb31397d09087ead78c239e4a2","tarball":"https://registry.npmjs.org/@dava96/osrs-wiki-bucket-builder/-/osrs-wiki-bucket-builder-1.0.12.tgz","fileCount":23,"unpackedSize":138720,"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@dava96%2fosrs-wiki-bucket-builder@1.0.12","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIC8E3SmADEijgAiLnoNxgAACOAthacHHvSnIxNNJV5G5AiAX+r6AZM2dPIz9kGgmoFiUr/yABve/YZY3xO/VGZ0SIA=="}]},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:62c5ec26-f888-442d-bf54-2a961ac562f6"}},"directories":{},"maintainers":[{"name":"dava96","email":"Davidlomath@hotmail.co.uk"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/osrs-wiki-bucket-builder_1.0.12_1783368724460_0.8049501775950261"},"_hasShrinkwrap":false}},"time":{"created":"2026-02-08T22:03:54.507Z","modified":"2026-07-06T20:12:05.421Z","1.0.0":"2026-02-08T22:03:54.720Z","1.0.5":"2026-02-09T12:34:18.465Z","1.0.6":"2026-02-09T19:23:17.509Z","1.0.7":"2026-02-09T22:43:38.692Z","1.0.8":"2026-02-10T12:34:24.507Z","1.0.9":"2026-03-02T23:57:19.924Z","1.0.11":"2026-04-06T12:36:46.435Z","1.0.12":"2026-07-06T20:12:04.612Z"},"bugs":{"url":"https://github.com/Dava96/osrs-wiki-bucket-builder/issues"},"author":{"name":"Dava96"},"license":"MIT","homepage":"https://dava96.github.io/osrs-wiki-bucket-builder","keywords":["osrs","runescape","wiki","bucket","query-builder","typescript"],"repository":{"type":"git","url":"git+https://github.com/Dava96/osrs-wiki-bucket-builder.git"},"description":"A strictly typed, zero-dependency TypeScript query builder for the Old School RuneScape Wiki Bucket API.","maintainers":[{"name":"dava96","email":"Davidlomath@hotmail.co.uk"}],"readme":"# OSRS Wiki Bucket Builder\n\n[![npm](https://img.shields.io/npm/v/@dava96/osrs-wiki-bucket-builder)](https://www.npmjs.com/package/@dava96/osrs-wiki-bucket-builder)\n[![npm downloads](https://img.shields.io/npm/dw/@dava96/osrs-wiki-bucket-builder)](https://www.npmjs.com/package/@dava96/osrs-wiki-bucket-builder)\n[![license](https://img.shields.io/npm/l/@dava96/osrs-wiki-bucket-builder)](./LICENSE)\n[![GitHub stars](https://img.shields.io/github/stars/Dava96/osrs-wiki-bucket-builder)](https://github.com/Dava96/osrs-wiki-bucket-builder)\n\nA strictly typed, zero-dependency query builder for the [Old School RuneScape Wiki Bucket API](https://meta.weirdgloop.org/w/Extension:Bucket/Usage).\n\nGenerates valid Lua query strings that can be executed via the Wiki's `action=bucket` API endpoint, with full TypeScript type safety derived from the Wiki's own schema definitions.\n\n## Features\n\n- **Strict Typing** — TypeScript definitions generated from `Special:AllPages` ensure only valid bucket names and fields compile.\n- **Inferred Response Types** — `.select()`, `.join()`, and `.where()` constrain fields to valid names and accumulate a result type that precisely describes each row.\n- **Fluent API** — Chain `.select()`, `.join()`, `.where()`, `.orderBy()`, `.limit()`, `.offset()`.\n- **Join Aliases** — Multi-bucket joins with alias support and dot-notation (`shop.price`).\n- **Wildcard Expansion** — Client-side `*` and `alias.*` expansion to strict field lists.\n- **Zero Runtime Dependencies** — Generates query strings without making network requests.\n\n## Installation\n\n```bash\nnpm install @dava96/osrs-wiki-bucket-builder\n```\n\n## Quick Start\n\n```typescript\nimport { bucket, BucketResponse } from '@dava96/osrs-wiki-bucket-builder';\nimport type { InferBucketResult } from '@dava96/osrs-wiki-bucket-builder';\n\nconst query = bucket('exchange')\n    .select('id', 'name', 'value')\n    .where('name', 'Abyssal whip');\n\n// .toUrl() generates the full API URL, ready to fetch\nconst raw = await fetch(query.toUrl()).then(r => r.json());\n\n// BucketResponse.from() infers the result type from the query\nconst response = BucketResponse.from(query, raw);\nconst whip = response.first();\nconsole.log(whip?.name);  // ✅ typed as string\nconsole.log(whip?.value); // ✅ typed as number\n```\n\n[▶ Run this query](https://oldschool.runescape.wiki/api.php?action=bucket&query=bucket(%27exchange%27).select(%27id%27,%20%27name%27,%20%27value%27).where({%20%27name%27,%20%27Abyssal%20whip%27%20}).run())\n\n---\n\n## Core Concepts\n\n**What are Buckets?** Buckets are structured data tables exposed by the OSRS Wiki through the [Bucket extension](https://meta.weirdgloop.org/w/Extension:Bucket/Usage). Each bucket (e.g. `exchange`, `infobox_item`, `storeline`) contains rows and fields, similar to a SQL table.\n\n**What does this library do?** This library provides a fluent TypeScript API that generates the Lua query strings the Wiki API expects. You chain methods like `.select()`, `.where()`, and `.join()`, and the builder outputs a correctly formatted Lua string. It never makes network requests — you handle fetching yourself.\n\n**How does type safety work?** The `scripts/sync_buckets.ts` script fetches the schema of every bucket from the Wiki and generates TypeScript interfaces in `src/generated/definitions.ts`. This means your IDE will autocomplete bucket names and catch invalid field references at compile time.\n\n---\n\n## Guide\n\n### Selecting Fields\n\nUse `.select()` to pick which fields to retrieve. Without `.select()`, the API returns all fields.\n\n```typescript\nconst query = bucket('exchange')\n    .select('name', 'value', 'limit')\n    .limit(5)\n    .run();\n```\n\n[▶ Run this query](https://oldschool.runescape.wiki/api.php?action=bucket&query=bucket(%27exchange%27).select(%27name%27,%20%27value%27,%20%27limit%27).limit(5).run())\n\n#### Wildcards\n\nYou can use `*` to select all fields from the main bucket, or `alias.*` from a joined bucket:\n\n```typescript\n// All fields from exchange\nbucket('exchange').select('*').limit(5).run();\n\n// All fields from a joined bucket\nbucket('infobox_item')\n    .join('exchange', 'item_name', 'name')\n    .select('item_name', 'exchange.*')\n    .limit(5)\n    .run();\n```\n\nWildcards are expanded client-side into explicit field lists using the generated schema.\n\n---\n\n### Filtering with Where\n\nThe `.where()` method filters results. It supports three calling styles:\n\n#### Equality (implicit `=`)\n\n```typescript\nbucket('exchange')\n    .select('name', 'value')\n    .where('name', 'Dragon scimitar')\n    .run();\n```\n\n[▶ Run this query](https://oldschool.runescape.wiki/api.php?action=bucket&query=bucket(%27exchange%27).select(%27name%27,%20%27value%27).where({%20%27name%27,%20%27Dragon%20scimitar%27%20}).run())\n\n#### Comparison operators\n\nSupported operators: `=`, `!=`, `>`, `<`, `>=`, `<=`\n\n```typescript\nbucket('exchange')\n    .select('name', 'value')\n    .where('value', '>', 1000000)\n    .limit(10)\n    .run();\n```\n\n[▶ Run this query](https://oldschool.runescape.wiki/api.php?action=bucket&query=bucket(%27exchange%27).select(%27name%27,%20%27value%27).where({%20%27value%27,%20%27%3E%27,%201000000%20}).limit(10).run())\n\n#### Multiple conditions (implicit AND)\n\nChain `.where()` calls to combine conditions with AND:\n\n```typescript\nbucket('exchange')\n    .select('name', 'value')\n    .where('value', '>', 10000)\n    .where('value', '<', 100000)\n    .limit(10)\n    .run();\n```\n\n---\n\n### Convenience Filters\n\nThese shorthand methods simplify common filtering patterns:\n\n#### `.whereNot(field, value)` — exclude matches\n\n```typescript\nbucket('exchange')\n    .select('name', 'value')\n    .whereNot('name', 'Coins')\n    .where('value', '>', 0)\n    .limit(10)\n    .run();\n```\n\n[▶ Run this query](https://oldschool.runescape.wiki/api.php?action=bucket&query=bucket(%27exchange%27).select(%27name%27,%20%27value%27).where({%20%27name%27,%20%27!=%27,%20%27Coins%27%20}).where({%20%27value%27,%20%27%3E%27,%200%20}).limit(10).run())\n\n#### `.whereNull(field)` / `.whereNotNull(field)` — null checks\n\n```typescript\nbucket('infobox_item')\n    .select('item_name', 'weight')\n    .whereNotNull('weight')\n    .limit(10)\n    .run();\n```\n\n[▶ Run this query](https://oldschool.runescape.wiki/api.php?action=bucket&query=bucket(%27infobox_item%27).select(%27item_name%27,%20%27weight%27).where({%20%27weight%27,%20%27!=%27,%20bucket.Null()%20}).limit(10).run())\n\n#### `.whereBetween(field, [min, max])` — inclusive range\n\n```typescript\nbucket('exchange')\n    .select('name', 'value')\n    .whereBetween('value', [10000, 100000])\n    .limit(10)\n    .run();\n```\n\n[▶ Run this query](https://oldschool.runescape.wiki/api.php?action=bucket&query=bucket(%27exchange%27).select(%27name%27,%20%27value%27).where({%20%27value%27,%20%27%3E=%27,%2010000%20}).where({%20%27value%27,%20%27%3C=%27,%20100000%20}).limit(10).run())\n\n#### `.whereIn(field, values)` — match any value\n\nGenerates `Bucket.Or()` internally:\n\n```typescript\nbucket('exchange')\n    .select('name', 'value')\n    .whereIn('name', ['Bronze axe', 'Iron axe', 'Steel axe'])\n    .run();\n```\n\n[▶ Run this query](https://oldschool.runescape.wiki/api.php?action=bucket&query=bucket(%27exchange%27).select(%27name%27,%20%27value%27).where(bucket.Or({%20%27name%27,%20%27Bronze%20axe%27%20},%20{%20%27name%27,%20%27Iron%20axe%27%20},%20{%20%27name%27,%20%27Steel%20axe%27%20})).run())\n\n---\n\n### Combining Conditions\n\nFor more complex logic, use the `Bucket` helper object to construct AND, OR, and NOT conditions directly.\n\n```typescript\nimport { bucket, Bucket } from '@dava96/osrs-wiki-bucket-builder';\n```\n\n#### `Bucket.Or(...)` — match any condition\n\n```typescript\nbucket('exchange')\n    .select('name', 'value')\n    .where(Bucket.Or(\n        ['name', 'Bronze axe'],\n        ['name', 'Iron axe'],\n        ['name', 'Steel axe']\n    ))\n    .run();\n```\n\n[▶ Run this query](https://oldschool.runescape.wiki/api.php?action=bucket&query=bucket(%27exchange%27).select(%27name%27,%20%27value%27).where(bucket.Or({%20%27name%27,%20%27Bronze%20axe%27%20},%20{%20%27name%27,%20%27Iron%20axe%27%20},%20{%20%27name%27,%20%27Steel%20axe%27%20})).run())\n\n#### `Bucket.And(...)` — all conditions must match\n\n```typescript\nbucket('exchange')\n    .select('name', 'value')\n    .where(Bucket.And(\n        ['value', '>', 1000],\n        ['value', '<', 50000]\n    ))\n    .run();\n```\n\n[▶ Run this query](https://oldschool.runescape.wiki/api.php?action=bucket&query=bucket(%27exchange%27).select(%27name%27,%20%27value%27).where(bucket.And({%20%27value%27,%20%27%3E%27,%201000%20},%20{%20%27value%27,%20%27%3C%27,%2050000%20})).run())\n\n#### `Bucket.Not(...)` — negate a condition\n\n```typescript\nbucket('exchange')\n    .select('name', 'value')\n    .where(Bucket.Not(['name', 'Coins']))\n    .run();\n```\n\n[▶ Run this query](https://oldschool.runescape.wiki/api.php?action=bucket&query=bucket(%27exchange%27).select(%27name%27,%20%27value%27).where(bucket.Not({%20%27name%27,%20%27Coins%27%20})).run())\n\n#### `Bucket.Null()` — represents a null value\n\n```typescript\nbucket('infobox_item')\n    .select('item_name', 'weight')\n    .where('weight', '!=', Bucket.Null())\n    .run();\n```\n\n[▶ Run this query](https://oldschool.runescape.wiki/api.php?action=bucket&query=bucket(%27infobox_item%27).select(%27item_name%27,%20%27weight%27).where({%20%27weight%27,%20%27!=%27,%20bucket.Null()%20}).run())\n\n---\n\n### Joining Buckets\n\nJoin two or more buckets to combine data from different sources. The join fields specify how rows match between buckets (like a SQL JOIN).\n\n#### Basic join\n\n```typescript\nbucket('infobox_item')\n    .join('exchange', 'item_name', 'name')\n    .select('item_name', 'weight', 'exchange.value')\n    .limit(5)\n    .run();\n```\n\n[▶ Run this query](https://oldschool.runescape.wiki/api.php?action=bucket&query=bucket(%27infobox_item%27).join(%27exchange%27,%20%27infobox_item.item_name%27,%20%27exchange.name%27).select(%27item_name%27,%20%27weight%27,%20%27exchange.value%27).limit(5).run())\n\n#### Join with alias\n\nUse an alias to give joined buckets shorter names. Aliases are resolved to real bucket names in the generated Lua:\n\n```typescript\nbucket('infobox_item')\n    .join('exchange', 'ex', 'item_name', 'name')\n    .select('item_name', 'ex.value', 'ex.limit')\n    .where('ex.value', '>', 100000)\n    .limit(10)\n    .run();\n```\n\n[▶ Run this query](https://oldschool.runescape.wiki/api.php?action=bucket&query=bucket(%27infobox_item%27).join(%27exchange%27,%20%27infobox_item.item_name%27,%20%27exchange.name%27).select(%27item_name%27,%20%27exchange.value%27,%20%27exchange.limit%27).where({%20%27exchange.value%27,%20%27%3E%27,%20100000%20}).limit(10).run())\n\n#### Multiple joins\n\nJoin three buckets to combine item info, GE prices, and shop data:\n\n```typescript\nbucket('infobox_item')\n    .join('exchange', 'item_name', 'name')\n    .join('storeline', 'item_name', 'sold_item')\n    .select(\n        'item_name', 'weight',\n        'exchange.value',\n        'storeline.sold_by', 'storeline.store_sell_price'\n    )\n    .limit(5)\n    .run();\n```\n\n[▶ Run this query](https://oldschool.runescape.wiki/api.php?action=bucket&query=bucket(%27infobox_item%27).join(%27exchange%27,%20%27infobox_item.item_name%27,%20%27exchange.name%27).join(%27storeline%27,%20%27infobox_item.item_name%27,%20%27storeline.sold_item%27).select(%27item_name%27,%20%27weight%27,%20%27exchange.value%27,%20%27storeline.sold_by%27,%20%27storeline.store_sell_price%27).limit(5).run())\n\n---\n\n### Ordering & Pagination\n\n#### `.orderBy(field, direction)`\n\nSort by a selected field. The field must appear in a prior `.select()` call.\n\n```typescript\nbucket('exchange')\n    .select('name', 'value')\n    .orderBy('value', 'desc')\n    .limit(10)\n    .run();\n```\n\n#### `.paginate(page, perPage)`\n\nA convenience helper that computes `.limit()` and `.offset()` from a 1-based page number:\n\n```typescript\nconst page2 = bucket('exchange')\n    .select('name', 'value')\n    .where('value', '>', 0)\n    .orderBy('value', 'desc')\n    .paginate(2, 25)\n    .run();\n```\n\n[▶ Run page 2](https://oldschool.runescape.wiki/api.php?action=bucket&query=bucket(%27exchange%27).select(%27name%27,%20%27value%27).where({%20%27value%27,%20%27%3E%27,%200%20}).orderBy(%27value%27,%20%27desc%27).limit(25).offset(25).run())\n\n#### `.first()`\n\nShorthand for `.limit(1)` — grab just the top result:\n\n```typescript\nconst top = bucket('exchange')\n    .select('name', 'value')\n    .orderBy('value', 'desc')\n    .first()\n    .run();\n```\n\n---\n\n### Conditional Logic\n\n#### `.when(condition, callback)`\n\nConditionally apply query modifications based on runtime values. The callback only executes when the condition is `true`:\n\n```typescript\nconst isMembers = true;\nconst query = bucket('infobox_item')\n    .select('item_name', 'value', 'members')\n    .when(isMembers, (q) => q.where('members', true))\n    .limit(10)\n    .run();\n```\n\n---\n\n### Reusing Queries\n\n#### `.clone()`\n\nCreates an independent deep copy of the builder. Changes to the clone don't affect the original:\n\n```typescript\nconst base = bucket('exchange')\n    .select('name', 'value')\n    .where('value', '>', 0);\n\nconst topExpensive = base.clone().orderBy('value', 'desc').limit(5);\nconst topCheap = base.clone().orderBy('value', 'asc').limit(5);\n\nconst expensiveQuery = topExpensive.run();\nconst cheapQuery = topCheap.run();\n```\n\n---\n\n## Executing Queries\n\n### `.run()` — URL-encoded output (default)\n\nBy default, `.run()` returns a URI-encoded string, ready to concatenate into a URL:\n\n```typescript\nconst query = bucket('exchange').select('name', 'value').run();\nconst url = `https://oldschool.runescape.wiki/api.php?action=bucket&format=json&query=${query}`;\n```\n\n### `.run({ encodeURI: false })` — raw Lua output\n\nPass `{ encodeURI: false }` to get the raw Lua string for debugging or logging:\n\n```typescript\nconst lua = bucket('exchange').select('name', 'value').run({ encodeURI: false });\nconsole.log(lua);\n// bucket('exchange').select('name', 'value').run()\n```\n\n### `.printSQL()` — raw Lua string (alias)\n\nEquivalent to `.run({ encodeURI: false })`, returns the raw Lua without encoding:\n\n```typescript\nconst lua = bucket('exchange').select('name', 'value').printSQL();\n```\n\n### `BucketResponse` — response wrapper\n\nThe `BucketResponse` class wraps the raw API response and provides convenient accessors:\n\n```typescript\nimport { bucket, BucketResponse } from '@dava96/osrs-wiki-bucket-builder';\n\nconst query = bucket('exchange')\n    .select('name', 'value')\n    .where('name', 'Abyssal whip')\n    .first();\n\nconst raw = await fetch(query.toUrl()).then(r => r.json());\nconst response = new BucketResponse(raw);\n\nconsole.log(response.results); // Array of matching rows\nconsole.log(response.first()); // First result or undefined\nconsole.log(response.query);   // The Lua query echoed by the API\nconsole.log(response.error);   // Error message if the query failed\n```\n\n#### `BucketResponse.from()` — typed responses from queries\n\nUse `BucketResponse.from(query, raw)` to automatically infer the result type from the query builder. No manual type parameter required:\n\n```typescript\nconst query = bucket('exchange').select('name', 'value');\nconst raw = await fetch(query.toUrl()).then(r => r.json());\nconst response = BucketResponse.from(query, raw);\n\nresponse.first()?.name;  // ✅ typed as string\nresponse.first()?.value; // ✅ typed as number\n```\n\n### `InferBucketResult` — extract the result type\n\nUse `InferBucketResult<typeof query>` to extract the inferred row type without executing the query. Useful for typing variables, function parameters, or API response handlers:\n\n```typescript\nimport type { InferBucketResult } from '@dava96/osrs-wiki-bucket-builder';\n\nconst query = bucket('exchange').select('id', 'name', 'value');\ntype ExchangeRow = InferBucketResult<typeof query>;\n// ExchangeRow = { id: number; name: string; value: number; page_name: string; page_name_sub: string }\n```\n\n### `.toUrl()` — generate the full API URL\n\nGenerates the complete Wiki API URL with all query parameters, ready to pass to `fetch()`:\n\n```typescript\nconst url = bucket('exchange')\n    .select('name', 'value')\n    .where('value', '>', 100000)\n    .limit(10)\n    .toUrl();\n\nconst data = await fetch(url).then(r => r.json());\n```\n\n---\n\n## Full Example\n\nMulti-join with aliases, mixed conditions, ordering, and pagination — all in one query:\n\n```typescript\nimport { bucket, Bucket } from '@dava96/osrs-wiki-bucket-builder';\n\nconst query = bucket('infobox_item')\n    .join('exchange', 'ex', 'item_name', 'name')\n    .join('storeline', 'shop', 'item_name', 'sold_item')\n    .select(\n        'item_name', 'weight',\n        'ex.value', 'ex.limit',\n        'shop.sold_by', 'shop.store_sell_price'\n    )\n    .where('ex.value', '>', 1000)\n    .whereNotNull('shop.sold_by')\n    .orderBy('ex.value', 'desc')\n    .limit(10)\n    .run();\n```\n\n[▶ Run this query](https://oldschool.runescape.wiki/api.php?action=bucket&query=bucket(%27infobox_item%27).join(%27exchange%27,%20%27infobox_item.item_name%27,%20%27exchange.name%27).join(%27storeline%27,%20%27infobox_item.item_name%27,%20%27storeline.sold_item%27).select(%27item_name%27,%20%27weight%27,%20%27exchange.value%27,%20%27exchange.limit%27,%20%27storeline.sold_by%27,%20%27storeline.store_sell_price%27).where({%20%27exchange.value%27,%20%27%3E%27,%201000%20}).where({%20%27storeline.sold_by%27,%20%27!=%27,%20bucket.Null()%20}).orderBy(%27exchange.value%27,%20%27desc%27).limit(10).run())\n\n---\n\n## API Reference\n\n| Method | Description |\n|---|---|\n| `bucket(name)` | Creates a new query builder for the given bucket |\n| `.select(...fields)` | Picks fields to retrieve. Supports dot-notation and wildcards |\n| `.where(field, value)` | Filters by equality |\n| `.where(field, op, value)` | Filters with a comparison operator |\n| `.where(...conditions)` | Adds multiple conditions (implicit AND) |\n| `.whereNot(field, value)` | Shorthand for `.where(field, '!=', value)` |\n| `.whereNull(field)` | Filters for NULL values |\n| `.whereNotNull(field)` | Filters for non-NULL values |\n| `.whereBetween(field, [a, b])` | Inclusive range filter |\n| `.whereIn(field, values)` | Matches any value from the list |\n| `.join(bucket, sourceField, targetField)` | Joins another bucket |\n| `.join(bucket, alias, sourceField, targetField)` | Joins with an alias |\n| `.orderBy(field, direction)` | Sorts by `'asc'` or `'desc'` |\n| `.limit(n)` | Sets max rows (1–5000, default 500) |\n| `.offset(n)` | Sets row offset for pagination |\n| `.paginate(page, perPage)` | Computes limit/offset from page number |\n| `.first()` | Shorthand for `.limit(1)` |\n| `.when(cond, fn)` | Conditionally applies `fn` when `cond` is true |\n| `.clone()` | Deep copies the builder |\n| `.run(options?)` | Returns the Lua query string (URI-encoded by default) |\n| `.printSQL()` | Returns the raw Lua query string |\n| `.toUrl()` | Generates the full Wiki API URL, ready to `fetch()` |\n\n### Bucket Helpers\n\n| Helper | Description |\n|---|---|\n| `Bucket.And(...conditions)` | Logical AND |\n| `Bucket.Or(...conditions)` | Logical OR |\n| `Bucket.Not(condition)` | Logical NOT |\n| `Bucket.Null()` | Represents a NULL value |\n\n### Type Exports\n\n| Export | Purpose |\n|---|---|\n| `BucketName` | Union of all valid bucket names |\n| `BucketRegistry` | Maps bucket names to their field interfaces |\n| `BUCKET_FIELDS` | Runtime map of field names per bucket |\n| `BucketResponse<T>` | Response wrapper class |\n| `BucketResponse.from()` | Creates a typed response from a query builder |\n| `InferBucketResult<T>` | Extracts the inferred row type from a query |\n| `BucketMetaFields` | The `page_name` and `page_name_sub` fields auto-injected into every query |\n| `Operator` | Valid comparison operators |\n| `ScalarValue` | `string \\| number \\| boolean` |\n\n---\n\n## Available Buckets\n\nBrowse all available buckets and their fields on the Wiki:\n[Special:AllPages (Bucket namespace)](https://oldschool.runescape.wiki/w/Special:AllPages?from=&to=&namespace=9592)\n\n## Resources\n\n- [Bucket Extension: Usage Guide](https://meta.weirdgloop.org/w/Extension:Bucket/Usage)\n- [Bucket Extension: API](https://meta.weirdgloop.org/w/Extension:Bucket/Api)\n- [Bucket Extension: Example Modules](https://meta.weirdgloop.org/w/Extension:Bucket/Example_modules)\n\n## Contributing\n\nSee [CONTRIBUTING.md](./CONTRIBUTING.md) for how to set up the project, run tests, and submit changes.\n\n## Development\n\n### Setup\n```bash\ngit clone https://github.com/Dava96/osrs-wiki-bucket-builder.git\ncd osrs-wiki-bucket-builder\nnpm install\n```\n\n### Testing\n```bash\nnpm test\n```\n\n### Linting & Formatting\n```bash\nnpm run lint\nnpm run format\n```\n\n### Syncing Bucket Definitions\nRegenerate TypeScript definitions from the Wiki:\n```bash\nnpm run buckets\n```\n\n## License\n\nISC\n","readmeFilename":"readme.md"}