{"_id":"@bonyanoss/bonyan-api","_rev":"3-40c724d77c23dfa50c3e7b609f7890c0","name":"@bonyanoss/bonyan-api","dist-tags":{"latest":"1.0.2"},"versions":{"1.0.0":{"name":"@bonyanoss/bonyan-api","version":"1.0.0","keywords":["bonyan","bonyanoss","islamic","quran","quran-api","azkar","hadith","tafsir","prayer-times","hijri","qibla","reciters","typescript","sdk"],"license":"MIT","_id":"@bonyanoss/bonyan-api@1.0.0","maintainers":[{"name":"bonyanoss","email":"bonyanoss@outlook.com"}],"homepage":"https://github.com/BonyanOSS/bonyan-sdk-js#readme","bugs":{"url":"https://github.com/BonyanOSS/bonyan-sdk-js/issues"},"dist":{"shasum":"46be0d6b9749687556f08246281a6523555b0eb3","tarball":"https://registry.npmjs.org/@bonyanoss/bonyan-api/-/bonyan-api-1.0.0.tgz","fileCount":11,"integrity":"sha512-50yk0VESS1ccPXmE/mKJ0BzuBpy7PeR8pYRfksk+agLFHAX1J5m6pgZw6VP7t7Lgecl0cQlwgFSWni+GKe15hQ==","signatures":[{"sig":"MEUCIC7IEkfwze6b6AkmsVjpQ0lMw8Xm3uwDYtdtNjFYpk7IAiEA18lobf6PComYzajo37BnSa7nU5VWD2wUqCjeWXLeEU4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@bonyanoss%2fbonyan-api@1.0.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":211250},"main":"./dist/index.cjs","type":"module","_from":"file:bonyanoss-bonyan-api-1.0.0.tgz","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./package.json":"./package.json"},"scripts":{"dev":"tsup --watch","lint":"eslint . && prettier --check .","test":"vitest run","build":"tsup","clean":"rimraf dist coverage","format":"prettier --write .","typecheck":"tsc --noEmit","test:watch":"vitest","test:coverage":"vitest run --coverage"},"_npmUser":{"name":"bonyanoss","email":"bonyanoss@outlook.com"},"_resolved":"/tmp/ef9c1f7e298f1a935619f229bae118b5/bonyanoss-bonyan-api-1.0.0.tgz","_integrity":"sha512-50yk0VESS1ccPXmE/mKJ0BzuBpy7PeR8pYRfksk+agLFHAX1J5m6pgZw6VP7t7Lgecl0cQlwgFSWni+GKe15hQ==","repository":{"url":"git+https://github.com/BonyanOSS/bonyan-sdk-js.git","type":"git"},"_npmVersion":"10.8.2","description":"Official JavaScript and TypeScript SDK for Bonyan-API — Quran, Azkar, Hadith, Tafsir, Prayer times, Hijri, Qibla.","directories":{},"sideEffects":false,"_nodeVersion":"20.20.2","publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","eslint":"^10.4.0","rimraf":"^6.0.1","vitest":"^4.1.6","prettier":"^3.8.3","@eslint/js":"^10.0.1","typescript":"^6.0.3","@types/node":"^22.10.0","@vitest/coverage-v8":"^4.1.6","eslint-config-prettier":"^10.1.5","@typescript-eslint/parser":"^8.20.0","@typescript-eslint/eslint-plugin":"^8.20.0"},"_npmOperationalInternal":{"tmp":"tmp/bonyan-api_1.0.0_1779757860607_0.23121434734064827","host":"s3://npm-registry-packages-npm-production"}},"1.0.1":{"name":"@bonyanoss/bonyan-api","version":"1.0.1","keywords":["bonyan","bonyanoss","islamic","quran","quran-api","azkar","hadith","tafsir","prayer-times","hijri","qibla","reciters","typescript","sdk"],"license":"MIT","_id":"@bonyanoss/bonyan-api@1.0.1","maintainers":[{"name":"bonyanoss","email":"bonyanoss@outlook.com"}],"homepage":"https://github.com/BonyanOSS/bonyan-sdk-js#readme","bugs":{"url":"https://github.com/BonyanOSS/bonyan-sdk-js/issues"},"dist":{"shasum":"86ab3022db6221670656a2209969feca9a9d72c6","tarball":"https://registry.npmjs.org/@bonyanoss/bonyan-api/-/bonyan-api-1.0.1.tgz","fileCount":11,"integrity":"sha512-Hziu9rt/fy7CMx9MUOO2mHT7zEClR0OTbjCeG9JKCptq1lRX+PAu7N5dsnUmgYALCKZ7TfnWo1Lt1PYjp8rPIg==","signatures":[{"sig":"MEUCICaIU7QTEx4hjrpEMXhv76iyW1fV8CgSe8py9SkESRR5AiEAg/R8AeNhIVPNBUEzxE65w/MX1szZZYPH8J99zgPGv3Y=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@bonyanoss%2fbonyan-api@1.0.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":211380},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./package.json":"./package.json"},"gitHead":"3f1d5c59f235049fc40eafb3616a139d3835048d","scripts":{"dev":"tsup --watch","lint":"eslint . && prettier --check .","test":"vitest run","build":"tsup","clean":"rimraf dist coverage","format":"prettier --write .","typecheck":"tsc --noEmit","test:watch":"vitest","test:coverage":"vitest run --coverage","prepublishOnly":"pnpm clean && pnpm lint && pnpm typecheck && pnpm test && pnpm build"},"_npmUser":{"name":"bonyanoss","email":"bonyanoss@outlook.com"},"repository":{"url":"git+https://github.com/BonyanOSS/bonyan-sdk-js.git","type":"git"},"_npmVersion":"11.16.0","description":"Official JavaScript and TypeScript SDK for Bonyan-API — Quran, Azkar, Hadith, Tafsir, Prayer times, Hijri, Qibla.","directories":{},"sideEffects":false,"_nodeVersion":"24.16.0","publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"packageManager":"pnpm@10.33.4","devDependencies":{"tsup":"^8.5.1","eslint":"^10.4.1","rimraf":"^6.1.3","vitest":"^4.1.8","prettier":"^3.8.3","@eslint/js":"^10.0.1","typescript":"^6.0.3","@types/node":"^25.9.1","@vitest/coverage-v8":"^4.1.8","eslint-config-prettier":"^10.1.8","@typescript-eslint/parser":"^8.60.1","@typescript-eslint/eslint-plugin":"^8.60.1"},"_npmOperationalInternal":{"tmp":"tmp/bonyan-api_1.0.1_1780553160482_0.8774008672451699","host":"s3://npm-registry-packages-npm-production"}},"1.0.2":{"name":"@bonyanoss/bonyan-api","version":"1.0.2","description":"Official JavaScript and TypeScript SDK for Bonyan-API — Quran, Azkar, Hadith, Tafsir, Prayer times, Hijri, Qibla.","license":"MIT","type":"module","main":"./dist/index.cjs","module":"./dist/index.js","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./package.json":"./package.json"},"scripts":{"build":"tsup","dev":"tsup --watch","test":"vitest run","test:watch":"vitest","test:coverage":"vitest run --coverage","typecheck":"tsc --noEmit","lint":"eslint . && prettier --check .","format":"prettier --write .","clean":"rimraf dist coverage","prepublishOnly":"pnpm clean && pnpm lint && pnpm typecheck && pnpm test && pnpm build"},"repository":{"type":"git","url":"git+https://github.com/BonyanOSS/bonyan-sdk-js.git"},"bugs":{"url":"https://github.com/BonyanOSS/bonyan-sdk-js/issues"},"homepage":"https://github.com/BonyanOSS/bonyan-sdk-js#readme","keywords":["bonyan","bonyanoss","islamic","quran","quran-api","azkar","hadith","tafsir","prayer-times","hijri","qibla","reciters","typescript","sdk"],"publishConfig":{"access":"public","provenance":true},"sideEffects":false,"engines":{"node":">=22"},"packageManager":"pnpm@11.7.0","devDependencies":{"@eslint/js":"^10.0.1","@types/node":"^25.9.3","@typescript-eslint/eslint-plugin":"^8.61.0","@typescript-eslint/parser":"^8.61.0","@vitest/coverage-v8":"^4.1.9","eslint":"^10.5.0","eslint-config-prettier":"^10.1.8","prettier":"^3.8.4","rimraf":"^6.1.3","tsup":"^8.5.1","typescript":"^6.0.3","vitest":"^4.1.9"},"gitHead":"4b6ea75b20c58fe2b05f9b680503e7635721700c","_id":"@bonyanoss/bonyan-api@1.0.2","_nodeVersion":"24.16.0","_npmVersion":"11.17.0","dist":{"integrity":"sha512-sown/KBX7nGOT2By/Fw9sIqVNd9oiefee//rw+FTgCdqjK2vWfAzocnLWtAhYd+cBgeO3DHVlIht4O5Pp6HBxA==","shasum":"58ba6c24e445d21ab4d72b085f935ceb8bb78b5f","tarball":"https://registry.npmjs.org/@bonyanoss/bonyan-api/-/bonyan-api-1.0.2.tgz","fileCount":11,"unpackedSize":217638,"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@bonyanoss%2fbonyan-api@1.0.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQDfZH2WX0MpK8X6I1AZTRiqify7wy09iX/wF2dR51h8TgIgMCIjFll+V9y6Wl4w5q5vd+4wiu8cNK8ckkHoCNYmP5k="}]},"_npmUser":{"name":"bonyanoss","email":"bonyanoss@outlook.com"},"directories":{},"maintainers":[{"name":"bonyanoss","email":"bonyanoss@outlook.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/bonyan-api_1.0.2_1781613934826_0.3525266154118072"},"_hasShrinkwrap":false}},"time":{"created":"2026-05-26T01:11:00.469Z","modified":"2026-06-16T12:45:35.303Z","1.0.0":"2026-05-26T01:11:00.858Z","1.0.1":"2026-06-04T06:06:00.656Z","1.0.2":"2026-06-16T12:45:34.966Z"},"bugs":{"url":"https://github.com/BonyanOSS/bonyan-sdk-js/issues"},"license":"MIT","homepage":"https://github.com/BonyanOSS/bonyan-sdk-js#readme","keywords":["bonyan","bonyanoss","islamic","quran","quran-api","azkar","hadith","tafsir","prayer-times","hijri","qibla","reciters","typescript","sdk"],"repository":{"type":"git","url":"git+https://github.com/BonyanOSS/bonyan-sdk-js.git"},"description":"Official JavaScript and TypeScript SDK for Bonyan-API — Quran, Azkar, Hadith, Tafsir, Prayer times, Hijri, Qibla.","maintainers":[{"name":"bonyanoss","email":"bonyanoss@outlook.com"}],"readme":"# @bonyanoss/bonyan-api\n\n[![npm](https://img.shields.io/npm/v/@bonyanoss/bonyan-api.svg)](https://www.npmjs.com/package/@bonyanoss/bonyan-api)\n[![CI](https://github.com/BonyanOSS/bonyan-sdk-js/actions/workflows/ci.yml/badge.svg)](https://github.com/BonyanOSS/bonyan-sdk-js/actions/workflows/ci.yml)\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE)\n[![TypeScript](https://img.shields.io/badge/TypeScript-strict-blue.svg)](https://www.typescriptlang.org/)\n[![npm downloads](https://img.shields.io/npm/d18m/%40bonyanoss%2Fbonyan-api\n)](https://www.npmjs.com/package/@bonyanoss/bonyan-api)\n\nOfficial JavaScript / TypeScript SDK for **[Bonyan-API](https://github.com/BonyanOSS/Bonyan-API)** — a unified API for Quran, Azkar, Hadith, Tafsir, Prayer times, Hijri calendar and Qibla direction, with automatic fallback between multiple upstream sources.\n\n```ts\nimport { BonyanClient } from '@bonyanoss/bonyan-api';\n\nconst client = new BonyanClient();\n\nconst reciters = await client.reciters.list();\nconst fatiha = await client.surah.getById(1);\nconst morning = await client.azkar.getByCategory('أذكار الصباح');\n```\n\n---\n\n## Table of contents\n\n- [Install](#install)\n- [Quick start](#quick-start)\n- [Client options](#client-options)\n- [Resources](#resources)\n  - [`reciters`](#reciters) · [`surah`](#surah) · [`ayat`](#ayat) · [`azkar`](#azkar) · [`tafsir`](#tafsir) · [`hadith`](#hadith) · [`prayer`](#prayer) · [`hijri`](#hijri) · [`qibla`](#qibla)\n- [Error handling](#error-handling)\n- [Validation](#validation)\n- [Retry and rate limiting](#retry-and-rate-limiting)\n- [Custom fetch / environments](#custom-fetch--environments)\n- [TypeScript](#typescript)\n- [Contributing](#contributing)\n- [License](#license)\n\n---\n\n## Install\n\n```bash\nnpm install @bonyanoss/bonyan-api\npnpm add @bonyanoss/bonyan-api\nyarn add @bonyanoss/bonyan-api\n```\n\n**Requirements:** Node.js ≥ 20, or any modern browser. No runtime dependencies.\n\n---\n\n## Quick start\n\n```ts\nimport { BonyanClient } from '@bonyanoss/bonyan-api';\n\nconst client = new BonyanClient();\n\n// Surahs\nconst surahs = await client.surah.list();          // 114 chapters\nconst fatiha = await client.surah.getById(1);\n\n// Ayat\nconst verse = await client.ayat.getBySurah(2, 255); // Ayat al-Kursi\nconst search = await client.ayat.search('الرحمن', { limit: 20 });\nconsole.log(search.total, search.results.length);\n\n// Reciters\nconst reciter = await client.reciters.getById(1);\nconst audio = await client.reciters.getSurah(1, 1);\n\n// Prayer times\nconst times = await client.prayer.getTimes({ city: 'Mecca', country: 'SA' });\n\n// Health / metadata\nconst health = await client.health();\nconst readiness = await client.ready();\n```\n\n---\n\n## Client options\n\n```ts\nimport { BonyanClient } from '@bonyanoss/bonyan-api';\n\nconst client = new BonyanClient({\n  baseUrl: 'https://api.bonyanoss.org', // default\n  timeoutMs: 10_000,                                  // default 10 s\n  retry: 3,                                           // default 3\n  headers: { 'X-App-Id': 'my-app' },                  // optional\n  userAgent: 'my-app/1.0',                            // optional\n  fetch: customFetch,                                 // optional custom fetch\n});\n```\n\n| Option | Type | Default | Description |\n| --- | --- | --- | --- |\n| `baseUrl` | `string` | `https://api.bonyanoss.org` | Base URL of the API |\n| `timeoutMs` | `number` | `10_000` | Per-request timeout in milliseconds |\n| `retry` | `number` | `3` | Retry attempts on 5xx / 429 / network errors |\n| `headers` | `Record<string, string>` | — | Extra headers applied to every request |\n| `userAgent` | `string` | — | Adds a `User-Agent` header |\n| `fetch` | `typeof fetch` | `globalThis.fetch` | Override the fetch implementation |\n\n---\n\n## Resources\n\nEvery resource is reachable from the client instance. All methods validate their arguments before hitting the network — invalid input throws [`ValidationError`](#error-handling).\n\n### `reciters`\n\n| Method | Endpoint |\n| --- | --- |\n| `client.reciters.list()` | `GET /reciters` |\n| `client.reciters.getById(id)` | `GET /reciters/:id` |\n| `client.reciters.search(name)` | `GET /reciters/search?name=…` |\n| `client.reciters.getSurah(reciterId, surah)` | `GET /reciters/:id/surah/:surah` |\n\n```ts\nconst all = await client.reciters.list();\nconst reciter = await client.reciters.getById(1);\nconst matches = await client.reciters.search('العفاسي');\nconst audio = await client.reciters.getSurah(1, 1);\n```\n\n### `surah`\n\n| Method | Endpoint |\n| --- | --- |\n| `client.surah.list()` | `GET /surah` |\n| `client.surah.getById(id)` | `GET /surah/:id` |\n| `client.surah.search(name)` | `GET /surah/search?name=…` |\n\n### `ayat`\n\n| Method | Endpoint |\n| --- | --- |\n| `client.ayat.list()` | `GET /ayat` *(heavy response — every ayah of every surah)* |\n| `client.ayat.getById(id)` | `GET /ayat/:id` — global id (1..6236) |\n| `client.ayat.getBySurah(surah, aya)` | `GET /ayat/:surah/aya/:aya` — surah (1..114) + aya (1..286) |\n| `client.ayat.search(text, { limit })` | `GET /ayat/search?text=…&limit=…` (max 500) |\n\n```ts\nconst { total, results } = await client.ayat.search('الرحمن', { limit: 50 });\n```\n\n### `azkar`\n\n| Method | Endpoint |\n| --- | --- |\n| `client.azkar.listCategories()` | `GET /azkar` |\n| `client.azkar.getByCategory(category)` | `GET /azkar/:category` |\n| `client.azkar.search(text, { limit })` | `GET /azkar/search?text=…&limit=…` |\n| `client.azkar.random()` | `GET /azkar/random` |\n\n### `tafsir`\n\n| Method | Endpoint |\n| --- | --- |\n| `client.tafsir.listEditions()` | `GET /tafsir` |\n| `client.tafsir.forSurah(edition, surah, { aya })` | `GET /tafsir/:edition/:surah` |\n| `client.tafsir.forAya(edition, surah, aya)` | `GET /tafsir/:edition/:surah/:aya` |\n\n### `hadith`\n\n| Method | Endpoint |\n| --- | --- |\n| `client.hadith.listBooks()` | `GET /hadith` |\n| `client.hadith.getBook(bookId, { from, to })` | `GET /hadith/:book` |\n| `client.hadith.getByNumber(bookId, number)` | `GET /hadith/:book/:number` |\n| `client.hadith.random({ book })` | `GET /hadith/random` |\n\nThe `from`/`to` range is capped at **300 items** per request.\n\n### `prayer`\n\n| Method | Endpoint |\n| --- | --- |\n| `client.prayer.getTimes(options)` | `GET /prayer/times` |\n\n`options` requires **either** `latitude` + `longitude`, **or** `city` + `country`. Optional: `date` (`DD-MM-YYYY`), `method` (calculation method).\n\n### `hijri`\n\n| Method | Endpoint |\n| --- | --- |\n| `client.hijri.today()` | `GET /hijri/today` |\n| `client.hijri.fromGregorian(date?)` | `GET /hijri/from-gregorian?date=DD-MM-YYYY` |\n| `client.hijri.toGregorian(date)` | `GET /hijri/to-gregorian?date=DD-MM-YYYY` |\n\n### `qibla`\n\n| Method | Endpoint |\n| --- | --- |\n| `client.qibla.getDirection(latitude, longitude)` | `GET /qibla?latitude=…&longitude=…` |\n\n### `meta`\n\n| Method | Endpoint |\n| --- | --- |\n| `client.health()` | `GET /health` - returns `{ status, code, timestamp }` (no envelope) |\n| `client.ready()` | `GET /ready` - returns readiness plus cache stats |\n| `client.routes()` | `GET /` - returns the API route catalogue |\n| `client.metrics()` | `GET /metrics` - returns Prometheus metrics as text |\n\n---\n\n## Error handling\n\nThe SDK throws **three** distinct error classes — handle each one by `instanceof` or the exported type guards.\n\n```ts\nimport {\n  BonyanClient,\n  BonyanApiError,\n  BonyanRequestError,\n  ValidationError,\n} from '@bonyanoss/bonyan-api';\n\nconst client = new BonyanClient();\n\ntry {\n  await client.reciters.getById(999_999);\n} catch (error) {\n  if (error instanceof ValidationError) {\n    console.error('Invalid input on field:', error.field, error.message);\n  } else if (error instanceof BonyanApiError) {\n    // The API responded with a non-2xx\n    console.error(error.status, error.code, error.requestId, error.message);\n  } else if (error instanceof BonyanRequestError) {\n    // Network failure, timeout, DNS, …\n    console.error('Network error:', error.message);\n  }\n}\n```\n\n| Class | When | Notable fields |\n| --- | --- | --- |\n| `ValidationError` | Argument failed client-side validation (no network request was sent) | `field` |\n| `BonyanApiError` | API returned a non-2xx response | `status`, `code`, `requestId`, `retryAfterMs`, `body` |\n| `BonyanRequestError` | Network error, DNS, timeout, abort | `cause` |\n\nType guards: `isBonyanApiError`, `isBonyanRequestError`, `isValidationError`.\n\n---\n\n## Validation\n\nEvery argument is checked **before** a request is sent:\n\n- `surah` must be an integer in `1..114`\n- Global aya `id` (used by `ayat.getById`) must be in `1..6236`\n- Per-surah `aya` number (in `ayat.getBySurah`, `tafsir.forAya`) must be in `1..286`\n- `latitude` ∈ `[-90, 90]`, `longitude` ∈ `[-180, 180]`\n- Dates use the `DD-MM-YYYY` format\n- Search `limit` is bounded per endpoint (200 for `azkar`, 500 for `ayat`)\n- Hadith `from`/`to` range is capped at 300\n\nWhen validation fails, `ValidationError` is thrown synchronously — no HTTP request is made.\n\n---\n\n## Retry and rate limiting\n\nBy default the SDK retries up to **3 times** on:\n\n- `5xx` server errors\n- `429 Too Many Requests`\n- Network errors (DNS failure, socket reset, timeout)\n\n`Retry-After` headers (in seconds or HTTP-date) are honored. Between attempts the SDK sleeps with **exponential backoff + jitter** (`100ms * 2^attempt + random(0-100)`).\n\nDisable retries entirely:\n\n```ts\nconst client = new BonyanClient({ retry: 0 });\n```\n\n---\n\n## Custom fetch / environments\n\nThe SDK uses `globalThis.fetch` by default. To use it on a runtime without a global fetch, or with a custom HTTP stack:\n\n```ts\nimport { BonyanClient } from '@bonyanoss/bonyan-api';\nimport { fetch as undiciFetch } from 'undici';\n\nconst client = new BonyanClient({ fetch: undiciFetch as typeof fetch });\n```\n\nWorks out of the box on:\n\n- ✅ Node.js ≥ 20\n- ✅ Browsers (Chrome, Firefox, Safari, Edge)\n- ✅ Deno, Bun\n- ✅ Cloudflare Workers, Vercel Edge, Netlify Edge\n\n---\n\n## TypeScript\n\nThe SDK ships with **strict** type definitions — `strict`, `exactOptionalPropertyTypes`, `noUncheckedIndexedAccess`. Every public API has TSDoc comments visible in your editor.\n\n```ts\nimport type {\n  Reciter,\n  Surah,\n  Aya,\n  AzkarItem,\n  HadithItem,\n  PrayerTimings,\n  HijriDate,\n  QiblaInfo,\n} from '@bonyanoss/bonyan-api';\n```\n\n---\n\n## Contributing\n\nWe :heart: pull requests! See **[CONTRIBUTING.md](CONTRIBUTING.md)** for the dev setup, code style, and how to add a new resource.\n\nQuick start:\n\n```bash\npnpm install\npnpm test\npnpm build\n```\n\n---\n\n## License\n\n[MIT](LICENSE) © [BonyanOSS](https://github.com/BonyanOSS)\n","readmeFilename":"README.md"}