{"_id":"@calgiellc/quran","_rev":"4-7704164f9a446244c4e9f0272898fef6","name":"@calgiellc/quran","dist-tags":{"latest":"1.0.2"},"versions":{"1.2.2":{"name":"@calgiellc/quran","version":"1.2.2","keywords":["quran","quran-text","quran-audio","islam","muslim","reciter","quranic","quran-library","islamic-text","quran-api"],"author":{"name":"CalgieLLC","email":"info@calgiellc.com"},"license":"MIT","_id":"@calgiellc/quran@1.2.2","maintainers":[{"name":"calgie","email":"calgiellc@gmail.com"}],"homepage":"https://github.com/calgiellc/quran-npm","bugs":{"url":"https://github.com/calgiellc/quran-npm/issues"},"bin":{"quran":"bin/quran.js"},"dist":{"shasum":"8544d6d56d546712cb9ed9fa4843aa8e6667b5a7","tarball":"https://registry.npmjs.org/@calgiellc/quran/-/quran-1.2.2.tgz","fileCount":101,"integrity":"sha512-fwgFQsM8C4pckHbecQDtGNskdG4HYkiy81CIco8wwrG//BaVrC+1D0OKynWOXp/LRp/fT8Y3htGY9a9HwWOYtg==","signatures":[{"sig":"MEUCIQCEYCc0+23lHFdxxFYgSgOfD/qIH/aNYH1jxCnsi3LTQwIgYp4GKqEBMx1s0hTwjNtNfAcmc0Pr6u1K1n5R9o568uY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":4805047},"main":"lib/cjs/Quran.js","types":"lib/types/Quran.d.ts","config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"module":"lib/esm/quran.js","exports":{".":{"types":"./lib/types/Quran.d.ts","import":"./lib/esm/quran.js","default":"./lib/cjs/Quran.js","require":"./lib/cjs/Quran.js"},"./hooks":{"types":"./lib/types/hooks/index.d.ts","import":"./lib/esm/hooks/index.js","default":"./lib/cjs/hooks/index.js","require":"./lib/cjs/hooks/index.js"},"./package.json":"./package.json"},"gitHead":"47ab81425c89c79f71bb3e4514e18ed6fad8186a","scripts":{"lint":"run-p -l lint:*","test":"run-s -l test:*","build":"npm-run-all -l clean -s build:types -p build:esm build:cjs build:hooks -s build:entry-points","clean":"rimraf lib","commit":"cz","prepare":"husky install","lint-fix":"npm-run-all -l -p lint-fix:* -s lint:tsc","lint:tsc":"tsc --noEmit --project tsconfig.build.json","benchmark":"ts-node scripts/benchmark.ts","build:cjs":"cross-env BABEL_ENV=cjs babel src --extensions '.ts' --out-dir 'lib/cjs' --source-maps --ignore 'src/hooks/**/*'","build:esm":"cross-env BABEL_ENV=esmUnbundled babel src --extensions '.ts' --out-dir 'lib/esm' --source-maps --ignore 'src/hooks/**/*'","test:unit":"jest","test:audit":"npm audit --omit=dev --audit-level=high","build:hooks":"npm run build:hooks:check || echo 'Skipping hooks build (React not installed)'","build:types":"tsc -b tsconfig.types.json","fetch:quran":"ts-node scripts/fetch-quran-data.ts","lint:eslint":"eslint --max-warnings=0 .","add:fulltext":"ts-node scripts/add-fulltext-to-quran.ts","validate:data":"ts-node scripts/validate-data.ts","lint-fix:eslint":"eslint --max-warnings=0 --fix .","scrape:mp3quran":"ts-node scripts/scrape-mp3quran.ts","build:hooks:check":"npm list react > /dev/null 2>&1 && cross-env BABEL_ENV=esmUnbundled babel src/hooks --extensions '.ts' --out-dir 'lib/esm/hooks' --source-maps && cross-env BABEL_ENV=cjs babel src/hooks --extensions '.ts' --out-dir 'lib/cjs/hooks' --source-maps && tsc -p tsconfig.hooks.json --outDir lib/types/hooks","build:entry-points":"node scripts/create-entry-points.js"},"_npmUser":{"name":"calgie","email":"calgiellc@gmail.com"},"overrides":{"commitizen":{"minimist":"1.2.6"}},"repository":{"url":"git+https://github.com/calgiellc/quran-npm.git","type":"git"},"_npmVersion":"10.8.2","description":"Complete Quran library with text and audio support. Access all 114 surahs with multiple reciters and audio URLs.","directories":{},"sideEffects":false,"_nodeVersion":"20.19.6","publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"zod":"^4.3.5","jest":"^29.7.0","husky":"^9.1.7","eslint":"^8.57.1","moment":"^2.30.1","rimraf":"^6.1.2","rollup":"^4.54.0","cheerio":"^1.1.2","ts-jest":"^29.2.5","ts-node":"^10.9.2","prettier":"^3.4.2","commander":"^12.1.0","cross-env":"^7.0.3","@babel/cli":"^7.28.3","commitizen":"^4.3.1","fast-check":"^4.5.3","node-fetch":"^3.3.2","typescript":"^5.7.2","@babel/core":"^7.28.5","@types/jest":"^29.5.14","@types/node":"^25.0.3","npm-run-all":"^4.1.5","babel-loader":"^9.2.1","pretty-quick":"^4.2.2","@types/cheerio":"^0.22.35","@commitlint/cli":"^19.7.0","moment-timezone":"^0.5.48","@tsconfig/node12":"^1.0.11","semantic-release":"^24.2.9","@babel/preset-env":"^7.28.5","@types/node-fetch":"^2.6.13","eslint-plugin-jest":"^28.14.0","@rollup/plugin-babel":"^6.1.0","@rollup/plugin-terser":"^0.4.4","@semantic-release/git":"^10.0.1","@semantic-release/npm":"^12.0.1","eslint-config-prettier":"^9.1.0","eslint-plugin-prettier":"^5.2.1","@babel/preset-typescript":"^7.28.5","@semantic-release/github":"^11.0.6","@typescript-eslint/parser":"^8.51.0","cz-conventional-changelog":"^3.3.0","@rollup/plugin-node-resolve":"^15.3.0","@semantic-release/changelog":"^6.0.3","@commitlint/config-conventional":"^19.7.0","@typescript-eslint/eslint-plugin":"^8.51.0","@semantic-release/commit-analyzer":"^13.0.1","@semantic-release/release-notes-generator":"^14.1.0"},"peerDependencies":{"react":">=16.8.0"},"peerDependenciesMeta":{"react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/quran_1.2.2_1767673211288_0.23451760976363856","host":"s3://npm-registry-packages-npm-production"}},"1.0.0":{"name":"@calgiellc/quran","version":"1.0.0","keywords":["quran","quran-text","quran-audio","islam","muslim","reciter","quranic","quran-library","islamic-text","quran-api"],"author":{"name":"CalgieLLC","email":"info@calgiellc.com"},"license":"MIT","_id":"@calgiellc/quran@1.0.0","maintainers":[{"name":"calgie","email":"calgiellc@gmail.com"}],"homepage":"https://github.com/calgiellc/quran-npm","bugs":{"url":"https://github.com/calgiellc/quran-npm/issues"},"dist":{"shasum":"bd8b381c7110886b2b44693e758dee97d42721b1","tarball":"https://registry.npmjs.org/@calgiellc/quran/-/quran-1.0.0.tgz","fileCount":105,"integrity":"sha512-YeDeI60/uR9/RhF+x+2B7uCyJn3LONZwPQwEH1/cTD2NWBHb/IJsNrMKtyBOd35VAWnWbTMeT6W8n9Ojdem1AQ==","signatures":[{"sig":"MEUCIDD30YMtffQfGzX5ZvLpIcOYbJMMcC57/h7hPRckVfneAiEAnoEQTukASlIa0W3ZG099dxDXbxKPTtQ/qC3P6L/zQcA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":13698453},"main":"lib/cjs/Quran.js","types":"lib/types/Quran.d.ts","config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"module":"lib/esm/quran.js","exports":{".":{"types":"./lib/types/Quran.d.ts","import":"./lib/esm/quran.js","default":"./lib/cjs/Quran.js","require":"./lib/cjs/Quran.js"},"./hooks":{"types":"./lib/types/hooks/index.d.ts","import":"./lib/esm/hooks/index.js","default":"./lib/cjs/hooks/index.js","require":"./lib/cjs/hooks/index.js"},"./package.json":"./package.json"},"gitHead":"5735fba27119dfe39f302aed80255a936799cb53","scripts":{"lint":"run-p -l lint:*","test":"run-s -l test:*","build":"npm-run-all -l clean -s build:types -p build:esm build:cjs build:hooks -s build:entry-points","clean":"rimraf lib","commit":"cz","prepare":"husky install","lint-fix":"npm-run-all -l -p lint-fix:* -s lint:tsc","lint:tsc":"tsc --noEmit --project tsconfig.build.json","benchmark":"ts-node scripts/benchmark.ts","build:cjs":"cross-env BABEL_ENV=cjs babel src --extensions '.ts' --out-dir 'lib/cjs' --source-maps --ignore 'src/hooks/**/*'","build:esm":"cross-env BABEL_ENV=esmUnbundled babel src --extensions '.ts' --out-dir 'lib/esm' --source-maps --ignore 'src/hooks/**/*'","test:unit":"jest","test:audit":"npm audit --omit=dev --audit-level=high","build:hooks":"npm run build:hooks:check || echo 'Skipping hooks build (React not installed)'","build:types":"tsc -b tsconfig.types.json","fetch:quran":"ts-node scripts/fetch-quran-data.ts","lint:eslint":"eslint --max-warnings=0 .","add:fulltext":"ts-node scripts/add-fulltext-to-quran.ts","validate:data":"ts-node scripts/validate-data.ts","lint-fix:eslint":"eslint --max-warnings=0 --fix .","scrape:mp3quran":"ts-node scripts/scrape-mp3quran.ts","build:hooks:check":"npm list react > /dev/null 2>&1 && cross-env BABEL_ENV=esmUnbundled babel src/hooks --extensions '.ts' --out-dir 'lib/esm/hooks' --source-maps && cross-env BABEL_ENV=cjs babel src/hooks --extensions '.ts' --out-dir 'lib/cjs/hooks' --source-maps && tsc -p tsconfig.hooks.json --outDir lib/types/hooks","build:entry-points":"node scripts/create-entry-points.js"},"_npmUser":{"name":"calgie","email":"calgiellc@gmail.com"},"overrides":{"commitizen":{"minimist":"1.2.6"}},"repository":{"url":"git+https://github.com/calgiellc/quran-npm.git","type":"git"},"_npmVersion":"10.9.4","description":"Complete Quran library with text and audio support. Access all 114 surahs with multiple reciters and audio URLs.","directories":{},"sideEffects":false,"_nodeVersion":"20.19.6","publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"zod":"^4.3.5","jest":"^29.7.0","husky":"^9.1.7","eslint":"^8.57.1","moment":"^2.30.1","rimraf":"^6.1.2","rollup":"^4.54.0","cheerio":"^1.1.2","ts-jest":"^29.2.5","ts-node":"^10.9.2","prettier":"^3.4.2","commander":"^12.1.0","cross-env":"^7.0.3","@babel/cli":"^7.28.3","commitizen":"^4.3.1","fast-check":"^4.5.3","node-fetch":"^3.3.2","typescript":"^5.7.2","@babel/core":"^7.28.5","@types/jest":"^29.5.14","@types/node":"^25.0.3","npm-run-all":"^4.1.5","babel-loader":"^9.2.1","pretty-quick":"^4.2.2","@types/cheerio":"^0.22.35","@commitlint/cli":"^19.7.0","moment-timezone":"^0.5.48","@tsconfig/node12":"^1.0.11","semantic-release":"^24.2.9","@babel/preset-env":"^7.28.5","@types/node-fetch":"^2.6.13","eslint-plugin-jest":"^28.14.0","@rollup/plugin-babel":"^6.1.0","@rollup/plugin-terser":"^0.4.4","@semantic-release/git":"^10.0.1","@semantic-release/npm":"^12.0.1","eslint-config-prettier":"^9.1.0","eslint-plugin-prettier":"^5.2.1","@babel/preset-typescript":"^7.28.5","@semantic-release/github":"^11.0.6","@typescript-eslint/parser":"^8.51.0","cz-conventional-changelog":"^3.3.0","@rollup/plugin-node-resolve":"^15.3.0","@semantic-release/changelog":"^6.0.3","@commitlint/config-conventional":"^19.7.0","@typescript-eslint/eslint-plugin":"^8.51.0","@semantic-release/commit-analyzer":"^13.0.1","@semantic-release/release-notes-generator":"^14.1.0"},"peerDependencies":{"react":">=16.8.0"},"peerDependenciesMeta":{"react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/quran_1.0.0_1767674444560_0.698975413532978","host":"s3://npm-registry-packages-npm-production"}},"1.0.1":{"name":"@calgiellc/quran","version":"1.0.1","keywords":["quran","quran-text","quran-audio","islam","muslim","reciter","quranic","quran-library","islamic-text","quran-api"],"author":{"name":"CalgieLLC","email":"info@calgiellc.com"},"license":"MIT","_id":"@calgiellc/quran@1.0.1","maintainers":[{"name":"calgie","email":"calgiellc@gmail.com"}],"homepage":"https://github.com/calgiellc/quran-npm","bugs":{"url":"https://github.com/calgiellc/quran-npm/issues"},"dist":{"shasum":"8c88d83b8c5668096e42c0d5f76407f1dffd0127","tarball":"https://registry.npmjs.org/@calgiellc/quran/-/quran-1.0.1.tgz","fileCount":105,"integrity":"sha512-hwfeWUAC+nU7Zi9s4eYBPvtocZnhLrmsihnUFFZ/3t/N7quP/lw11gQOa0puTAyiCLiC32Ep/VUcbbYiBzxT0g==","signatures":[{"sig":"MEUCIQD6ISOL1JA9yYknTHSH9rWTj8d7r+5savOO0ng7INWBfgIgdxLsKK9Ue849XfO1BLjpzAdnWkjbilOpI94e2v+M0R8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":13698675},"main":"lib/cjs/Quran.js","types":"lib/types/Quran.d.ts","config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"module":"lib/esm/quran.js","exports":{".":{"types":"./lib/types/Quran.d.ts","import":"./lib/esm/quran.js","default":"./lib/cjs/Quran.js","require":"./lib/cjs/Quran.js"},"./hooks":{"types":"./lib/types/hooks/index.d.ts","import":"./lib/esm/hooks/index.js","default":"./lib/cjs/hooks/index.js","require":"./lib/cjs/hooks/index.js"},"./package.json":"./package.json"},"gitHead":"977ffd3bb6f768f6a42d527377cd90e367c70553","scripts":{"lint":"run-p -l lint:*","test":"run-s -l test:*","build":"npm-run-all -l clean -s build:types -p build:esm build:cjs build:hooks -s build:entry-points","clean":"rimraf lib","commit":"cz","prepare":"husky install","lint-fix":"npm-run-all -l -p lint-fix:* -s lint:tsc","lint:tsc":"tsc --noEmit --project tsconfig.build.json","benchmark":"ts-node scripts/benchmark.ts","build:cjs":"cross-env BABEL_ENV=cjs babel src --extensions '.ts' --out-dir 'lib/cjs' --source-maps --ignore 'src/hooks/**/*'","build:esm":"cross-env BABEL_ENV=esmUnbundled babel src --extensions '.ts' --out-dir 'lib/esm' --source-maps --ignore 'src/hooks/**/*'","test:unit":"jest","test:audit":"npm audit --omit=dev --audit-level=high","build:hooks":"npm run build:hooks:check || echo 'Skipping hooks build (React not installed)'","build:types":"tsc -b tsconfig.types.json","fetch:quran":"ts-node scripts/fetch-quran-data.ts","lint:eslint":"eslint --max-warnings=0 .","add:fulltext":"ts-node scripts/add-fulltext-to-quran.ts","validate:data":"ts-node scripts/validate-data.ts","lint-fix:eslint":"eslint --max-warnings=0 --fix .","scrape:mp3quran":"ts-node scripts/scrape-mp3quran.ts","build:hooks:check":"npm list react > /dev/null 2>&1 && cross-env BABEL_ENV=esmUnbundled babel src/hooks --extensions '.ts' --out-dir 'lib/esm/hooks' --source-maps && cross-env BABEL_ENV=cjs babel src/hooks --extensions '.ts' --out-dir 'lib/cjs/hooks' --source-maps && tsc -p tsconfig.hooks.json --outDir lib/types/hooks","build:entry-points":"node scripts/create-entry-points.js"},"_npmUser":{"name":"calgie","email":"calgiellc@gmail.com"},"overrides":{"commitizen":{"minimist":"1.2.6"}},"repository":{"url":"git+https://github.com/calgiellc/quran-npm.git","type":"git"},"_npmVersion":"10.9.4","description":"Complete Quran library with text and audio support. Access all 114 surahs with multiple reciters and audio URLs.","directories":{},"sideEffects":false,"_nodeVersion":"20.19.6","publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"zod":"^4.3.5","jest":"^29.7.0","husky":"^9.1.7","eslint":"^8.57.1","moment":"^2.30.1","rimraf":"^6.1.2","rollup":"^4.54.0","cheerio":"^1.1.2","ts-jest":"^29.2.5","ts-node":"^10.9.2","prettier":"^3.4.2","commander":"^12.1.0","cross-env":"^7.0.3","@babel/cli":"^7.28.3","commitizen":"^4.3.1","fast-check":"^4.5.3","node-fetch":"^3.3.2","typescript":"^5.7.2","@babel/core":"^7.28.5","@types/jest":"^29.5.14","@types/node":"^25.0.3","npm-run-all":"^4.1.5","babel-loader":"^9.2.1","pretty-quick":"^4.2.2","@types/cheerio":"^0.22.35","@commitlint/cli":"^19.7.0","moment-timezone":"^0.5.48","@tsconfig/node12":"^1.0.11","semantic-release":"^24.2.9","@babel/preset-env":"^7.28.5","@types/node-fetch":"^2.6.13","eslint-plugin-jest":"^28.14.0","@rollup/plugin-babel":"^6.1.0","@rollup/plugin-terser":"^0.4.4","@semantic-release/git":"^10.0.1","@semantic-release/npm":"^12.0.1","eslint-config-prettier":"^9.1.0","eslint-plugin-prettier":"^5.2.1","@babel/preset-typescript":"^7.28.5","@semantic-release/github":"^11.0.6","@typescript-eslint/parser":"^8.51.0","cz-conventional-changelog":"^3.3.0","@rollup/plugin-node-resolve":"^15.3.0","@semantic-release/changelog":"^6.0.3","@commitlint/config-conventional":"^19.7.0","@typescript-eslint/eslint-plugin":"^8.51.0","@semantic-release/commit-analyzer":"^13.0.1","@semantic-release/release-notes-generator":"^14.1.0"},"peerDependencies":{"react":">=16.8.0"},"peerDependenciesMeta":{"react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/quran_1.0.1_1767674826191_0.22010635622334762","host":"s3://npm-registry-packages-npm-production"}},"1.0.2":{"name":"@calgiellc/quran","description":"Complete Quran library with text and audio support. Access all 114 surahs with multiple reciters and audio URLs.","version":"1.0.2","author":{"name":"CalgieLLC","email":"info@calgiellc.com"},"license":"MIT","main":"lib/cjs/Quran.js","module":"lib/esm/quran.js","types":"lib/types/Quran.d.ts","exports":{".":{"types":"./lib/types/Quran.d.ts","import":"./lib/esm/quran.js","require":"./lib/cjs/Quran.js","default":"./lib/cjs/Quran.js"},"./hooks":{"types":"./lib/types/hooks/index.d.ts","import":"./lib/esm/hooks/index.js","require":"./lib/cjs/hooks/index.js","default":"./lib/cjs/hooks/index.js"},"./package.json":"./package.json"},"sideEffects":false,"scripts":{"clean":"rimraf lib","test":"run-s -l test:*","test:unit":"jest","test:audit":"npm audit --omit=dev --audit-level=high","build":"npm-run-all -l clean -s build:types -p build:esm build:cjs build:hooks -s build:entry-points","build:entry-points":"node scripts/create-entry-points.js","build:esm":"cross-env BABEL_ENV=esmUnbundled babel src --extensions '.ts' --out-dir 'lib/esm' --source-maps --ignore 'src/hooks/**/*'","build:cjs":"cross-env BABEL_ENV=cjs babel src --extensions '.ts' --out-dir 'lib/cjs' --source-maps --ignore 'src/hooks/**/*'","build:types":"tsc -b tsconfig.types.json","build:hooks":"npm run build:hooks:check || echo 'Skipping hooks build (React not installed)'","build:hooks:check":"npm list react > /dev/null 2>&1 && cross-env BABEL_ENV=esmUnbundled babel src/hooks --extensions '.ts' --out-dir 'lib/esm/hooks' --source-maps && cross-env BABEL_ENV=cjs babel src/hooks --extensions '.ts' --out-dir 'lib/cjs/hooks' --source-maps && tsc -p tsconfig.hooks.json --outDir lib/types/hooks","lint":"run-p -l lint:*","lint:eslint":"eslint --max-warnings=0 .","lint:tsc":"tsc --noEmit --project tsconfig.build.json","lint-fix":"npm-run-all -l -p lint-fix:* -s lint:tsc","lint-fix:eslint":"eslint --max-warnings=0 --fix .","commit":"cz","prepare":"husky install","scrape:mp3quran":"ts-node scripts/scrape-mp3quran.ts","fetch:quran":"ts-node scripts/fetch-quran-data.ts","add:fulltext":"ts-node scripts/add-fulltext-to-quran.ts","validate:data":"ts-node scripts/validate-data.ts","benchmark":"ts-node scripts/benchmark.ts"},"repository":{"type":"git","url":"git+https://github.com/calgiellc/quran-npm.git"},"homepage":"https://github.com/calgiellc/quran-npm","publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"keywords":["quran","quran-text","quran-audio","islam","muslim","reciter","quranic","quran-library","islamic-text","quran-api"],"devDependencies":{"@babel/cli":"^7.28.3","@babel/core":"^7.28.5","@babel/preset-env":"^7.28.5","@babel/preset-typescript":"^7.28.5","@commitlint/cli":"^19.7.0","@commitlint/config-conventional":"^19.7.0","@rollup/plugin-babel":"^6.1.0","@rollup/plugin-node-resolve":"^15.3.0","@rollup/plugin-terser":"^0.4.4","@semantic-release/changelog":"^6.0.3","@semantic-release/commit-analyzer":"^13.0.1","@semantic-release/git":"^10.0.1","@semantic-release/github":"^11.0.6","@semantic-release/npm":"^12.0.1","@semantic-release/release-notes-generator":"^14.1.0","@tsconfig/node12":"^1.0.11","@types/cheerio":"^0.22.35","@types/jest":"^29.5.14","@types/node":"^25.0.3","@types/node-fetch":"^2.6.13","@typescript-eslint/eslint-plugin":"^8.51.0","@typescript-eslint/parser":"^8.51.0","babel-loader":"^9.2.1","cheerio":"^1.1.2","commander":"^12.1.0","commitizen":"^4.3.1","cross-env":"^7.0.3","cz-conventional-changelog":"^3.3.0","eslint":"^8.57.1","eslint-config-prettier":"^9.1.0","eslint-plugin-jest":"^28.14.0","eslint-plugin-prettier":"^5.2.1","fast-check":"^4.5.3","husky":"^9.1.7","jest":"^29.7.0","moment":"^2.30.1","moment-timezone":"^0.5.48","node-fetch":"^3.3.2","npm-run-all":"^4.1.5","prettier":"^3.4.2","pretty-quick":"^4.2.2","rimraf":"^6.1.2","rollup":"^4.54.0","semantic-release":"^24.2.9","ts-jest":"^29.2.5","ts-node":"^10.9.2","typescript":"^5.7.2","zod":"^4.3.5"},"peerDependencies":{"react":">=16.8.0"},"peerDependenciesMeta":{"react":{"optional":true}},"overrides":{"commitizen":{"minimist":"1.2.6"}},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}},"_id":"@calgiellc/quran@1.0.2","gitHead":"718e6343ee48f28b8d18cb3f30bdd8356a063da9","bugs":{"url":"https://github.com/calgiellc/quran-npm/issues"},"_nodeVersion":"20.19.6","_npmVersion":"10.8.2","dist":{"integrity":"sha512-+PCTo4Oj6WbF3blYFmw/bTqoyPujWo+CzGtfIDPsO+wbOG2Ew/J9k3dd5hVed646J7QjbiD13CUwPnZFmWgegg==","shasum":"5aadcfb3929ed9d89e6408dbc881de6bf499d830","tarball":"https://registry.npmjs.org/@calgiellc/quran/-/quran-1.0.2.tgz","fileCount":105,"unpackedSize":13698972,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQCr7pzhCMJDL6RUcarA0SCurPpt5zf+u8ZQVPljJTLCnwIgajc8qEpS+hK6gbTSX4kfDMHsBXqqTSML+rjkTEHPCWM="}]},"_npmUser":{"name":"calgie","email":"calgiellc@gmail.com"},"directories":{},"maintainers":[{"name":"calgie","email":"calgiellc@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/quran_1.0.2_1767675440151_0.9348532435454937"},"_hasShrinkwrap":false}},"time":{"created":"2026-01-06T04:20:11.218Z","modified":"2026-01-06T04:57:20.647Z","1.2.2":"2026-01-06T04:20:11.530Z","1.0.0":"2026-01-06T04:40:44.807Z","1.0.1":"2026-01-06T04:47:06.465Z","1.0.2":"2026-01-06T04:57:20.436Z"},"bugs":{"url":"https://github.com/calgiellc/quran-npm/issues"},"author":{"name":"CalgieLLC","email":"info@calgiellc.com"},"license":"MIT","homepage":"https://github.com/calgiellc/quran-npm","keywords":["quran","quran-text","quran-audio","islam","muslim","reciter","quranic","quran-library","islamic-text","quran-api"],"repository":{"type":"git","url":"git+https://github.com/calgiellc/quran-npm.git"},"description":"Complete Quran library with text and audio support. Access all 114 surahs with multiple reciters and audio URLs.","maintainers":[{"name":"calgie","email":"calgiellc@gmail.com"}],"readme":"# @calgiellc/quran\n\nA comprehensive TypeScript library that provides complete Quran text and audio data. Access all 114 surahs with multiple reciters and audio URLs.\n\n## Features\n\n- 📖 **Complete Quran Text**: All 114 surahs with 6,236 ayahs\n- 🎙️ **Multiple Reciters**: Support for 10+ reciters from mp3quran.net\n- 🔍 **Powerful Search**: Search in Arabic text and translations\n- 🎯 **Filtering**: Filter by revelation type, surah range, and more\n- 📄 **Pagination**: Built-in pagination support for large datasets\n- ⚡ **Performance**: Optimized with caching and efficient data structures\n- 🎨 **Type-Safe**: Full TypeScript support with comprehensive types\n- 📦 **Zero Dependencies**: No runtime dependencies\n- 🌳 **Tree-Shakeable**: Optimized for bundle size\n\n## Installation\n\n```bash\nnpm install @calgiellc/quran\n```\n\n### React Hook (Optional)\n\nIf you're using React, you can also use the optional hook:\n\n```bash\nnpm install @calgiellc/quran react\n```\n\nThen import from the hooks path:\n\n```typescript\nimport { useQuran } from '@calgiellc/quran/hooks';\n```\n\n## Quick Start\n\n### Simple 3-Step Workflow (Recommended)\n\n```typescript\nimport { createQuran, createQuranSession } from '@calgiellc/quran';\n\n// Step 1: Get all reciters and let user pick\nconst quran = createQuran();\nconst reciters = quran.getAllReciters();\n\n// Step 2: Create session with user's picked reciter\nconst session = createQuranSession('alzain');\n\n// Step 3: Get surahs and play!\nconst surahs = session.surahs; // All surahs for this reciter\nconst { audioUrl, fullText, surah } = session.getPlayerData(1); // Everything to play surah 1\n```\n\n### Basic Usage\n\n```typescript\nimport { createQuran } from '@calgiellc/quran';\n\n// Create a Quran instance\nconst quran = createQuran();\n\n// Get all surahs\nconst surahs = quran.getAllSurahs();\nconsole.log(`Total surahs: ${surahs.length}`); // 114\n\n// Get a specific surah\nconst alFatiha = quran.getSurah(1);\nconsole.log(alFatiha?.nameTransliterated); // \"Al-Fatiha\"\n\n// Get a specific ayah\nconst firstAyah = quran.getAyah(1, 1);\nconsole.log(firstAyah?.text); // Arabic text\nconsole.log(firstAyah?.translations?.en); // English translation\n```\n\n## API Documentation\n\n### Core Methods\n\n#### `getAllSurahs(): Surah[]`\nGet all 114 surahs sorted by number.\n\n#### `getSurah(number: number): Surah | null`\nGet a specific surah by number (1-114).\n\n#### `getAyah(surahNumber: number, ayahNumber: number): Ayah | null`\nGet a specific ayah by surah and ayah number.\n\n#### `getSurahs(filters?: FilterOptions): Surah[]`\nGet surahs with optional filters.\n\n#### `getSurahsPaginated(pagination?: PaginationOptions, filters?: FilterOptions): PaginatedResult<Surah>`\nGet paginated surahs with optional filters.\n\n### Reciter Methods\n\n#### `getAllReciters(): Reciter[]`\nGet all available reciters.\n\n#### `getReciter(reciterId: string): Reciter | null`\nGet a specific reciter by ID.\n\n#### `getSurahsByReciter(reciterId: string): Surah[]`\nGet all surahs available for a specific reciter.\n\n### Audio Methods\n\n#### `getAudioUrl(reciterId: string, surahNumber: number, ayahNumber: number): string | null`\nGet audio URL for a specific ayah.\n\n#### `getSurahAudioUrls(reciterId: string, surahNumber: number): AudioUrl[]`\nGet all audio URLs for a surah.\n\n#### `getSurahAudioUrl(surahNumber: number): string | null`\nGet audio URL for a surah using the preferred reciter (for mp3 players).\n\n#### `getSurahAudioUrlForReciter(reciterId: string, surahNumber: number): string | null`\nGet audio URL for a surah for a specific reciter.\n\n#### `getSurahFullText(surahNumber: number): string | null`\nGet full text of a surah with ayah separators.\n\n### Preferred Reciter Methods\n\n#### `setPreferredReciter(reciterId: string): void`\nSet the preferred reciter for convenience methods.\n\n#### `getPreferredReciter(): Reciter | null`\nGet the preferred reciter.\n\n#### `getPreferredReciterId(): string | null`\nGet the preferred reciter ID.\n\n#### `clearPreferredReciter(): void`\nClear the preferred reciter.\n\n#### `getPreferredReciterSurahs(): Surah[]`\nGet surahs available for the preferred reciter.\n\n### Search Methods\n\n#### `search(query: string, options?: SearchOptions): SearchResult[]`\nSearch the Quran text.\n\n#### `searchPaginated(query: string, pagination?: PaginationOptions, options?: Omit<SearchOptions, 'limit'>): PaginatedResult<SearchResult>`\nGet paginated search results.\n\n## Examples\n\n### Filtering\n\n```typescript\n// Filter by revelation type\nconst meccanSurahs = quran.getSurahs({ revelationType: 'meccan' });\nconst medinanSurahs = quran.getSurahs({ revelationType: 'medinan' });\n\n// Filter by surah number range\nconst firstTen = quran.getSurahs({ \n  minSurahNumber: 1, \n  maxSurahNumber: 10 \n});\n\n// Filter by number of ayahs\nconst shortSurahs = quran.getSurahs({ maxAyahs: 50 });\n\n// Combine filters\nconst filtered = quran.getSurahs({ \n  revelationType: 'meccan',\n  minSurahNumber: 1,\n  maxSurahNumber: 30,\n  maxAyahs: 100\n});\n```\n\n### Pagination\n\n```typescript\n// Get paginated surahs\nconst page1 = quran.getSurahsPaginated({ page: 1, pageSize: 10 });\nconsole.log(page1.items); // First 10 surahs\nconsole.log(page1.hasNext); // true\nconsole.log(page1.totalPages); // 12\n\n// Get next page\nconst page2 = quran.getSurahsPaginated({ page: 2, pageSize: 10 });\n\n// Pagination with filters\nconst meccanPage = quran.getSurahsPaginated(\n  { page: 1, pageSize: 20 },\n  { revelationType: 'meccan' }\n);\n```\n\n### Search\n\n```typescript\n// Basic search\nconst results = quran.search('mercy', { language: 'en' });\n\n// Search with filters\nconst filteredResults = quran.search('Allah', {\n  language: 'en',\n  filters: { revelationType: 'meccan' }\n});\n\n// Paginated search\nconst searchPage = quran.searchPaginated(\n  'Allah',\n  { page: 1, pageSize: 10 },\n  { language: 'en' }\n);\n```\n\n### Working with Reciters\n\n```typescript\n// Get all reciters\nconst reciters = quran.getAllReciters();\n\n// Get audio URL\nconst audioUrl = quran.getAudioUrl('alzain', 1, 1);\n// Returns: \"https://www.mp3quran.net/eng/alzain/1\"\n\n// Get all audio URLs for a surah\nconst audioUrls = quran.getSurahAudioUrls('alzain', 1);\naudioUrls.forEach(audio => {\n  console.log(`Ayah ${audio.ayahNumber}: ${audio.url}`);\n});\n```\n\n### Using Full Text\n\n```typescript\nconst surah = quran.getSurah(1);\nif (surah?.fullText) {\n  // fullText contains all ayahs with separators: \"text [1] text [2] ...\"\n  console.log(surah.fullText);\n}\n\n// Or use the convenience method\nconst fullText = quran.getSurahFullText(1);\n```\n\n### Simple Session API (Recommended)\n\nThe easiest way to work with a reciter - perfect for your workflow:\n\n```typescript\nimport { createQuranSession } from '@calgiellc/quran';\n\n// 1. Get all reciters and let user pick\nconst quran = createQuran();\nconst reciters = quran.getAllReciters();\n\n// 2. Create session with user's picked reciter (one line!)\nconst session = createQuranSession('alzain');\n\n// 3. Get surahs for this reciter\nconst surahs = session.surahs; // All surahs available\n\n// 4. Get everything to play a surah (one call!)\nconst { audioUrl, fullText, surah } = session.getPlayerData(1);\n// <audio src={audioUrl} controls />\n// <div>{fullText}</div>\n```\n\n### Alternative: Preferred Reciter Workflow\n\nIf you prefer the full API:\n\n```typescript\n// 1. Get all reciters and let user pick\nconst quran = createQuran();\nconst reciters = quran.getAllReciters();\n\n// 2. Initialize with preferred reciter\nconst quranWithReciter = createQuranWithReciter('alzain');\n// Or set it later\nquran.setPreferredReciter('alzain');\n\n// 3. Get surahs for preferred reciter\nconst surahs = quran.getPreferredReciterSurahs();\n\n// 4. Get audio URL for mp3 player\nconst audioUrl = quran.getSurahAudioUrl(1);\n// <audio src={audioUrl} controls />\n\n// 5. Get full text while audio plays\nconst fullText = quran.getSurahFullText(1);\n```\n\n### React Hook (Optional)\n\n```typescript\nimport { useQuran } from '@calgiellc/quran/hooks';\n\nfunction QuranPlayer() {\n  const {\n    quran,\n    preferredReciter,\n    setPreferredReciter,\n    getSurahsForReciter,\n    getSurahAudioUrl,\n    getSurahFullText,\n  } = useQuran('alzain'); // or useQuran() and set later\n\n  const surahs = getSurahsForReciter();\n  const audioUrl = getSurahAudioUrl(1);\n  const fullText = getSurahFullText(1);\n\n  return (\n    <div>\n      <select onChange={(e) => setPreferredReciter(e.target.value)}>\n        {quran.getAllReciters().map(r => (\n          <option key={r.id} value={r.id}>{r.name}</option>\n        ))}\n      </select>\n      <audio src={audioUrl} controls />\n      <p>{fullText}</p>\n    </div>\n  );\n}\n```\n\n## Error Handling\n\n```typescript\nimport { QuranError, QuranErrorCode } from '@calgiellc/quran';\n\ntry {\n  const surah = quran.getSurah(1);\n  const audioUrl = quran.getAudioUrl('invalid-reciter', 1, 1);\n} catch (error) {\n  if (error instanceof QuranError) {\n    switch (error.code) {\n      case QuranErrorCode.INVALID_SURAH_NUMBER:\n        console.error('Invalid surah number');\n        break;\n      case QuranErrorCode.RECITER_NOT_FOUND:\n        console.error('Reciter not found');\n        break;\n      case QuranErrorCode.AUDIO_URL_NOT_FOUND:\n        console.error('Audio URL not found');\n        break;\n      default:\n        console.error('Error:', error.message);\n    }\n  }\n}\n```\n\n## Performance\n\nThe library is optimized for performance:\n\n- **Caching**: Results are cached for frequently accessed data\n- **Efficient Lookups**: O(1) Map-based lookups for surahs\n- **Lazy Evaluation**: Data is loaded only when needed\n- **Tree-Shaking**: Unused code is eliminated in production builds\n\nExpected performance:\n- `getAllSurahs()`: < 1ms (cached after first call)\n- `getSurah()`: < 0.1ms (Map lookup)\n- `getSurahs()` (filtered): < 1ms (cached)\n- `search()`: < 100ms (depends on query)\n- `getSurahsPaginated()`: < 1ms\n\n## TypeScript Support\n\nFull TypeScript support with comprehensive types:\n\n```typescript\nimport type { \n  Surah, \n  Ayah, \n  Reciter, \n  FilterOptions,\n  PaginationOptions,\n  PaginatedResult,\n  SearchOptions,\n  SearchResult \n} from '@calgiellc/quran';\n```\n\n## Data Structure\n\n### Surah\n```typescript\ninterface Surah {\n  number: number; // 1-114\n  name: string; // Arabic name\n  nameTransliterated: string; // Romanized name\n  nameTranslated?: { [language: string]: string };\n  numberOfAyahs: number;\n  revelationType: 'meccan' | 'medinan';\n  ayahs: Ayah[];\n  fullText?: string; // Full surah text with ayah separators\n}\n```\n\n### Ayah\n```typescript\ninterface Ayah {\n  number: number; // Ayah number within surah\n  text: string; // Arabic text\n  textSimple?: string;\n  transliteration?: string;\n  translations?: { [language: string]: string };\n}\n```\n\n### Reciter\n```typescript\ninterface Reciter {\n  id: string;\n  name: string;\n  nameArabic?: string;\n  audioFormat: 'mp3' | 'm4a' | 'ogg';\n  audioBaseUrl: string;\n  language?: string; // For mp3quran.net format\n  urlName?: string; // For mp3quran.net format\n  surahs: number[]; // Available surah numbers\n}\n```\n\n## Contributing\n\nContributions are welcome! Please read our contributing guidelines before submitting PRs.\n\n## License\n\nMIT\n\n## Support\n\nFor issues, questions, or contributions, please visit our [GitHub repository](https://github.com/calgiellc/quran-npm).\n\n## Acknowledgments\n\n- Quran text from [Al-Quran Cloud API](https://alquran.cloud/api)\n- Audio URLs from [mp3quran.net](https://www.mp3quran.net)\n\n# quran-npm\n","readmeFilename":"README.md"}