{"name":"@playlive/tiltify-search","dist-tags":{"latest":"0.4.7"},"versions":{"0.4.5":{"name":"@playlive/tiltify-search","version":"0.4.5","description":"Meilisearch wrappers + flags client for the public Tiltify site-search surface.","type":"module","sideEffects":false,"main":"./index.js","types":"./index.d.ts","exports":{".":{"import":"./index.js","types":"./index.d.ts"},"./types":{"import":"./types.js","types":"./types.d.ts"},"./constants":{"import":"./constants.js","types":"./constants.d.ts"},"./filters":{"import":"./build-filter-string.js","types":"./build-filter-string.d.ts"},"./flags":{"import":"./tiltify-flags.js","types":"./tiltify-flags.d.ts"},"./multi":{"import":"./multi-search.js","types":"./multi-search.d.ts"},"./campaigns":{"import":"./campaign-search.js","types":"./campaign-search.d.ts"},"./teams":{"import":"./team-search.js","types":"./team-search.d.ts"},"./users":{"import":"./user-search.js","types":"./user-search.d.ts"},"./causes":{"import":"./cause-search.js","types":"./cause-search.d.ts"},"./rewards":{"import":"./reward-search.js","types":"./reward-search.d.ts"},"./auction-houses":{"import":"./auction-house-search.js","types":"./auction-house-search.d.ts"},"./converters":{"import":"./converters.js","types":"./converters.d.ts"},"./http-client":{"import":"./http-client.js","types":"./http-client.d.ts"},"./meilisearch-client":{"import":"./meilisearch-client.js","types":"./meilisearch-client.d.ts"}},"peerDependencies":{"@playlive/tiltify-core":"^0.4.11","meilisearch":"^0.54.0"},"peerDependenciesMeta":{"@playlive/tiltify-core":{"optional":true},"meilisearch":{"optional":false}},"playlive":{"target":"browser","frontendEligible":true,"coverageFloor":85},"publishConfig":{"access":"restricted","registry":"https://playlive-767397689694.d.codeartifact.us-east-1.amazonaws.com/npm/playlive/"},"integrity":"sha512-frqXh0QlNri3J9CHfuGoXD8v6rxUHNC6Yjb1XsLtM6HEHlIg2cXWMteqIiubDA9TcbQbJ2y99QPkkdaxtdFWKA==","shasum":"487ecdd7d6aa5cd1aaf0fca91b1a8b15697aa4c9","readme":"# @playlive/tiltify-search\n\nMeilisearch wrappers + a `flags.tiltify.com` client for the public Tiltify\nsite-search surface. Ported from `@playlive/tiltify-tools`; class signatures,\ndefaults, and the filter-string builder are preserved verbatim so consumers\ncan migrate by changing the import specifier alone.\n\n![Coverage](./coverage-badge.svg)\n\n## Install\n\n```bash\nbun add @playlive/tiltify-search meilisearch\n```\n\n`meilisearch` is an **optional peer dependency** — it's only required if you\nimport a class that wraps it (`CampaignSearch`, `AuctionHouseSearch`,\n`CauseSearch`, `RewardSearch`, `TeamSearch`, `UserSearch`). The\n`TiltifyMultiSearch`, `TiltifyFlags`, and `buildFilterString` exports use\nonly native `fetch` and have zero peer deps.\n\n## Quick start\n\n```ts\nimport { CampaignSearch, TiltifyFlags } from \"@playlive/tiltify-search\";\n\nconst cs = new CampaignSearch();\nconst page = await cs.getCampaigns({\n  page: 1,\n  hitsPerPage: 20,\n  filter: { public: true, type: \"campaign\" },\n  query: \"marathon\",\n});\n\n// Walk every campaign matching a filter — works around Meilisearch's\n// `maxTotalHits` cap by recursively partitioning along facetable axes.\nconst all = await cs.getAllCampaigns(\n  { public: true, type: \"campaign\" },\n  ({ collected, total }) => console.log(`${collected}/${total}`),\n);\n\n// Hit the public flag endpoint\nconst flags = await new TiltifyFlags().getFlags();\n```\n\n## Subpath exports\n\n| Subpath                                | Description                                                                  |\n| -------------------------------------- | ---------------------------------------------------------------------------- |\n| `@playlive/tiltify-search`             | Default barrel — re-exports everything below.                                |\n| `@playlive/tiltify-search/types`       | Type-only barrel (`FactHit`, `FilterableFields`, `FACT_DATA_TYPES`).         |\n| `@playlive/tiltify-search/constants`   | `DEFAULT_SEARCH_API_KEY`, `DEFAULT_SEARCH_HOST`, `DEFAULT_FLAGS_URL`.        |\n| `@playlive/tiltify-search/filters`     | `buildFilterString` (no meilisearch dep).                                     |\n| `@playlive/tiltify-search/flags`       | `TiltifyFlags` (no meilisearch dep).                                          |\n| `@playlive/tiltify-search/multi`       | `TiltifyMultiSearch` (no meilisearch dep — raw HTTP).                         |\n| `@playlive/tiltify-search/campaigns`   | `CampaignSearch` + the `getAllCampaigns` partitioner.                         |\n| `@playlive/tiltify-search/teams`       | `TeamSearch`.                                                                 |\n| `@playlive/tiltify-search/users`       | `UserSearch`.                                                                 |\n| `@playlive/tiltify-search/causes`      | `CauseSearch` + cause-index types.                                            |\n| `@playlive/tiltify-search/rewards`     | `RewardSearch` + reward types.                                                |\n| `@playlive/tiltify-search/auction-houses` | `AuctionHouseSearch` + `CAUSE_IDS.ST_JUDE`.                               |\n\nThe `/filters`, `/flags`, `/multi`, and `/types` subpaths are completely\nfree of `meilisearch` — useful when you want filter-string composition or\nthe raw multi-search endpoint without paying for the SDK.\n\n## API reference\n\nRun `bun run docs:build` inside this package to emit the TypeDoc site at\n`dist/docs/`. The aggregate site (every package merged) is built via\n`bun run docs:site` at the workspace root.\n\nTop-level exports:\n\n| Export                       | Source              | Notes                                                  |\n| ---------------------------- | ------------------- | ------------------------------------------------------ |\n| `buildFilterString`          | `./filters`         | Meilisearch filter literal composer.                   |\n| `CampaignSearch`             | `./campaigns`       | `facts` index wrapper + `getAllCampaigns` partitioner. |\n| `AuctionHouseSearch`         | `./auction-houses`  | `facts` index wrapper scoped to `auction_house`.       |\n| `CAUSE_IDS`                  | `./auction-houses`  | `{ ST_JUDE: \"...\" }`.                                  |\n| `CauseSearch`                | `./causes`          | Wraps `causes`, `fundraising_events`, `causes_and_fes`. |\n| `RewardSearch`               | `./rewards`         | `rewards` index wrapper.                                |\n| `TeamSearch`                 | `./teams`           | `teams` index wrapper.                                  |\n| `UserSearch`                 | `./users`           | `user` index wrapper (`findUserByUsername` only).       |\n| `TiltifyMultiSearch`         | `./multi`           | Native-fetch wrapper for `POST /multi-search`.          |\n| `TiltifyFlags`               | `./flags`           | `flags.tiltify.com` client.                             |\n| `FactHit`, `FilterableFields`| `./types`           | Shared search types.                                    |\n| `FACT_DATA_TYPES`            | `./types`           | Sub-resource enumeration.                               |\n| `KNOWN_URLS`                 | `./`                | Twitch Extension URL disclosure.                        |\n| `PACKAGE_NAME`               | `./`                | Identifier for runtime version-pinning.                 |\n\n## Upstream spec\n\nTiltify does not publish a schema for the public Meilisearch indices. The\nfield shapes here mirror what `tiltify.com` itself sends. When you observe\nnew fields on the wire, update `src/types.ts` + the relevant wrapper class.\n\nThe companion REST OpenAPI snapshots (for `@playlive/tiltify-core`) live at\n[`specs/tiltify/`](../../../specs/tiltify/). Re-sync via `/charity:sync` or\n`bun run specs:sync:tiltify`.\n\n## Twitch Extension URL disclosure\n\nThe `KNOWN_URLS` export enumerates every absolute URL or host this package\ncan fetch. See [`docs/twitch-extension-checklist.md`](../../../docs/twitch-extension-checklist.md).\n\n```ts\nimport { KNOWN_URLS } from \"@playlive/tiltify-search\";\nconsole.log(KNOWN_URLS);\n// [\n//   \"https://site-search.tiltify.com\",\n//   \"https://flags.tiltify.com\",\n// ]\n```\n\nKeep this list and the source export in sync — the Extension submission form\nrequires the disclosure list verbatim.\n\n## Migration from `@playlive/tiltify-tools`\n\n`@playlive/tiltify-search` is a near drop-in replacement for the search +\nflags surface that used to live inside `tiltify-tools`. Every class, method\nsignature, and exported type is preserved unchanged with one exception:\n\n- **`UserSearch#getUserBySlug` was removed.** That method hit the Tiltify\n  GraphQL endpoint and required a transitive GraphQL dependency. Per PRD\n  §5.3, the search package now stays free of any GraphQL dependency.\n  Replacement: `TiltifyGraphQL#getUserBySlug` in\n  [`@playlive/tiltify-graphql`](../graphql/README.md).\n\nImports just move:\n\n```diff\n- import { CampaignSearch } from \"@playlive/tiltify-tools/campaign-search\";\n+ import { CampaignSearch } from \"@playlive/tiltify-search\";\n```\n\nSee the root [`MIGRATION.md`](../../../MIGRATION.md) for the full per-symbol\ntable.\n\n## Examples\n\nRealistic end-to-end scenarios (cause search → reward enumeration → top\nauction-house drill-down) land in `examples/` once `dev/greenroom` (phase 8)\nis wired up as the harness.\n\n## Contributing\n\nSee [CONTRIBUTING.md](../../../CONTRIBUTING.md). To add a new search\nwrapper:\n\n1. Add the class to `src/<name>-search.ts` with full TSDoc.\n2. Re-export from `src/index.ts` + add a subpath in `package.json` exports.\n3. Update `build.ts` entrypoints.\n4. Port unit tests under `tests/unit/`.\n5. Append to the changelog + migration table.\n\n## License\n\nMIT — see [LICENSE](../../../LICENSE). Distributed via Play Live\nCodeArtifact (PRD §6).\n","readmeFilename":"README.md","dist":{"tarball":"https://packages.playlive.experience.stjude.org/@playlive/tiltify-search/-/tiltify-search-0.4.5.tgz","shasum":"487ecdd7d6aa5cd1aaf0fca91b1a8b15697aa4c9","integrity":"sha512-frqXh0QlNri3J9CHfuGoXD8v6rxUHNC6Yjb1XsLtM6HEHlIg2cXWMteqIiubDA9TcbQbJ2y99QPkkdaxtdFWKA=="}},"0.1.0":{"name":"@playlive/tiltify-search","version":"0.1.0","description":"Meilisearch wrappers + flags client for the public Tiltify site-search surface.","type":"module","sideEffects":false,"main":"./index.js","types":"./index.d.ts","exports":{".":{"import":"./index.js","types":"./index.d.ts"},"./types":{"import":"./types.js","types":"./types.d.ts"},"./constants":{"import":"./constants.js","types":"./constants.d.ts"},"./filters":{"import":"./build-filter-string.js","types":"./build-filter-string.d.ts"},"./flags":{"import":"./tiltify-flags.js","types":"./tiltify-flags.d.ts"},"./multi":{"import":"./multi-search.js","types":"./multi-search.d.ts"},"./campaigns":{"import":"./campaign-search.js","types":"./campaign-search.d.ts"},"./teams":{"import":"./team-search.js","types":"./team-search.d.ts"},"./users":{"import":"./user-search.js","types":"./user-search.d.ts"},"./causes":{"import":"./cause-search.js","types":"./cause-search.d.ts"},"./rewards":{"import":"./reward-search.js","types":"./reward-search.d.ts"},"./auction-houses":{"import":"./auction-house-search.js","types":"./auction-house-search.d.ts"}},"peerDependencies":{"meilisearch":"^0.54.0"},"peerDependenciesMeta":{"meilisearch":{"optional":true}},"playlive":{"target":"browser","frontendEligible":true,"coverageFloor":85},"publishConfig":{"access":"restricted","registry":"https://playlive-767397689694.d.codeartifact.us-east-1.amazonaws.com/npm/playlive/"},"integrity":"sha512-GAg/oKbvO81wdQn9LIHMIGOWBzFcucEpDQoHCq+Pt3l1U19acP2it7TNrg7s6utZIaUG4/EQ4DjjOQ3OVs6sqg==","shasum":"86a81738dce57bf97a9f11eafaf4aa850a391e4a","readme":"# @playlive/tiltify-search\n\nMeilisearch wrappers + a `flags.tiltify.com` client for the public Tiltify\nsite-search surface. Ported from `@playlive/tiltify-tools`; class signatures,\ndefaults, and the filter-string builder are preserved verbatim so consumers\ncan migrate by changing the import specifier alone.\n\n![Coverage](./coverage-badge.svg)\n\n## Install\n\n```bash\nbun add @playlive/tiltify-search meilisearch\n```\n\n`meilisearch` is an **optional peer dependency** — it's only required if you\nimport a class that wraps it (`CampaignSearch`, `AuctionHouseSearch`,\n`CauseSearch`, `RewardSearch`, `TeamSearch`, `UserSearch`). The\n`TiltifyMultiSearch`, `TiltifyFlags`, and `buildFilterString` exports use\nonly native `fetch` and have zero peer deps.\n\n## Quick start\n\n```ts\nimport { CampaignSearch, TiltifyFlags } from \"@playlive/tiltify-search\";\n\nconst cs = new CampaignSearch();\nconst page = await cs.getCampaigns({\n  page: 1,\n  hitsPerPage: 20,\n  filter: { public: true, type: \"campaign\" },\n  query: \"marathon\",\n});\n\n// Walk every campaign matching a filter — works around Meilisearch's\n// `maxTotalHits` cap by recursively partitioning along facetable axes.\nconst all = await cs.getAllCampaigns(\n  { public: true, type: \"campaign\" },\n  ({ collected, total }) => console.log(`${collected}/${total}`),\n);\n\n// Hit the public flag endpoint\nconst flags = await new TiltifyFlags().getFlags();\n```\n\n## Subpath exports\n\n| Subpath                                | Description                                                                  |\n| -------------------------------------- | ---------------------------------------------------------------------------- |\n| `@playlive/tiltify-search`             | Default barrel — re-exports everything below.                                |\n| `@playlive/tiltify-search/types`       | Type-only barrel (`FactHit`, `FilterableFields`, `FACT_DATA_TYPES`).         |\n| `@playlive/tiltify-search/constants`   | `DEFAULT_SEARCH_API_KEY`, `DEFAULT_SEARCH_HOST`, `DEFAULT_FLAGS_URL`.        |\n| `@playlive/tiltify-search/filters`     | `buildFilterString` (no meilisearch dep).                                     |\n| `@playlive/tiltify-search/flags`       | `TiltifyFlags` (no meilisearch dep).                                          |\n| `@playlive/tiltify-search/multi`       | `TiltifyMultiSearch` (no meilisearch dep — raw HTTP).                         |\n| `@playlive/tiltify-search/campaigns`   | `CampaignSearch` + the `getAllCampaigns` partitioner.                         |\n| `@playlive/tiltify-search/teams`       | `TeamSearch`.                                                                 |\n| `@playlive/tiltify-search/users`       | `UserSearch`.                                                                 |\n| `@playlive/tiltify-search/causes`      | `CauseSearch` + cause-index types.                                            |\n| `@playlive/tiltify-search/rewards`     | `RewardSearch` + reward types.                                                |\n| `@playlive/tiltify-search/auction-houses` | `AuctionHouseSearch` + `CAUSE_IDS.ST_JUDE`.                               |\n\nThe `/filters`, `/flags`, `/multi`, and `/types` subpaths are completely\nfree of `meilisearch` — useful when you want filter-string composition or\nthe raw multi-search endpoint without paying for the SDK.\n\n## API reference\n\nRun `bun run docs:build` inside this package to emit the TypeDoc site at\n`dist/docs/`. The aggregate site (every package merged) is built via\n`bun run docs:site` at the workspace root.\n\nTop-level exports:\n\n| Export                       | Source              | Notes                                                  |\n| ---------------------------- | ------------------- | ------------------------------------------------------ |\n| `buildFilterString`          | `./filters`         | Meilisearch filter literal composer.                   |\n| `CampaignSearch`             | `./campaigns`       | `facts` index wrapper + `getAllCampaigns` partitioner. |\n| `AuctionHouseSearch`         | `./auction-houses`  | `facts` index wrapper scoped to `auction_house`.       |\n| `CAUSE_IDS`                  | `./auction-houses`  | `{ ST_JUDE: \"...\" }`.                                  |\n| `CauseSearch`                | `./causes`          | Wraps `causes`, `fundraising_events`, `causes_and_fes`. |\n| `RewardSearch`               | `./rewards`         | `rewards` index wrapper.                                |\n| `TeamSearch`                 | `./teams`           | `teams` index wrapper.                                  |\n| `UserSearch`                 | `./users`           | `user` index wrapper (`findUserByUsername` only).       |\n| `TiltifyMultiSearch`         | `./multi`           | Native-fetch wrapper for `POST /multi-search`.          |\n| `TiltifyFlags`               | `./flags`           | `flags.tiltify.com` client.                             |\n| `FactHit`, `FilterableFields`| `./types`           | Shared search types.                                    |\n| `FACT_DATA_TYPES`            | `./types`           | Sub-resource enumeration.                               |\n| `KNOWN_URLS`                 | `./`                | Twitch Extension URL disclosure.                        |\n| `PACKAGE_NAME`               | `./`                | Identifier for runtime version-pinning.                 |\n\n## Upstream spec\n\nTiltify does not publish a schema for the public Meilisearch indices. The\nfield shapes here mirror what `tiltify.com` itself sends. When you observe\nnew fields on the wire, update `src/types.ts` + the relevant wrapper class.\n\nThe companion REST OpenAPI snapshots (for `@playlive/tiltify-core`) live at\n[`specs/tiltify/`](../../../specs/tiltify/). Re-sync via `/charity:sync` or\n`bun run specs:sync:tiltify`.\n\n## Twitch Extension URL disclosure\n\nThe `KNOWN_URLS` export enumerates every absolute URL or host this package\ncan fetch. See [`docs/twitch-extension-checklist.md`](../../../docs/twitch-extension-checklist.md).\n\n```ts\nimport { KNOWN_URLS } from \"@playlive/tiltify-search\";\nconsole.log(KNOWN_URLS);\n// [\n//   \"https://site-search.tiltify.com\",\n//   \"https://flags.tiltify.com\",\n// ]\n```\n\nKeep this list and the source export in sync — the Extension submission form\nrequires the disclosure list verbatim.\n\n## Migration from `@playlive/tiltify-tools`\n\n`@playlive/tiltify-search` is a near drop-in replacement for the search +\nflags surface that used to live inside `tiltify-tools`. Every class, method\nsignature, and exported type is preserved unchanged with one exception:\n\n- **`UserSearch#getUserBySlug` was removed.** That method hit the Tiltify\n  GraphQL endpoint and required a transitive GraphQL dependency. Per PRD\n  §5.3, the search package now stays free of any GraphQL dependency.\n  Replacement: `TiltifyGraphQL#getUserBySlug` in\n  [`@playlive/tiltify-graphql`](../graphql/README.md).\n\nImports just move:\n\n```diff\n- import { CampaignSearch } from \"@playlive/tiltify-tools/campaign-search\";\n+ import { CampaignSearch } from \"@playlive/tiltify-search\";\n```\n\nSee the root [`MIGRATION.md`](../../../MIGRATION.md) for the full per-symbol\ntable.\n\n## Examples\n\nRealistic end-to-end scenarios (cause search → reward enumeration → top\nauction-house drill-down) land in `examples/` once `dev/greenroom` (phase 8)\nis wired up as the harness.\n\n## Contributing\n\nSee [CONTRIBUTING.md](../../../CONTRIBUTING.md). To add a new search\nwrapper:\n\n1. Add the class to `src/<name>-search.ts` with full TSDoc.\n2. Re-export from `src/index.ts` + add a subpath in `package.json` exports.\n3. Update `build.ts` entrypoints.\n4. Port unit tests under `tests/unit/`.\n5. Append to the changelog + migration table.\n\n## License\n\nMIT — see [LICENSE](../../../LICENSE). Distributed via Play Live\nCodeArtifact (PRD §6).\n","readmeFilename":"README.md","dist":{"tarball":"https://packages.playlive.experience.stjude.org/@playlive/tiltify-search/-/tiltify-search-0.1.0.tgz","shasum":"86a81738dce57bf97a9f11eafaf4aa850a391e4a","integrity":"sha512-GAg/oKbvO81wdQn9LIHMIGOWBzFcucEpDQoHCq+Pt3l1U19acP2it7TNrg7s6utZIaUG4/EQ4DjjOQ3OVs6sqg=="}},"0.2.0":{"name":"@playlive/tiltify-search","version":"0.2.0","description":"Meilisearch wrappers + flags client for the public Tiltify site-search surface.","type":"module","sideEffects":false,"main":"./dist/index.js","types":"./dist/index.d.ts","exports":{".":{"bun":"./src/index.ts","import":"./dist/index.js","types":"./dist/index.d.ts"},"./types":{"bun":"./src/types.ts","import":"./dist/types.js","types":"./dist/types.d.ts"},"./constants":{"bun":"./src/constants.ts","import":"./dist/constants.js","types":"./dist/constants.d.ts"},"./filters":{"bun":"./src/build-filter-string.ts","import":"./dist/build-filter-string.js","types":"./dist/build-filter-string.d.ts"},"./flags":{"bun":"./src/tiltify-flags.ts","import":"./dist/tiltify-flags.js","types":"./dist/tiltify-flags.d.ts"},"./multi":{"bun":"./src/multi-search.ts","import":"./dist/multi-search.js","types":"./dist/multi-search.d.ts"},"./campaigns":{"bun":"./src/campaign-search.ts","import":"./dist/campaign-search.js","types":"./dist/campaign-search.d.ts"},"./teams":{"bun":"./src/team-search.ts","import":"./dist/team-search.js","types":"./dist/team-search.d.ts"},"./users":{"bun":"./src/user-search.ts","import":"./dist/user-search.js","types":"./dist/user-search.d.ts"},"./causes":{"bun":"./src/cause-search.ts","import":"./dist/cause-search.js","types":"./dist/cause-search.d.ts"},"./rewards":{"bun":"./src/reward-search.ts","import":"./dist/reward-search.js","types":"./dist/reward-search.d.ts"},"./auction-houses":{"bun":"./src/auction-house-search.ts","import":"./dist/auction-house-search.js","types":"./dist/auction-house-search.d.ts"}},"scripts":{"build":"bun run build.ts","test":"bun test","coverage":"bun run ../../../scripts/generate-coverage-badge.ts --cwd . --label Coverage","docs:build":"typedoc --out dist/docs src/index.ts","clean":"rm -rf dist","release":"release-it --config ../../../.release-it.json","release:dry":"release-it --config ../../../.release-it.json --dry-run"},"peerDependencies":{"meilisearch":"^0.54.0"},"peerDependenciesMeta":{"meilisearch":{"optional":true}},"devDependencies":{"@types/bun":"latest","meilisearch":"^0.54.0","typescript":"^5.6.0"},"playlive":{"target":"browser","frontendEligible":true,"coverageFloor":85},"publishConfig":{"access":"restricted","registry":"https://playlive-767397689694.d.codeartifact.us-east-1.amazonaws.com/npm/playlive/","directory":"dist"},"readme":"# @playlive/tiltify-search\n\nMeilisearch wrappers + a `flags.tiltify.com` client for the public Tiltify\nsite-search surface. Ported from `@playlive/tiltify-tools`; class signatures,\ndefaults, and the filter-string builder are preserved verbatim so consumers\ncan migrate by changing the import specifier alone.\n\n![Coverage](./coverage-badge.svg)\n\n## Install\n\n```bash\nbun add @playlive/tiltify-search meilisearch\n```\n\n`meilisearch` is an **optional peer dependency** — it's only required if you\nimport a class that wraps it (`CampaignSearch`, `AuctionHouseSearch`,\n`CauseSearch`, `RewardSearch`, `TeamSearch`, `UserSearch`). The\n`TiltifyMultiSearch`, `TiltifyFlags`, and `buildFilterString` exports use\nonly native `fetch` and have zero peer deps.\n\n## Quick start\n\n```ts\nimport { CampaignSearch, TiltifyFlags } from \"@playlive/tiltify-search\";\n\nconst cs = new CampaignSearch();\nconst page = await cs.getCampaigns({\n  page: 1,\n  hitsPerPage: 20,\n  filter: { public: true, type: \"campaign\" },\n  query: \"marathon\",\n});\n\n// Walk every campaign matching a filter — works around Meilisearch's\n// `maxTotalHits` cap by recursively partitioning along facetable axes.\nconst all = await cs.getAllCampaigns(\n  { public: true, type: \"campaign\" },\n  ({ collected, total }) => console.log(`${collected}/${total}`),\n);\n\n// Hit the public flag endpoint\nconst flags = await new TiltifyFlags().getFlags();\n```\n\n## Subpath exports\n\n| Subpath                                | Description                                                                  |\n| -------------------------------------- | ---------------------------------------------------------------------------- |\n| `@playlive/tiltify-search`             | Default barrel — re-exports everything below.                                |\n| `@playlive/tiltify-search/types`       | Type-only barrel (`FactHit`, `FilterableFields`, `FACT_DATA_TYPES`).         |\n| `@playlive/tiltify-search/constants`   | `DEFAULT_SEARCH_API_KEY`, `DEFAULT_SEARCH_HOST`, `DEFAULT_FLAGS_URL`.        |\n| `@playlive/tiltify-search/filters`     | `buildFilterString` (no meilisearch dep).                                     |\n| `@playlive/tiltify-search/flags`       | `TiltifyFlags` (no meilisearch dep).                                          |\n| `@playlive/tiltify-search/multi`       | `TiltifyMultiSearch` (no meilisearch dep — raw HTTP).                         |\n| `@playlive/tiltify-search/campaigns`   | `CampaignSearch` + the `getAllCampaigns` partitioner.                         |\n| `@playlive/tiltify-search/teams`       | `TeamSearch`.                                                                 |\n| `@playlive/tiltify-search/users`       | `UserSearch`.                                                                 |\n| `@playlive/tiltify-search/causes`      | `CauseSearch` + cause-index types.                                            |\n| `@playlive/tiltify-search/rewards`     | `RewardSearch` + reward types.                                                |\n| `@playlive/tiltify-search/auction-houses` | `AuctionHouseSearch` + `CAUSE_IDS.ST_JUDE`.                               |\n\nThe `/filters`, `/flags`, `/multi`, and `/types` subpaths are completely\nfree of `meilisearch` — useful when you want filter-string composition or\nthe raw multi-search endpoint without paying for the SDK.\n\n## API reference\n\nRun `bun run docs:build` inside this package to emit the TypeDoc site at\n`dist/docs/`. The aggregate site (every package merged) is built via\n`bun run docs:site` at the workspace root.\n\nTop-level exports:\n\n| Export                       | Source              | Notes                                                  |\n| ---------------------------- | ------------------- | ------------------------------------------------------ |\n| `buildFilterString`          | `./filters`         | Meilisearch filter literal composer.                   |\n| `CampaignSearch`             | `./campaigns`       | `facts` index wrapper + `getAllCampaigns` partitioner. |\n| `AuctionHouseSearch`         | `./auction-houses`  | `facts` index wrapper scoped to `auction_house`.       |\n| `CAUSE_IDS`                  | `./auction-houses`  | `{ ST_JUDE: \"...\" }`.                                  |\n| `CauseSearch`                | `./causes`          | Wraps `causes`, `fundraising_events`, `causes_and_fes`. |\n| `RewardSearch`               | `./rewards`         | `rewards` index wrapper.                                |\n| `TeamSearch`                 | `./teams`           | `teams` index wrapper.                                  |\n| `UserSearch`                 | `./users`           | `user` index wrapper (`findUserByUsername` only).       |\n| `TiltifyMultiSearch`         | `./multi`           | Native-fetch wrapper for `POST /multi-search`.          |\n| `TiltifyFlags`               | `./flags`           | `flags.tiltify.com` client.                             |\n| `FactHit`, `FilterableFields`| `./types`           | Shared search types.                                    |\n| `FACT_DATA_TYPES`            | `./types`           | Sub-resource enumeration.                               |\n| `KNOWN_URLS`                 | `./`                | Twitch Extension URL disclosure.                        |\n| `PACKAGE_NAME`               | `./`                | Identifier for runtime version-pinning.                 |\n\n## Upstream spec\n\nTiltify does not publish a schema for the public Meilisearch indices. The\nfield shapes here mirror what `tiltify.com` itself sends. When you observe\nnew fields on the wire, update `src/types.ts` + the relevant wrapper class.\n\nThe companion REST OpenAPI snapshots (for `@playlive/tiltify-core`) live at\n[`specs/tiltify/`](../../../specs/tiltify/). Re-sync via `/charity:sync` or\n`bun run specs:sync:tiltify`.\n\n## Twitch Extension URL disclosure\n\nThe `KNOWN_URLS` export enumerates every absolute URL or host this package\ncan fetch. See [`docs/twitch-extension-checklist.md`](../../../docs/twitch-extension-checklist.md).\n\n```ts\nimport { KNOWN_URLS } from \"@playlive/tiltify-search\";\nconsole.log(KNOWN_URLS);\n// [\n//   \"https://site-search.tiltify.com\",\n//   \"https://flags.tiltify.com\",\n// ]\n```\n\nKeep this list and the source export in sync — the Extension submission form\nrequires the disclosure list verbatim.\n\n## Migration from `@playlive/tiltify-tools`\n\n`@playlive/tiltify-search` is a near drop-in replacement for the search +\nflags surface that used to live inside `tiltify-tools`. Every class, method\nsignature, and exported type is preserved unchanged with one exception:\n\n- **`UserSearch#getUserBySlug` was removed.** That method hit the Tiltify\n  GraphQL endpoint and required a transitive GraphQL dependency. Per PRD\n  §5.3, the search package now stays free of any GraphQL dependency.\n  Replacement: `TiltifyGraphQL#getUserBySlug` in\n  [`@playlive/tiltify-graphql`](../graphql/README.md).\n\nImports just move:\n\n```diff\n- import { CampaignSearch } from \"@playlive/tiltify-tools/campaign-search\";\n+ import { CampaignSearch } from \"@playlive/tiltify-search\";\n```\n\nSee the root [`MIGRATION.md`](../../../MIGRATION.md) for the full per-symbol\ntable.\n\n## Examples\n\nRealistic end-to-end scenarios (cause search → reward enumeration → top\nauction-house drill-down) land in `examples/` once `dev/greenroom` (phase 8)\nis wired up as the harness.\n\n## Contributing\n\nSee [CONTRIBUTING.md](../../../CONTRIBUTING.md). To add a new search\nwrapper:\n\n1. Add the class to `src/<name>-search.ts` with full TSDoc.\n2. Re-export from `src/index.ts` + add a subpath in `package.json` exports.\n3. Update `build.ts` entrypoints.\n4. Port unit tests under `tests/unit/`.\n5. Append to the changelog + migration table.\n\n## License\n\nMIT — see [LICENSE](../../../LICENSE). Distributed via Play Live\nCodeArtifact (PRD §6).\n","readmeFilename":"README.md","gitHead":"2646a248ca9321afdc95c4bbeccbce6a24fab86a","dist":{"tarball":"https://packages.playlive.experience.stjude.org/@playlive/tiltify-search/-/tiltify-search-0.2.0.tgz","shasum":"bb2a12f417e2a2863133fda36b33bb11943b775a","integrity":"sha512-+ROrX4zOpC2ttArA0SUfpjIptQuA91McdkKG3TP1zmvfdItjZqYwSnLWhClIcPhc9PkeWVfoofY7K7RvoBFAdQ=="}},"0.2.1":{"name":"@playlive/tiltify-search","version":"0.2.1","description":"Meilisearch wrappers + flags client for the public Tiltify site-search surface.","type":"module","sideEffects":false,"main":"./index.js","types":"./index.d.ts","exports":{".":{"import":"./index.js","types":"./index.d.ts"},"./types":{"import":"./types.js","types":"./types.d.ts"},"./constants":{"import":"./constants.js","types":"./constants.d.ts"},"./filters":{"import":"./build-filter-string.js","types":"./build-filter-string.d.ts"},"./flags":{"import":"./tiltify-flags.js","types":"./tiltify-flags.d.ts"},"./multi":{"import":"./multi-search.js","types":"./multi-search.d.ts"},"./campaigns":{"import":"./campaign-search.js","types":"./campaign-search.d.ts"},"./teams":{"import":"./team-search.js","types":"./team-search.d.ts"},"./users":{"import":"./user-search.js","types":"./user-search.d.ts"},"./causes":{"import":"./cause-search.js","types":"./cause-search.d.ts"},"./rewards":{"import":"./reward-search.js","types":"./reward-search.d.ts"},"./auction-houses":{"import":"./auction-house-search.js","types":"./auction-house-search.d.ts"}},"peerDependencies":{"meilisearch":"^0.54.0"},"peerDependenciesMeta":{"meilisearch":{"optional":true}},"playlive":{"target":"browser","frontendEligible":true,"coverageFloor":85},"publishConfig":{"access":"restricted","registry":"https://playlive-767397689694.d.codeartifact.us-east-1.amazonaws.com/npm/playlive/"},"integrity":"sha512-Pto46zx9qwAzLU3HdSKucY94pDtpR27RxVbvESxEBKp8DyzJIs1g5Is/V7O3LnDzdoYxqX+Hn30p/4yU6UFEaw==","shasum":"15f12184fec4a7ff1a12cc6eb465f5aa0ba6736c","readme":"# @playlive/tiltify-search\n\nMeilisearch wrappers + a `flags.tiltify.com` client for the public Tiltify\nsite-search surface. Ported from `@playlive/tiltify-tools`; class signatures,\ndefaults, and the filter-string builder are preserved verbatim so consumers\ncan migrate by changing the import specifier alone.\n\n![Coverage](./coverage-badge.svg)\n\n## Install\n\n```bash\nbun add @playlive/tiltify-search meilisearch\n```\n\n`meilisearch` is an **optional peer dependency** — it's only required if you\nimport a class that wraps it (`CampaignSearch`, `AuctionHouseSearch`,\n`CauseSearch`, `RewardSearch`, `TeamSearch`, `UserSearch`). The\n`TiltifyMultiSearch`, `TiltifyFlags`, and `buildFilterString` exports use\nonly native `fetch` and have zero peer deps.\n\n## Quick start\n\n```ts\nimport { CampaignSearch, TiltifyFlags } from \"@playlive/tiltify-search\";\n\nconst cs = new CampaignSearch();\nconst page = await cs.getCampaigns({\n  page: 1,\n  hitsPerPage: 20,\n  filter: { public: true, type: \"campaign\" },\n  query: \"marathon\",\n});\n\n// Walk every campaign matching a filter — works around Meilisearch's\n// `maxTotalHits` cap by recursively partitioning along facetable axes.\nconst all = await cs.getAllCampaigns(\n  { public: true, type: \"campaign\" },\n  ({ collected, total }) => console.log(`${collected}/${total}`),\n);\n\n// Hit the public flag endpoint\nconst flags = await new TiltifyFlags().getFlags();\n```\n\n## Subpath exports\n\n| Subpath                                | Description                                                                  |\n| -------------------------------------- | ---------------------------------------------------------------------------- |\n| `@playlive/tiltify-search`             | Default barrel — re-exports everything below.                                |\n| `@playlive/tiltify-search/types`       | Type-only barrel (`FactHit`, `FilterableFields`, `FACT_DATA_TYPES`).         |\n| `@playlive/tiltify-search/constants`   | `DEFAULT_SEARCH_API_KEY`, `DEFAULT_SEARCH_HOST`, `DEFAULT_FLAGS_URL`.        |\n| `@playlive/tiltify-search/filters`     | `buildFilterString` (no meilisearch dep).                                     |\n| `@playlive/tiltify-search/flags`       | `TiltifyFlags` (no meilisearch dep).                                          |\n| `@playlive/tiltify-search/multi`       | `TiltifyMultiSearch` (no meilisearch dep — raw HTTP).                         |\n| `@playlive/tiltify-search/campaigns`   | `CampaignSearch` + the `getAllCampaigns` partitioner.                         |\n| `@playlive/tiltify-search/teams`       | `TeamSearch`.                                                                 |\n| `@playlive/tiltify-search/users`       | `UserSearch`.                                                                 |\n| `@playlive/tiltify-search/causes`      | `CauseSearch` + cause-index types.                                            |\n| `@playlive/tiltify-search/rewards`     | `RewardSearch` + reward types.                                                |\n| `@playlive/tiltify-search/auction-houses` | `AuctionHouseSearch` + `CAUSE_IDS.ST_JUDE`.                               |\n\nThe `/filters`, `/flags`, `/multi`, and `/types` subpaths are completely\nfree of `meilisearch` — useful when you want filter-string composition or\nthe raw multi-search endpoint without paying for the SDK.\n\n## API reference\n\nRun `bun run docs:build` inside this package to emit the TypeDoc site at\n`dist/docs/`. The aggregate site (every package merged) is built via\n`bun run docs:site` at the workspace root.\n\nTop-level exports:\n\n| Export                       | Source              | Notes                                                  |\n| ---------------------------- | ------------------- | ------------------------------------------------------ |\n| `buildFilterString`          | `./filters`         | Meilisearch filter literal composer.                   |\n| `CampaignSearch`             | `./campaigns`       | `facts` index wrapper + `getAllCampaigns` partitioner. |\n| `AuctionHouseSearch`         | `./auction-houses`  | `facts` index wrapper scoped to `auction_house`.       |\n| `CAUSE_IDS`                  | `./auction-houses`  | `{ ST_JUDE: \"...\" }`.                                  |\n| `CauseSearch`                | `./causes`          | Wraps `causes`, `fundraising_events`, `causes_and_fes`. |\n| `RewardSearch`               | `./rewards`         | `rewards` index wrapper.                                |\n| `TeamSearch`                 | `./teams`           | `teams` index wrapper.                                  |\n| `UserSearch`                 | `./users`           | `user` index wrapper (`findUserByUsername` only).       |\n| `TiltifyMultiSearch`         | `./multi`           | Native-fetch wrapper for `POST /multi-search`.          |\n| `TiltifyFlags`               | `./flags`           | `flags.tiltify.com` client.                             |\n| `FactHit`, `FilterableFields`| `./types`           | Shared search types.                                    |\n| `FACT_DATA_TYPES`            | `./types`           | Sub-resource enumeration.                               |\n| `KNOWN_URLS`                 | `./`                | Twitch Extension URL disclosure.                        |\n| `PACKAGE_NAME`               | `./`                | Identifier for runtime version-pinning.                 |\n\n## Upstream spec\n\nTiltify does not publish a schema for the public Meilisearch indices. The\nfield shapes here mirror what `tiltify.com` itself sends. When you observe\nnew fields on the wire, update `src/types.ts` + the relevant wrapper class.\n\nThe companion REST OpenAPI snapshots (for `@playlive/tiltify-core`) live at\n[`specs/tiltify/`](../../../specs/tiltify/). Re-sync via `/charity:sync` or\n`bun run specs:sync:tiltify`.\n\n## Twitch Extension URL disclosure\n\nThe `KNOWN_URLS` export enumerates every absolute URL or host this package\ncan fetch. See [`docs/twitch-extension-checklist.md`](../../../docs/twitch-extension-checklist.md).\n\n```ts\nimport { KNOWN_URLS } from \"@playlive/tiltify-search\";\nconsole.log(KNOWN_URLS);\n// [\n//   \"https://site-search.tiltify.com\",\n//   \"https://flags.tiltify.com\",\n// ]\n```\n\nKeep this list and the source export in sync — the Extension submission form\nrequires the disclosure list verbatim.\n\n## Migration from `@playlive/tiltify-tools`\n\n`@playlive/tiltify-search` is a near drop-in replacement for the search +\nflags surface that used to live inside `tiltify-tools`. Every class, method\nsignature, and exported type is preserved unchanged with one exception:\n\n- **`UserSearch#getUserBySlug` was removed.** That method hit the Tiltify\n  GraphQL endpoint and required a transitive GraphQL dependency. Per PRD\n  §5.3, the search package now stays free of any GraphQL dependency.\n  Replacement: `TiltifyGraphQL#getUserBySlug` in\n  [`@playlive/tiltify-graphql`](../graphql/README.md).\n\nImports just move:\n\n```diff\n- import { CampaignSearch } from \"@playlive/tiltify-tools/campaign-search\";\n+ import { CampaignSearch } from \"@playlive/tiltify-search\";\n```\n\nSee the root [`MIGRATION.md`](../../../MIGRATION.md) for the full per-symbol\ntable.\n\n## Examples\n\nRealistic end-to-end scenarios (cause search → reward enumeration → top\nauction-house drill-down) land in `examples/` once `dev/greenroom` (phase 8)\nis wired up as the harness.\n\n## Contributing\n\nSee [CONTRIBUTING.md](../../../CONTRIBUTING.md). To add a new search\nwrapper:\n\n1. Add the class to `src/<name>-search.ts` with full TSDoc.\n2. Re-export from `src/index.ts` + add a subpath in `package.json` exports.\n3. Update `build.ts` entrypoints.\n4. Port unit tests under `tests/unit/`.\n5. Append to the changelog + migration table.\n\n## License\n\nMIT — see [LICENSE](../../../LICENSE). Distributed via Play Live\nCodeArtifact (PRD §6).\n","readmeFilename":"README.md","dist":{"tarball":"https://packages.playlive.experience.stjude.org/@playlive/tiltify-search/-/tiltify-search-0.2.1.tgz","shasum":"15f12184fec4a7ff1a12cc6eb465f5aa0ba6736c","integrity":"sha512-Pto46zx9qwAzLU3HdSKucY94pDtpR27RxVbvESxEBKp8DyzJIs1g5Is/V7O3LnDzdoYxqX+Hn30p/4yU6UFEaw=="}},"0.3.0":{"name":"@playlive/tiltify-search","version":"0.3.0","description":"Meilisearch wrappers + flags client for the public Tiltify site-search surface.","type":"module","sideEffects":false,"main":"./index.js","types":"./index.d.ts","exports":{".":{"import":"./index.js","types":"./index.d.ts"},"./types":{"import":"./types.js","types":"./types.d.ts"},"./constants":{"import":"./constants.js","types":"./constants.d.ts"},"./filters":{"import":"./build-filter-string.js","types":"./build-filter-string.d.ts"},"./flags":{"import":"./tiltify-flags.js","types":"./tiltify-flags.d.ts"},"./multi":{"import":"./multi-search.js","types":"./multi-search.d.ts"},"./campaigns":{"import":"./campaign-search.js","types":"./campaign-search.d.ts"},"./teams":{"import":"./team-search.js","types":"./team-search.d.ts"},"./users":{"import":"./user-search.js","types":"./user-search.d.ts"},"./causes":{"import":"./cause-search.js","types":"./cause-search.d.ts"},"./rewards":{"import":"./reward-search.js","types":"./reward-search.d.ts"},"./auction-houses":{"import":"./auction-house-search.js","types":"./auction-house-search.d.ts"},"./http-client":{"import":"./http-client.js","types":"./http-client.d.ts"},"./meilisearch-client":{"import":"./meilisearch-client.js","types":"./meilisearch-client.d.ts"}},"peerDependencies":{"meilisearch":"^0.54.0"},"peerDependenciesMeta":{"meilisearch":{"optional":true}},"playlive":{"target":"browser","frontendEligible":true,"coverageFloor":85},"publishConfig":{"access":"restricted","registry":"https://playlive-767397689694.d.codeartifact.us-east-1.amazonaws.com/npm/playlive/"},"integrity":"sha512-sIEQ0C6hx8zQqNFs2+yEHQu3ig2xRDnf2NoIJHBpbHtvZC3+46+s88I5HJJCEMWwXK4avi0XDQQRTEhTVtbHbw==","shasum":"e30d5d95fbd60113214a84204117921b8f973879","readme":"# @playlive/tiltify-search\n\nMeilisearch wrappers + a `flags.tiltify.com` client for the public Tiltify\nsite-search surface. Ported from `@playlive/tiltify-tools`; class signatures,\ndefaults, and the filter-string builder are preserved verbatim so consumers\ncan migrate by changing the import specifier alone.\n\n![Coverage](./coverage-badge.svg)\n\n## Install\n\n```bash\nbun add @playlive/tiltify-search meilisearch\n```\n\n`meilisearch` is an **optional peer dependency** — it's only required if you\nimport a class that wraps it (`CampaignSearch`, `AuctionHouseSearch`,\n`CauseSearch`, `RewardSearch`, `TeamSearch`, `UserSearch`). The\n`TiltifyMultiSearch`, `TiltifyFlags`, and `buildFilterString` exports use\nonly native `fetch` and have zero peer deps.\n\n## Quick start\n\n```ts\nimport { CampaignSearch, TiltifyFlags } from \"@playlive/tiltify-search\";\n\nconst cs = new CampaignSearch();\nconst page = await cs.getCampaigns({\n  page: 1,\n  hitsPerPage: 20,\n  filter: { public: true, type: \"campaign\" },\n  query: \"marathon\",\n});\n\n// Walk every campaign matching a filter — works around Meilisearch's\n// `maxTotalHits` cap by recursively partitioning along facetable axes.\nconst all = await cs.getAllCampaigns(\n  { public: true, type: \"campaign\" },\n  ({ collected, total }) => console.log(`${collected}/${total}`),\n);\n\n// Hit the public flag endpoint\nconst flags = await new TiltifyFlags().getFlags();\n```\n\n## Subpath exports\n\n| Subpath                                | Description                                                                  |\n| -------------------------------------- | ---------------------------------------------------------------------------- |\n| `@playlive/tiltify-search`             | Default barrel — re-exports everything below.                                |\n| `@playlive/tiltify-search/types`       | Type-only barrel (`FactHit`, `FilterableFields`, `FACT_DATA_TYPES`).         |\n| `@playlive/tiltify-search/constants`   | `DEFAULT_SEARCH_API_KEY`, `DEFAULT_SEARCH_HOST`, `DEFAULT_FLAGS_URL`.        |\n| `@playlive/tiltify-search/filters`     | `buildFilterString` (no meilisearch dep).                                     |\n| `@playlive/tiltify-search/flags`       | `TiltifyFlags` (no meilisearch dep).                                          |\n| `@playlive/tiltify-search/multi`       | `TiltifyMultiSearch` (no meilisearch dep — raw HTTP).                         |\n| `@playlive/tiltify-search/campaigns`   | `CampaignSearch` + the `getAllCampaigns` partitioner.                         |\n| `@playlive/tiltify-search/teams`       | `TeamSearch`.                                                                 |\n| `@playlive/tiltify-search/users`       | `UserSearch`.                                                                 |\n| `@playlive/tiltify-search/causes`      | `CauseSearch` + cause-index types.                                            |\n| `@playlive/tiltify-search/rewards`     | `RewardSearch` + reward types.                                                |\n| `@playlive/tiltify-search/auction-houses` | `AuctionHouseSearch` + `CAUSE_IDS.ST_JUDE`.                               |\n\nThe `/filters`, `/flags`, `/multi`, and `/types` subpaths are completely\nfree of `meilisearch` — useful when you want filter-string composition or\nthe raw multi-search endpoint without paying for the SDK.\n\n## API reference\n\nRun `bun run docs:build` inside this package to emit the TypeDoc site at\n`dist/docs/`. The aggregate site (every package merged) is built via\n`bun run docs:site` at the workspace root.\n\nTop-level exports:\n\n| Export                       | Source              | Notes                                                  |\n| ---------------------------- | ------------------- | ------------------------------------------------------ |\n| `buildFilterString`          | `./filters`         | Meilisearch filter literal composer.                   |\n| `CampaignSearch`             | `./campaigns`       | `facts` index wrapper + `getAllCampaigns` partitioner. |\n| `AuctionHouseSearch`         | `./auction-houses`  | `facts` index wrapper scoped to `auction_house`.       |\n| `CAUSE_IDS`                  | `./auction-houses`  | `{ ST_JUDE: \"...\" }`.                                  |\n| `CauseSearch`                | `./causes`          | Wraps `causes`, `fundraising_events`, `causes_and_fes`. |\n| `RewardSearch`               | `./rewards`         | `rewards` index wrapper.                                |\n| `TeamSearch`                 | `./teams`           | `teams` index wrapper.                                  |\n| `UserSearch`                 | `./users`           | `user` index wrapper (`findUserByUsername` only).       |\n| `TiltifyMultiSearch`         | `./multi`           | Native-fetch wrapper for `POST /multi-search`.          |\n| `TiltifyFlags`               | `./flags`           | `flags.tiltify.com` client.                             |\n| `FactHit`, `FilterableFields`| `./types`           | Shared search types.                                    |\n| `FACT_DATA_TYPES`            | `./types`           | Sub-resource enumeration.                               |\n| `KNOWN_URLS`                 | `./`                | Twitch Extension URL disclosure.                        |\n| `PACKAGE_NAME`               | `./`                | Identifier for runtime version-pinning.                 |\n\n## Upstream spec\n\nTiltify does not publish a schema for the public Meilisearch indices. The\nfield shapes here mirror what `tiltify.com` itself sends. When you observe\nnew fields on the wire, update `src/types.ts` + the relevant wrapper class.\n\nThe companion REST OpenAPI snapshots (for `@playlive/tiltify-core`) live at\n[`specs/tiltify/`](../../../specs/tiltify/). Re-sync via `/charity:sync` or\n`bun run specs:sync:tiltify`.\n\n## Twitch Extension URL disclosure\n\nThe `KNOWN_URLS` export enumerates every absolute URL or host this package\ncan fetch. See [`docs/twitch-extension-checklist.md`](../../../docs/twitch-extension-checklist.md).\n\n```ts\nimport { KNOWN_URLS } from \"@playlive/tiltify-search\";\nconsole.log(KNOWN_URLS);\n// [\n//   \"https://site-search.tiltify.com\",\n//   \"https://flags.tiltify.com\",\n// ]\n```\n\nKeep this list and the source export in sync — the Extension submission form\nrequires the disclosure list verbatim.\n\n## Migration from `@playlive/tiltify-tools`\n\n`@playlive/tiltify-search` is a near drop-in replacement for the search +\nflags surface that used to live inside `tiltify-tools`. Every class, method\nsignature, and exported type is preserved unchanged with one exception:\n\n- **`UserSearch#getUserBySlug` was removed.** That method hit the Tiltify\n  GraphQL endpoint and required a transitive GraphQL dependency. Per PRD\n  §5.3, the search package now stays free of any GraphQL dependency.\n  Replacement: `TiltifyGraphQL#getUserBySlug` in\n  [`@playlive/tiltify-graphql`](../graphql/README.md).\n\nImports just move:\n\n```diff\n- import { CampaignSearch } from \"@playlive/tiltify-tools/campaign-search\";\n+ import { CampaignSearch } from \"@playlive/tiltify-search\";\n```\n\nSee the root [`MIGRATION.md`](../../../MIGRATION.md) for the full per-symbol\ntable.\n\n## Examples\n\nRealistic end-to-end scenarios (cause search → reward enumeration → top\nauction-house drill-down) land in `examples/` once `dev/greenroom` (phase 8)\nis wired up as the harness.\n\n## Contributing\n\nSee [CONTRIBUTING.md](../../../CONTRIBUTING.md). To add a new search\nwrapper:\n\n1. Add the class to `src/<name>-search.ts` with full TSDoc.\n2. Re-export from `src/index.ts` + add a subpath in `package.json` exports.\n3. Update `build.ts` entrypoints.\n4. Port unit tests under `tests/unit/`.\n5. Append to the changelog + migration table.\n\n## License\n\nMIT — see [LICENSE](../../../LICENSE). Distributed via Play Live\nCodeArtifact (PRD §6).\n","readmeFilename":"README.md","dist":{"tarball":"https://packages.playlive.experience.stjude.org/@playlive/tiltify-search/-/tiltify-search-0.3.0.tgz","shasum":"e30d5d95fbd60113214a84204117921b8f973879","integrity":"sha512-sIEQ0C6hx8zQqNFs2+yEHQu3ig2xRDnf2NoIJHBpbHtvZC3+46+s88I5HJJCEMWwXK4avi0XDQQRTEhTVtbHbw=="}},"0.3.1":{"name":"@playlive/tiltify-search","version":"0.3.1","description":"Meilisearch wrappers + flags client for the public Tiltify site-search surface.","type":"module","sideEffects":false,"main":"./index.js","types":"./index.d.ts","exports":{".":{"import":"./index.js","types":"./index.d.ts"},"./types":{"import":"./types.js","types":"./types.d.ts"},"./constants":{"import":"./constants.js","types":"./constants.d.ts"},"./filters":{"import":"./build-filter-string.js","types":"./build-filter-string.d.ts"},"./flags":{"import":"./tiltify-flags.js","types":"./tiltify-flags.d.ts"},"./multi":{"import":"./multi-search.js","types":"./multi-search.d.ts"},"./campaigns":{"import":"./campaign-search.js","types":"./campaign-search.d.ts"},"./teams":{"import":"./team-search.js","types":"./team-search.d.ts"},"./users":{"import":"./user-search.js","types":"./user-search.d.ts"},"./causes":{"import":"./cause-search.js","types":"./cause-search.d.ts"},"./rewards":{"import":"./reward-search.js","types":"./reward-search.d.ts"},"./auction-houses":{"import":"./auction-house-search.js","types":"./auction-house-search.d.ts"},"./http-client":{"import":"./http-client.js","types":"./http-client.d.ts"},"./meilisearch-client":{"import":"./meilisearch-client.js","types":"./meilisearch-client.d.ts"}},"peerDependencies":{"meilisearch":"^0.54.0"},"peerDependenciesMeta":{"meilisearch":{"optional":true}},"playlive":{"target":"browser","frontendEligible":true,"coverageFloor":85},"publishConfig":{"access":"restricted","registry":"https://playlive-767397689694.d.codeartifact.us-east-1.amazonaws.com/npm/playlive/"},"integrity":"sha512-agBk0JQaDR7EjX6q8GJ81hFDI+Zmsbqi5/Vr6sF6mv5ZhjI3vSlki8VqnUPe0YzVEZWf5/PIXUqM6i2JNAVfOQ==","shasum":"45203f70c561cc93ed697829effa34691c459c81","readme":"# @playlive/tiltify-search\n\nMeilisearch wrappers + a `flags.tiltify.com` client for the public Tiltify\nsite-search surface. Ported from `@playlive/tiltify-tools`; class signatures,\ndefaults, and the filter-string builder are preserved verbatim so consumers\ncan migrate by changing the import specifier alone.\n\n![Coverage](./coverage-badge.svg)\n\n## Install\n\n```bash\nbun add @playlive/tiltify-search meilisearch\n```\n\n`meilisearch` is an **optional peer dependency** — it's only required if you\nimport a class that wraps it (`CampaignSearch`, `AuctionHouseSearch`,\n`CauseSearch`, `RewardSearch`, `TeamSearch`, `UserSearch`). The\n`TiltifyMultiSearch`, `TiltifyFlags`, and `buildFilterString` exports use\nonly native `fetch` and have zero peer deps.\n\n## Quick start\n\n```ts\nimport { CampaignSearch, TiltifyFlags } from \"@playlive/tiltify-search\";\n\nconst cs = new CampaignSearch();\nconst page = await cs.getCampaigns({\n  page: 1,\n  hitsPerPage: 20,\n  filter: { public: true, type: \"campaign\" },\n  query: \"marathon\",\n});\n\n// Walk every campaign matching a filter — works around Meilisearch's\n// `maxTotalHits` cap by recursively partitioning along facetable axes.\nconst all = await cs.getAllCampaigns(\n  { public: true, type: \"campaign\" },\n  ({ collected, total }) => console.log(`${collected}/${total}`),\n);\n\n// Hit the public flag endpoint\nconst flags = await new TiltifyFlags().getFlags();\n```\n\n## Subpath exports\n\n| Subpath                                | Description                                                                  |\n| -------------------------------------- | ---------------------------------------------------------------------------- |\n| `@playlive/tiltify-search`             | Default barrel — re-exports everything below.                                |\n| `@playlive/tiltify-search/types`       | Type-only barrel (`FactHit`, `FilterableFields`, `FACT_DATA_TYPES`).         |\n| `@playlive/tiltify-search/constants`   | `DEFAULT_SEARCH_API_KEY`, `DEFAULT_SEARCH_HOST`, `DEFAULT_FLAGS_URL`.        |\n| `@playlive/tiltify-search/filters`     | `buildFilterString` (no meilisearch dep).                                     |\n| `@playlive/tiltify-search/flags`       | `TiltifyFlags` (no meilisearch dep).                                          |\n| `@playlive/tiltify-search/multi`       | `TiltifyMultiSearch` (no meilisearch dep — raw HTTP).                         |\n| `@playlive/tiltify-search/campaigns`   | `CampaignSearch` + the `getAllCampaigns` partitioner.                         |\n| `@playlive/tiltify-search/teams`       | `TeamSearch`.                                                                 |\n| `@playlive/tiltify-search/users`       | `UserSearch`.                                                                 |\n| `@playlive/tiltify-search/causes`      | `CauseSearch` + cause-index types.                                            |\n| `@playlive/tiltify-search/rewards`     | `RewardSearch` + reward types.                                                |\n| `@playlive/tiltify-search/auction-houses` | `AuctionHouseSearch` + `CAUSE_IDS.ST_JUDE`.                               |\n\nThe `/filters`, `/flags`, `/multi`, and `/types` subpaths are completely\nfree of `meilisearch` — useful when you want filter-string composition or\nthe raw multi-search endpoint without paying for the SDK.\n\n## API reference\n\nRun `bun run docs:build` inside this package to emit the TypeDoc site at\n`dist/docs/`. The aggregate site (every package merged) is built via\n`bun run docs:site` at the workspace root.\n\nTop-level exports:\n\n| Export                       | Source              | Notes                                                  |\n| ---------------------------- | ------------------- | ------------------------------------------------------ |\n| `buildFilterString`          | `./filters`         | Meilisearch filter literal composer.                   |\n| `CampaignSearch`             | `./campaigns`       | `facts` index wrapper + `getAllCampaigns` partitioner. |\n| `AuctionHouseSearch`         | `./auction-houses`  | `facts` index wrapper scoped to `auction_house`.       |\n| `CAUSE_IDS`                  | `./auction-houses`  | `{ ST_JUDE: \"...\" }`.                                  |\n| `CauseSearch`                | `./causes`          | Wraps `causes`, `fundraising_events`, `causes_and_fes`. |\n| `RewardSearch`               | `./rewards`         | `rewards` index wrapper.                                |\n| `TeamSearch`                 | `./teams`           | `teams` index wrapper.                                  |\n| `UserSearch`                 | `./users`           | `user` index wrapper (`findUserByUsername` only).       |\n| `TiltifyMultiSearch`         | `./multi`           | Native-fetch wrapper for `POST /multi-search`.          |\n| `TiltifyFlags`               | `./flags`           | `flags.tiltify.com` client.                             |\n| `FactHit`, `FilterableFields`| `./types`           | Shared search types.                                    |\n| `FACT_DATA_TYPES`            | `./types`           | Sub-resource enumeration.                               |\n| `KNOWN_URLS`                 | `./`                | Twitch Extension URL disclosure.                        |\n| `PACKAGE_NAME`               | `./`                | Identifier for runtime version-pinning.                 |\n\n## Upstream spec\n\nTiltify does not publish a schema for the public Meilisearch indices. The\nfield shapes here mirror what `tiltify.com` itself sends. When you observe\nnew fields on the wire, update `src/types.ts` + the relevant wrapper class.\n\nThe companion REST OpenAPI snapshots (for `@playlive/tiltify-core`) live at\n[`specs/tiltify/`](../../../specs/tiltify/). Re-sync via `/charity:sync` or\n`bun run specs:sync:tiltify`.\n\n## Twitch Extension URL disclosure\n\nThe `KNOWN_URLS` export enumerates every absolute URL or host this package\ncan fetch. See [`docs/twitch-extension-checklist.md`](../../../docs/twitch-extension-checklist.md).\n\n```ts\nimport { KNOWN_URLS } from \"@playlive/tiltify-search\";\nconsole.log(KNOWN_URLS);\n// [\n//   \"https://site-search.tiltify.com\",\n//   \"https://flags.tiltify.com\",\n// ]\n```\n\nKeep this list and the source export in sync — the Extension submission form\nrequires the disclosure list verbatim.\n\n## Migration from `@playlive/tiltify-tools`\n\n`@playlive/tiltify-search` is a near drop-in replacement for the search +\nflags surface that used to live inside `tiltify-tools`. Every class, method\nsignature, and exported type is preserved unchanged with one exception:\n\n- **`UserSearch#getUserBySlug` was removed.** That method hit the Tiltify\n  GraphQL endpoint and required a transitive GraphQL dependency. Per PRD\n  §5.3, the search package now stays free of any GraphQL dependency.\n  Replacement: `TiltifyGraphQL#getUserBySlug` in\n  [`@playlive/tiltify-graphql`](../graphql/README.md).\n\nImports just move:\n\n```diff\n- import { CampaignSearch } from \"@playlive/tiltify-tools/campaign-search\";\n+ import { CampaignSearch } from \"@playlive/tiltify-search\";\n```\n\nSee the root [`MIGRATION.md`](../../../MIGRATION.md) for the full per-symbol\ntable.\n\n## Examples\n\nRealistic end-to-end scenarios (cause search → reward enumeration → top\nauction-house drill-down) land in `examples/` once `dev/greenroom` (phase 8)\nis wired up as the harness.\n\n## Contributing\n\nSee [CONTRIBUTING.md](../../../CONTRIBUTING.md). To add a new search\nwrapper:\n\n1. Add the class to `src/<name>-search.ts` with full TSDoc.\n2. Re-export from `src/index.ts` + add a subpath in `package.json` exports.\n3. Update `build.ts` entrypoints.\n4. Port unit tests under `tests/unit/`.\n5. Append to the changelog + migration table.\n\n## License\n\nMIT — see [LICENSE](../../../LICENSE). Distributed via Play Live\nCodeArtifact (PRD §6).\n","readmeFilename":"README.md","dist":{"tarball":"https://packages.playlive.experience.stjude.org/@playlive/tiltify-search/-/tiltify-search-0.3.1.tgz","shasum":"45203f70c561cc93ed697829effa34691c459c81","integrity":"sha512-agBk0JQaDR7EjX6q8GJ81hFDI+Zmsbqi5/Vr6sF6mv5ZhjI3vSlki8VqnUPe0YzVEZWf5/PIXUqM6i2JNAVfOQ=="}},"0.4.0":{"name":"@playlive/tiltify-search","version":"0.4.0","description":"Meilisearch wrappers + flags client for the public Tiltify site-search surface.","type":"module","sideEffects":false,"main":"./index.js","types":"./index.d.ts","exports":{".":{"import":"./index.js","types":"./index.d.ts"},"./types":{"import":"./types.js","types":"./types.d.ts"},"./constants":{"import":"./constants.js","types":"./constants.d.ts"},"./filters":{"import":"./build-filter-string.js","types":"./build-filter-string.d.ts"},"./flags":{"import":"./tiltify-flags.js","types":"./tiltify-flags.d.ts"},"./multi":{"import":"./multi-search.js","types":"./multi-search.d.ts"},"./campaigns":{"import":"./campaign-search.js","types":"./campaign-search.d.ts"},"./teams":{"import":"./team-search.js","types":"./team-search.d.ts"},"./users":{"import":"./user-search.js","types":"./user-search.d.ts"},"./causes":{"import":"./cause-search.js","types":"./cause-search.d.ts"},"./rewards":{"import":"./reward-search.js","types":"./reward-search.d.ts"},"./auction-houses":{"import":"./auction-house-search.js","types":"./auction-house-search.d.ts"},"./converters":{"import":"./converters.js","types":"./converters.d.ts"},"./http-client":{"import":"./http-client.js","types":"./http-client.d.ts"},"./meilisearch-client":{"import":"./meilisearch-client.js","types":"./meilisearch-client.d.ts"}},"peerDependencies":{"@playlive/tiltify-core":"^0.2.0","meilisearch":"^0.54.0"},"peerDependenciesMeta":{"@playlive/tiltify-core":{"optional":true},"meilisearch":{"optional":true}},"playlive":{"target":"browser","frontendEligible":true,"coverageFloor":85},"publishConfig":{"access":"restricted","registry":"https://playlive-767397689694.d.codeartifact.us-east-1.amazonaws.com/npm/playlive/"},"integrity":"sha512-yhFUrxOfAc2vGEUDrd8b9f3bVgMpb0mEfDw5qB5cQEjT8fQGMX/zICTp9DMJI0DI7a5VGRe835XHs7JjBFczTg==","shasum":"d0810fff481c1c39c7e20510b1ea7485efcfe820","readme":"# @playlive/tiltify-search\n\nMeilisearch wrappers + a `flags.tiltify.com` client for the public Tiltify\nsite-search surface. Ported from `@playlive/tiltify-tools`; class signatures,\ndefaults, and the filter-string builder are preserved verbatim so consumers\ncan migrate by changing the import specifier alone.\n\n![Coverage](./coverage-badge.svg)\n\n## Install\n\n```bash\nbun add @playlive/tiltify-search meilisearch\n```\n\n`meilisearch` is an **optional peer dependency** — it's only required if you\nimport a class that wraps it (`CampaignSearch`, `AuctionHouseSearch`,\n`CauseSearch`, `RewardSearch`, `TeamSearch`, `UserSearch`). The\n`TiltifyMultiSearch`, `TiltifyFlags`, and `buildFilterString` exports use\nonly native `fetch` and have zero peer deps.\n\n## Quick start\n\n```ts\nimport { CampaignSearch, TiltifyFlags } from \"@playlive/tiltify-search\";\n\nconst cs = new CampaignSearch();\nconst page = await cs.getCampaigns({\n  page: 1,\n  hitsPerPage: 20,\n  filter: { public: true, type: \"campaign\" },\n  query: \"marathon\",\n});\n\n// Walk every campaign matching a filter — works around Meilisearch's\n// `maxTotalHits` cap by recursively partitioning along facetable axes.\nconst all = await cs.getAllCampaigns(\n  { public: true, type: \"campaign\" },\n  ({ collected, total }) => console.log(`${collected}/${total}`),\n);\n\n// Hit the public flag endpoint\nconst flags = await new TiltifyFlags().getFlags();\n```\n\n## Subpath exports\n\n| Subpath                                | Description                                                                  |\n| -------------------------------------- | ---------------------------------------------------------------------------- |\n| `@playlive/tiltify-search`             | Default barrel — re-exports everything below.                                |\n| `@playlive/tiltify-search/types`       | Type-only barrel (`FactHit`, `FilterableFields`, `FACT_DATA_TYPES`).         |\n| `@playlive/tiltify-search/constants`   | `DEFAULT_SEARCH_API_KEY`, `DEFAULT_SEARCH_HOST`, `DEFAULT_FLAGS_URL`.        |\n| `@playlive/tiltify-search/filters`     | `buildFilterString` (no meilisearch dep).                                     |\n| `@playlive/tiltify-search/flags`       | `TiltifyFlags` (no meilisearch dep).                                          |\n| `@playlive/tiltify-search/multi`       | `TiltifyMultiSearch` (no meilisearch dep — raw HTTP).                         |\n| `@playlive/tiltify-search/campaigns`   | `CampaignSearch` + the `getAllCampaigns` partitioner.                         |\n| `@playlive/tiltify-search/teams`       | `TeamSearch`.                                                                 |\n| `@playlive/tiltify-search/users`       | `UserSearch`.                                                                 |\n| `@playlive/tiltify-search/causes`      | `CauseSearch` + cause-index types.                                            |\n| `@playlive/tiltify-search/rewards`     | `RewardSearch` + reward types.                                                |\n| `@playlive/tiltify-search/auction-houses` | `AuctionHouseSearch` + `CAUSE_IDS.ST_JUDE`.                               |\n\nThe `/filters`, `/flags`, `/multi`, and `/types` subpaths are completely\nfree of `meilisearch` — useful when you want filter-string composition or\nthe raw multi-search endpoint without paying for the SDK.\n\n## API reference\n\nRun `bun run docs:build` inside this package to emit the TypeDoc site at\n`dist/docs/`. The aggregate site (every package merged) is built via\n`bun run docs:site` at the workspace root.\n\nTop-level exports:\n\n| Export                       | Source              | Notes                                                  |\n| ---------------------------- | ------------------- | ------------------------------------------------------ |\n| `buildFilterString`          | `./filters`         | Meilisearch filter literal composer.                   |\n| `CampaignSearch`             | `./campaigns`       | `facts` index wrapper + `getAllCampaigns` partitioner. |\n| `AuctionHouseSearch`         | `./auction-houses`  | `facts` index wrapper scoped to `auction_house`.       |\n| `CAUSE_IDS`                  | `./auction-houses`  | `{ ST_JUDE: \"...\" }`.                                  |\n| `CauseSearch`                | `./causes`          | Wraps `causes`, `fundraising_events`, `causes_and_fes`. |\n| `RewardSearch`               | `./rewards`         | `rewards` index wrapper.                                |\n| `TeamSearch`                 | `./teams`           | `teams` index wrapper.                                  |\n| `UserSearch`                 | `./users`           | `user` index wrapper (`findUserByUsername` only).       |\n| `TiltifyMultiSearch`         | `./multi`           | Native-fetch wrapper for `POST /multi-search`.          |\n| `TiltifyFlags`               | `./flags`           | `flags.tiltify.com` client.                             |\n| `FactHit`, `FilterableFields`| `./types`           | Shared search types.                                    |\n| `FACT_DATA_TYPES`            | `./types`           | Sub-resource enumeration.                               |\n| `KNOWN_URLS`                 | `./`                | Twitch Extension URL disclosure.                        |\n| `PACKAGE_NAME`               | `./`                | Identifier for runtime version-pinning.                 |\n\n## Upstream spec\n\nTiltify does not publish a schema for the public Meilisearch indices. The\nfield shapes here mirror what `tiltify.com` itself sends. When you observe\nnew fields on the wire, update `src/types.ts` + the relevant wrapper class.\n\nThe companion REST OpenAPI snapshots (for `@playlive/tiltify-core`) live at\n[`specs/tiltify/`](../../../specs/tiltify/). Re-sync via `/charity:sync` or\n`bun run specs:sync:tiltify`.\n\n## Twitch Extension URL disclosure\n\nThe `KNOWN_URLS` export enumerates every absolute URL or host this package\ncan fetch. See [`docs/twitch-extension-checklist.md`](../../../docs/twitch-extension-checklist.md).\n\n```ts\nimport { KNOWN_URLS } from \"@playlive/tiltify-search\";\nconsole.log(KNOWN_URLS);\n// [\n//   \"https://site-search.tiltify.com\",\n//   \"https://flags.tiltify.com\",\n// ]\n```\n\nKeep this list and the source export in sync — the Extension submission form\nrequires the disclosure list verbatim.\n\n## Migration from `@playlive/tiltify-tools`\n\n`@playlive/tiltify-search` is a near drop-in replacement for the search +\nflags surface that used to live inside `tiltify-tools`. Every class, method\nsignature, and exported type is preserved unchanged with one exception:\n\n- **`UserSearch#getUserBySlug` was removed.** That method hit the Tiltify\n  GraphQL endpoint and required a transitive GraphQL dependency. Per PRD\n  §5.3, the search package now stays free of any GraphQL dependency.\n  Replacement: `TiltifyGraphQL#getUserBySlug` in\n  [`@playlive/tiltify-graphql`](../graphql/README.md).\n\nImports just move:\n\n```diff\n- import { CampaignSearch } from \"@playlive/tiltify-tools/campaign-search\";\n+ import { CampaignSearch } from \"@playlive/tiltify-search\";\n```\n\nSee the root [`MIGRATION.md`](../../../MIGRATION.md) for the full per-symbol\ntable.\n\n## Examples\n\nRealistic end-to-end scenarios (cause search → reward enumeration → top\nauction-house drill-down) land in `examples/` once `dev/greenroom` (phase 8)\nis wired up as the harness.\n\n## Contributing\n\nSee [CONTRIBUTING.md](../../../CONTRIBUTING.md). To add a new search\nwrapper:\n\n1. Add the class to `src/<name>-search.ts` with full TSDoc.\n2. Re-export from `src/index.ts` + add a subpath in `package.json` exports.\n3. Update `build.ts` entrypoints.\n4. Port unit tests under `tests/unit/`.\n5. Append to the changelog + migration table.\n\n## License\n\nMIT — see [LICENSE](../../../LICENSE). Distributed via Play Live\nCodeArtifact (PRD §6).\n","readmeFilename":"README.md","dist":{"tarball":"https://packages.playlive.experience.stjude.org/@playlive/tiltify-search/-/tiltify-search-0.4.0.tgz","shasum":"d0810fff481c1c39c7e20510b1ea7485efcfe820","integrity":"sha512-yhFUrxOfAc2vGEUDrd8b9f3bVgMpb0mEfDw5qB5cQEjT8fQGMX/zICTp9DMJI0DI7a5VGRe835XHs7JjBFczTg=="}},"0.4.1":{"name":"@playlive/tiltify-search","version":"0.4.1","description":"Meilisearch wrappers + flags client for the public Tiltify site-search surface.","type":"module","sideEffects":false,"main":"./index.js","types":"./index.d.ts","exports":{".":{"import":"./index.js","types":"./index.d.ts"},"./types":{"import":"./types.js","types":"./types.d.ts"},"./constants":{"import":"./constants.js","types":"./constants.d.ts"},"./filters":{"import":"./build-filter-string.js","types":"./build-filter-string.d.ts"},"./flags":{"import":"./tiltify-flags.js","types":"./tiltify-flags.d.ts"},"./multi":{"import":"./multi-search.js","types":"./multi-search.d.ts"},"./campaigns":{"import":"./campaign-search.js","types":"./campaign-search.d.ts"},"./teams":{"import":"./team-search.js","types":"./team-search.d.ts"},"./users":{"import":"./user-search.js","types":"./user-search.d.ts"},"./causes":{"import":"./cause-search.js","types":"./cause-search.d.ts"},"./rewards":{"import":"./reward-search.js","types":"./reward-search.d.ts"},"./auction-houses":{"import":"./auction-house-search.js","types":"./auction-house-search.d.ts"},"./converters":{"import":"./converters.js","types":"./converters.d.ts"},"./http-client":{"import":"./http-client.js","types":"./http-client.d.ts"},"./meilisearch-client":{"import":"./meilisearch-client.js","types":"./meilisearch-client.d.ts"}},"peerDependencies":{"@playlive/tiltify-core":"^0.4.2","meilisearch":"^0.58.0"},"peerDependenciesMeta":{"@playlive/tiltify-core":{"optional":true},"meilisearch":{"optional":true}},"playlive":{"target":"browser","frontendEligible":true,"coverageFloor":85},"publishConfig":{"access":"restricted","registry":"https://playlive-767397689694.d.codeartifact.us-east-1.amazonaws.com/npm/playlive/"},"integrity":"sha512-+BkchTRFn5TNUo2LNpOY9mzy0EXBtLSyOhHHmtQEtb+IQL5pYkNs+xfqZYfRqvS3IkMLQcHfZCfO1EkF/BI/AQ==","shasum":"385ab078576cf58ed5df3833ff52fe229df88280","readme":"# @playlive/tiltify-search\n\nMeilisearch wrappers + a `flags.tiltify.com` client for the public Tiltify\nsite-search surface. Ported from `@playlive/tiltify-tools`; class signatures,\ndefaults, and the filter-string builder are preserved verbatim so consumers\ncan migrate by changing the import specifier alone.\n\n![Coverage](./coverage-badge.svg)\n\n## Install\n\n```bash\nbun add @playlive/tiltify-search meilisearch\n```\n\n`meilisearch` is an **optional peer dependency** — it's only required if you\nimport a class that wraps it (`CampaignSearch`, `AuctionHouseSearch`,\n`CauseSearch`, `RewardSearch`, `TeamSearch`, `UserSearch`). The\n`TiltifyMultiSearch`, `TiltifyFlags`, and `buildFilterString` exports use\nonly native `fetch` and have zero peer deps.\n\n## Quick start\n\n```ts\nimport { CampaignSearch, TiltifyFlags } from \"@playlive/tiltify-search\";\n\nconst cs = new CampaignSearch();\nconst page = await cs.getCampaigns({\n  page: 1,\n  hitsPerPage: 20,\n  filter: { public: true, type: \"campaign\" },\n  query: \"marathon\",\n});\n\n// Walk every campaign matching a filter — works around Meilisearch's\n// `maxTotalHits` cap by recursively partitioning along facetable axes.\nconst all = await cs.getAllCampaigns(\n  { public: true, type: \"campaign\" },\n  ({ collected, total }) => console.log(`${collected}/${total}`),\n);\n\n// Hit the public flag endpoint\nconst flags = await new TiltifyFlags().getFlags();\n```\n\n## Subpath exports\n\n| Subpath                                | Description                                                                  |\n| -------------------------------------- | ---------------------------------------------------------------------------- |\n| `@playlive/tiltify-search`             | Default barrel — re-exports everything below.                                |\n| `@playlive/tiltify-search/types`       | Type-only barrel (`FactHit`, `FilterableFields`, `FACT_DATA_TYPES`).         |\n| `@playlive/tiltify-search/constants`   | `DEFAULT_SEARCH_API_KEY`, `DEFAULT_SEARCH_HOST`, `DEFAULT_FLAGS_URL`.        |\n| `@playlive/tiltify-search/filters`     | `buildFilterString` (no meilisearch dep).                                     |\n| `@playlive/tiltify-search/flags`       | `TiltifyFlags` (no meilisearch dep).                                          |\n| `@playlive/tiltify-search/multi`       | `TiltifyMultiSearch` (no meilisearch dep — raw HTTP).                         |\n| `@playlive/tiltify-search/campaigns`   | `CampaignSearch` + the `getAllCampaigns` partitioner.                         |\n| `@playlive/tiltify-search/teams`       | `TeamSearch`.                                                                 |\n| `@playlive/tiltify-search/users`       | `UserSearch`.                                                                 |\n| `@playlive/tiltify-search/causes`      | `CauseSearch` + cause-index types.                                            |\n| `@playlive/tiltify-search/rewards`     | `RewardSearch` + reward types.                                                |\n| `@playlive/tiltify-search/auction-houses` | `AuctionHouseSearch` + `CAUSE_IDS.ST_JUDE`.                               |\n\nThe `/filters`, `/flags`, `/multi`, and `/types` subpaths are completely\nfree of `meilisearch` — useful when you want filter-string composition or\nthe raw multi-search endpoint without paying for the SDK.\n\n## API reference\n\nRun `bun run docs:build` inside this package to emit the TypeDoc site at\n`dist/docs/`. The aggregate site (every package merged) is built via\n`bun run docs:site` at the workspace root.\n\nTop-level exports:\n\n| Export                       | Source              | Notes                                                  |\n| ---------------------------- | ------------------- | ------------------------------------------------------ |\n| `buildFilterString`          | `./filters`         | Meilisearch filter literal composer.                   |\n| `CampaignSearch`             | `./campaigns`       | `facts` index wrapper + `getAllCampaigns` partitioner. |\n| `AuctionHouseSearch`         | `./auction-houses`  | `facts` index wrapper scoped to `auction_house`.       |\n| `CAUSE_IDS`                  | `./auction-houses`  | `{ ST_JUDE: \"...\" }`.                                  |\n| `CauseSearch`                | `./causes`          | Wraps `causes`, `fundraising_events`, `causes_and_fes`. |\n| `RewardSearch`               | `./rewards`         | `rewards` index wrapper.                                |\n| `TeamSearch`                 | `./teams`           | `teams` index wrapper.                                  |\n| `UserSearch`                 | `./users`           | `user` index wrapper (`findUserByUsername` only).       |\n| `TiltifyMultiSearch`         | `./multi`           | Native-fetch wrapper for `POST /multi-search`.          |\n| `TiltifyFlags`               | `./flags`           | `flags.tiltify.com` client.                             |\n| `FactHit`, `FilterableFields`| `./types`           | Shared search types.                                    |\n| `FACT_DATA_TYPES`            | `./types`           | Sub-resource enumeration.                               |\n| `KNOWN_URLS`                 | `./`                | Twitch Extension URL disclosure.                        |\n| `PACKAGE_NAME`               | `./`                | Identifier for runtime version-pinning.                 |\n\n## Upstream spec\n\nTiltify does not publish a schema for the public Meilisearch indices. The\nfield shapes here mirror what `tiltify.com` itself sends. When you observe\nnew fields on the wire, update `src/types.ts` + the relevant wrapper class.\n\nThe companion REST OpenAPI snapshots (for `@playlive/tiltify-core`) live at\n[`specs/tiltify/`](../../../specs/tiltify/). Re-sync via `/charity:sync` or\n`bun run specs:sync:tiltify`.\n\n## Twitch Extension URL disclosure\n\nThe `KNOWN_URLS` export enumerates every absolute URL or host this package\ncan fetch. See [`docs/twitch-extension-checklist.md`](../../../docs/twitch-extension-checklist.md).\n\n```ts\nimport { KNOWN_URLS } from \"@playlive/tiltify-search\";\nconsole.log(KNOWN_URLS);\n// [\n//   \"https://site-search.tiltify.com\",\n//   \"https://flags.tiltify.com\",\n// ]\n```\n\nKeep this list and the source export in sync — the Extension submission form\nrequires the disclosure list verbatim.\n\n## Migration from `@playlive/tiltify-tools`\n\n`@playlive/tiltify-search` is a near drop-in replacement for the search +\nflags surface that used to live inside `tiltify-tools`. Every class, method\nsignature, and exported type is preserved unchanged with one exception:\n\n- **`UserSearch#getUserBySlug` was removed.** That method hit the Tiltify\n  GraphQL endpoint and required a transitive GraphQL dependency. Per PRD\n  §5.3, the search package now stays free of any GraphQL dependency.\n  Replacement: `TiltifyGraphQL#getUserBySlug` in\n  [`@playlive/tiltify-graphql`](../graphql/README.md).\n\nImports just move:\n\n```diff\n- import { CampaignSearch } from \"@playlive/tiltify-tools/campaign-search\";\n+ import { CampaignSearch } from \"@playlive/tiltify-search\";\n```\n\nSee the root [`MIGRATION.md`](../../../MIGRATION.md) for the full per-symbol\ntable.\n\n## Examples\n\nRealistic end-to-end scenarios (cause search → reward enumeration → top\nauction-house drill-down) land in `examples/` once `dev/greenroom` (phase 8)\nis wired up as the harness.\n\n## Contributing\n\nSee [CONTRIBUTING.md](../../../CONTRIBUTING.md). To add a new search\nwrapper:\n\n1. Add the class to `src/<name>-search.ts` with full TSDoc.\n2. Re-export from `src/index.ts` + add a subpath in `package.json` exports.\n3. Update `build.ts` entrypoints.\n4. Port unit tests under `tests/unit/`.\n5. Append to the changelog + migration table.\n\n## License\n\nMIT — see [LICENSE](../../../LICENSE). Distributed via Play Live\nCodeArtifact (PRD §6).\n","readmeFilename":"README.md","dist":{"tarball":"https://packages.playlive.experience.stjude.org/@playlive/tiltify-search/-/tiltify-search-0.4.1.tgz","shasum":"385ab078576cf58ed5df3833ff52fe229df88280","integrity":"sha512-+BkchTRFn5TNUo2LNpOY9mzy0EXBtLSyOhHHmtQEtb+IQL5pYkNs+xfqZYfRqvS3IkMLQcHfZCfO1EkF/BI/AQ=="}},"0.4.2":{"name":"@playlive/tiltify-search","version":"0.4.2","description":"Meilisearch wrappers + flags client for the public Tiltify site-search surface.","type":"module","sideEffects":false,"main":"./index.js","types":"./index.d.ts","exports":{".":{"import":"./index.js","types":"./index.d.ts"},"./types":{"import":"./types.js","types":"./types.d.ts"},"./constants":{"import":"./constants.js","types":"./constants.d.ts"},"./filters":{"import":"./build-filter-string.js","types":"./build-filter-string.d.ts"},"./flags":{"import":"./tiltify-flags.js","types":"./tiltify-flags.d.ts"},"./multi":{"import":"./multi-search.js","types":"./multi-search.d.ts"},"./campaigns":{"import":"./campaign-search.js","types":"./campaign-search.d.ts"},"./teams":{"import":"./team-search.js","types":"./team-search.d.ts"},"./users":{"import":"./user-search.js","types":"./user-search.d.ts"},"./causes":{"import":"./cause-search.js","types":"./cause-search.d.ts"},"./rewards":{"import":"./reward-search.js","types":"./reward-search.d.ts"},"./auction-houses":{"import":"./auction-house-search.js","types":"./auction-house-search.d.ts"},"./converters":{"import":"./converters.js","types":"./converters.d.ts"},"./http-client":{"import":"./http-client.js","types":"./http-client.d.ts"},"./meilisearch-client":{"import":"./meilisearch-client.js","types":"./meilisearch-client.d.ts"}},"peerDependencies":{"@playlive/tiltify-core":"^0.4.4","meilisearch":"^0.54.0"},"peerDependenciesMeta":{"@playlive/tiltify-core":{"optional":true},"meilisearch":{"optional":false}},"playlive":{"target":"browser","frontendEligible":true,"coverageFloor":85},"publishConfig":{"access":"restricted","registry":"https://playlive-767397689694.d.codeartifact.us-east-1.amazonaws.com/npm/playlive/"},"integrity":"sha512-646oRB2kRql5DABwl/38dk2sNK+L+K8pkmhNPLg3CvVi0Adg+ZVVVrloEY0eatpbUt9RctZKcpCKnGdH88eaaQ==","shasum":"ca61e940404c89722aae88023cea18947ba4fc0e","readme":"# @playlive/tiltify-search\n\nMeilisearch wrappers + a `flags.tiltify.com` client for the public Tiltify\nsite-search surface. Ported from `@playlive/tiltify-tools`; class signatures,\ndefaults, and the filter-string builder are preserved verbatim so consumers\ncan migrate by changing the import specifier alone.\n\n![Coverage](./coverage-badge.svg)\n\n## Install\n\n```bash\nbun add @playlive/tiltify-search meilisearch\n```\n\n`meilisearch` is an **optional peer dependency** — it's only required if you\nimport a class that wraps it (`CampaignSearch`, `AuctionHouseSearch`,\n`CauseSearch`, `RewardSearch`, `TeamSearch`, `UserSearch`). The\n`TiltifyMultiSearch`, `TiltifyFlags`, and `buildFilterString` exports use\nonly native `fetch` and have zero peer deps.\n\n## Quick start\n\n```ts\nimport { CampaignSearch, TiltifyFlags } from \"@playlive/tiltify-search\";\n\nconst cs = new CampaignSearch();\nconst page = await cs.getCampaigns({\n  page: 1,\n  hitsPerPage: 20,\n  filter: { public: true, type: \"campaign\" },\n  query: \"marathon\",\n});\n\n// Walk every campaign matching a filter — works around Meilisearch's\n// `maxTotalHits` cap by recursively partitioning along facetable axes.\nconst all = await cs.getAllCampaigns(\n  { public: true, type: \"campaign\" },\n  ({ collected, total }) => console.log(`${collected}/${total}`),\n);\n\n// Hit the public flag endpoint\nconst flags = await new TiltifyFlags().getFlags();\n```\n\n## Subpath exports\n\n| Subpath                                | Description                                                                  |\n| -------------------------------------- | ---------------------------------------------------------------------------- |\n| `@playlive/tiltify-search`             | Default barrel — re-exports everything below.                                |\n| `@playlive/tiltify-search/types`       | Type-only barrel (`FactHit`, `FilterableFields`, `FACT_DATA_TYPES`).         |\n| `@playlive/tiltify-search/constants`   | `DEFAULT_SEARCH_API_KEY`, `DEFAULT_SEARCH_HOST`, `DEFAULT_FLAGS_URL`.        |\n| `@playlive/tiltify-search/filters`     | `buildFilterString` (no meilisearch dep).                                     |\n| `@playlive/tiltify-search/flags`       | `TiltifyFlags` (no meilisearch dep).                                          |\n| `@playlive/tiltify-search/multi`       | `TiltifyMultiSearch` (no meilisearch dep — raw HTTP).                         |\n| `@playlive/tiltify-search/campaigns`   | `CampaignSearch` + the `getAllCampaigns` partitioner.                         |\n| `@playlive/tiltify-search/teams`       | `TeamSearch`.                                                                 |\n| `@playlive/tiltify-search/users`       | `UserSearch`.                                                                 |\n| `@playlive/tiltify-search/causes`      | `CauseSearch` + cause-index types.                                            |\n| `@playlive/tiltify-search/rewards`     | `RewardSearch` + reward types.                                                |\n| `@playlive/tiltify-search/auction-houses` | `AuctionHouseSearch` + `CAUSE_IDS.ST_JUDE`.                               |\n\nThe `/filters`, `/flags`, `/multi`, and `/types` subpaths are completely\nfree of `meilisearch` — useful when you want filter-string composition or\nthe raw multi-search endpoint without paying for the SDK.\n\n## API reference\n\nRun `bun run docs:build` inside this package to emit the TypeDoc site at\n`dist/docs/`. The aggregate site (every package merged) is built via\n`bun run docs:site` at the workspace root.\n\nTop-level exports:\n\n| Export                       | Source              | Notes                                                  |\n| ---------------------------- | ------------------- | ------------------------------------------------------ |\n| `buildFilterString`          | `./filters`         | Meilisearch filter literal composer.                   |\n| `CampaignSearch`             | `./campaigns`       | `facts` index wrapper + `getAllCampaigns` partitioner. |\n| `AuctionHouseSearch`         | `./auction-houses`  | `facts` index wrapper scoped to `auction_house`.       |\n| `CAUSE_IDS`                  | `./auction-houses`  | `{ ST_JUDE: \"...\" }`.                                  |\n| `CauseSearch`                | `./causes`          | Wraps `causes`, `fundraising_events`, `causes_and_fes`. |\n| `RewardSearch`               | `./rewards`         | `rewards` index wrapper.                                |\n| `TeamSearch`                 | `./teams`           | `teams` index wrapper.                                  |\n| `UserSearch`                 | `./users`           | `user` index wrapper (`findUserByUsername` only).       |\n| `TiltifyMultiSearch`         | `./multi`           | Native-fetch wrapper for `POST /multi-search`.          |\n| `TiltifyFlags`               | `./flags`           | `flags.tiltify.com` client.                             |\n| `FactHit`, `FilterableFields`| `./types`           | Shared search types.                                    |\n| `FACT_DATA_TYPES`            | `./types`           | Sub-resource enumeration.                               |\n| `KNOWN_URLS`                 | `./`                | Twitch Extension URL disclosure.                        |\n| `PACKAGE_NAME`               | `./`                | Identifier for runtime version-pinning.                 |\n\n## Upstream spec\n\nTiltify does not publish a schema for the public Meilisearch indices. The\nfield shapes here mirror what `tiltify.com` itself sends. When you observe\nnew fields on the wire, update `src/types.ts` + the relevant wrapper class.\n\nThe companion REST OpenAPI snapshots (for `@playlive/tiltify-core`) live at\n[`specs/tiltify/`](../../../specs/tiltify/). Re-sync via `/charity:sync` or\n`bun run specs:sync:tiltify`.\n\n## Twitch Extension URL disclosure\n\nThe `KNOWN_URLS` export enumerates every absolute URL or host this package\ncan fetch. See [`docs/twitch-extension-checklist.md`](../../../docs/twitch-extension-checklist.md).\n\n```ts\nimport { KNOWN_URLS } from \"@playlive/tiltify-search\";\nconsole.log(KNOWN_URLS);\n// [\n//   \"https://site-search.tiltify.com\",\n//   \"https://flags.tiltify.com\",\n// ]\n```\n\nKeep this list and the source export in sync — the Extension submission form\nrequires the disclosure list verbatim.\n\n## Migration from `@playlive/tiltify-tools`\n\n`@playlive/tiltify-search` is a near drop-in replacement for the search +\nflags surface that used to live inside `tiltify-tools`. Every class, method\nsignature, and exported type is preserved unchanged with one exception:\n\n- **`UserSearch#getUserBySlug` was removed.** That method hit the Tiltify\n  GraphQL endpoint and required a transitive GraphQL dependency. Per PRD\n  §5.3, the search package now stays free of any GraphQL dependency.\n  Replacement: `TiltifyGraphQL#getUserBySlug` in\n  [`@playlive/tiltify-graphql`](../graphql/README.md).\n\nImports just move:\n\n```diff\n- import { CampaignSearch } from \"@playlive/tiltify-tools/campaign-search\";\n+ import { CampaignSearch } from \"@playlive/tiltify-search\";\n```\n\nSee the root [`MIGRATION.md`](../../../MIGRATION.md) for the full per-symbol\ntable.\n\n## Examples\n\nRealistic end-to-end scenarios (cause search → reward enumeration → top\nauction-house drill-down) land in `examples/` once `dev/greenroom` (phase 8)\nis wired up as the harness.\n\n## Contributing\n\nSee [CONTRIBUTING.md](../../../CONTRIBUTING.md). To add a new search\nwrapper:\n\n1. Add the class to `src/<name>-search.ts` with full TSDoc.\n2. Re-export from `src/index.ts` + add a subpath in `package.json` exports.\n3. Update `build.ts` entrypoints.\n4. Port unit tests under `tests/unit/`.\n5. Append to the changelog + migration table.\n\n## License\n\nMIT — see [LICENSE](../../../LICENSE). Distributed via Play Live\nCodeArtifact (PRD §6).\n","readmeFilename":"README.md","dist":{"tarball":"https://packages.playlive.experience.stjude.org/@playlive/tiltify-search/-/tiltify-search-0.4.2.tgz","shasum":"ca61e940404c89722aae88023cea18947ba4fc0e","integrity":"sha512-646oRB2kRql5DABwl/38dk2sNK+L+K8pkmhNPLg3CvVi0Adg+ZVVVrloEY0eatpbUt9RctZKcpCKnGdH88eaaQ=="}},"0.4.3":{"name":"@playlive/tiltify-search","version":"0.4.3","description":"Meilisearch wrappers + flags client for the public Tiltify site-search surface.","type":"module","sideEffects":false,"main":"./index.js","types":"./index.d.ts","exports":{".":{"import":"./index.js","types":"./index.d.ts"},"./types":{"import":"./types.js","types":"./types.d.ts"},"./constants":{"import":"./constants.js","types":"./constants.d.ts"},"./filters":{"import":"./build-filter-string.js","types":"./build-filter-string.d.ts"},"./flags":{"import":"./tiltify-flags.js","types":"./tiltify-flags.d.ts"},"./multi":{"import":"./multi-search.js","types":"./multi-search.d.ts"},"./campaigns":{"import":"./campaign-search.js","types":"./campaign-search.d.ts"},"./teams":{"import":"./team-search.js","types":"./team-search.d.ts"},"./users":{"import":"./user-search.js","types":"./user-search.d.ts"},"./causes":{"import":"./cause-search.js","types":"./cause-search.d.ts"},"./rewards":{"import":"./reward-search.js","types":"./reward-search.d.ts"},"./auction-houses":{"import":"./auction-house-search.js","types":"./auction-house-search.d.ts"},"./converters":{"import":"./converters.js","types":"./converters.d.ts"},"./http-client":{"import":"./http-client.js","types":"./http-client.d.ts"},"./meilisearch-client":{"import":"./meilisearch-client.js","types":"./meilisearch-client.d.ts"}},"peerDependencies":{"@playlive/tiltify-core":"^0.4.6","meilisearch":"^0.54.0"},"peerDependenciesMeta":{"@playlive/tiltify-core":{"optional":true},"meilisearch":{"optional":false}},"playlive":{"target":"browser","frontendEligible":true,"coverageFloor":85},"publishConfig":{"access":"restricted","registry":"https://playlive-767397689694.d.codeartifact.us-east-1.amazonaws.com/npm/playlive/"},"integrity":"sha512-TnggFe5kjyQjzN3ODFvuV369Vvtsu7fUMt0Cu6aP+nxxlsN/J2/L2cEN/7LT3I7OlTO6XSmoAy9YBwASxJW7Sg==","shasum":"bc591cb5c2aadb76d5e4580abea93c250d86041f","readme":"# @playlive/tiltify-search\n\nMeilisearch wrappers + a `flags.tiltify.com` client for the public Tiltify\nsite-search surface. Ported from `@playlive/tiltify-tools`; class signatures,\ndefaults, and the filter-string builder are preserved verbatim so consumers\ncan migrate by changing the import specifier alone.\n\n![Coverage](./coverage-badge.svg)\n\n## Install\n\n```bash\nbun add @playlive/tiltify-search meilisearch\n```\n\n`meilisearch` is an **optional peer dependency** — it's only required if you\nimport a class that wraps it (`CampaignSearch`, `AuctionHouseSearch`,\n`CauseSearch`, `RewardSearch`, `TeamSearch`, `UserSearch`). The\n`TiltifyMultiSearch`, `TiltifyFlags`, and `buildFilterString` exports use\nonly native `fetch` and have zero peer deps.\n\n## Quick start\n\n```ts\nimport { CampaignSearch, TiltifyFlags } from \"@playlive/tiltify-search\";\n\nconst cs = new CampaignSearch();\nconst page = await cs.getCampaigns({\n  page: 1,\n  hitsPerPage: 20,\n  filter: { public: true, type: \"campaign\" },\n  query: \"marathon\",\n});\n\n// Walk every campaign matching a filter — works around Meilisearch's\n// `maxTotalHits` cap by recursively partitioning along facetable axes.\nconst all = await cs.getAllCampaigns(\n  { public: true, type: \"campaign\" },\n  ({ collected, total }) => console.log(`${collected}/${total}`),\n);\n\n// Hit the public flag endpoint\nconst flags = await new TiltifyFlags().getFlags();\n```\n\n## Subpath exports\n\n| Subpath                                | Description                                                                  |\n| -------------------------------------- | ---------------------------------------------------------------------------- |\n| `@playlive/tiltify-search`             | Default barrel — re-exports everything below.                                |\n| `@playlive/tiltify-search/types`       | Type-only barrel (`FactHit`, `FilterableFields`, `FACT_DATA_TYPES`).         |\n| `@playlive/tiltify-search/constants`   | `DEFAULT_SEARCH_API_KEY`, `DEFAULT_SEARCH_HOST`, `DEFAULT_FLAGS_URL`.        |\n| `@playlive/tiltify-search/filters`     | `buildFilterString` (no meilisearch dep).                                     |\n| `@playlive/tiltify-search/flags`       | `TiltifyFlags` (no meilisearch dep).                                          |\n| `@playlive/tiltify-search/multi`       | `TiltifyMultiSearch` (no meilisearch dep — raw HTTP).                         |\n| `@playlive/tiltify-search/campaigns`   | `CampaignSearch` + the `getAllCampaigns` partitioner.                         |\n| `@playlive/tiltify-search/teams`       | `TeamSearch`.                                                                 |\n| `@playlive/tiltify-search/users`       | `UserSearch`.                                                                 |\n| `@playlive/tiltify-search/causes`      | `CauseSearch` + cause-index types.                                            |\n| `@playlive/tiltify-search/rewards`     | `RewardSearch` + reward types.                                                |\n| `@playlive/tiltify-search/auction-houses` | `AuctionHouseSearch` + `CAUSE_IDS.ST_JUDE`.                               |\n\nThe `/filters`, `/flags`, `/multi`, and `/types` subpaths are completely\nfree of `meilisearch` — useful when you want filter-string composition or\nthe raw multi-search endpoint without paying for the SDK.\n\n## API reference\n\nRun `bun run docs:build` inside this package to emit the TypeDoc site at\n`dist/docs/`. The aggregate site (every package merged) is built via\n`bun run docs:site` at the workspace root.\n\nTop-level exports:\n\n| Export                       | Source              | Notes                                                  |\n| ---------------------------- | ------------------- | ------------------------------------------------------ |\n| `buildFilterString`          | `./filters`         | Meilisearch filter literal composer.                   |\n| `CampaignSearch`             | `./campaigns`       | `facts` index wrapper + `getAllCampaigns` partitioner. |\n| `AuctionHouseSearch`         | `./auction-houses`  | `facts` index wrapper scoped to `auction_house`.       |\n| `CAUSE_IDS`                  | `./auction-houses`  | `{ ST_JUDE: \"...\" }`.                                  |\n| `CauseSearch`                | `./causes`          | Wraps `causes`, `fundraising_events`, `causes_and_fes`. |\n| `RewardSearch`               | `./rewards`         | `rewards` index wrapper.                                |\n| `TeamSearch`                 | `./teams`           | `teams` index wrapper.                                  |\n| `UserSearch`                 | `./users`           | `user` index wrapper (`findUserByUsername` only).       |\n| `TiltifyMultiSearch`         | `./multi`           | Native-fetch wrapper for `POST /multi-search`.          |\n| `TiltifyFlags`               | `./flags`           | `flags.tiltify.com` client.                             |\n| `FactHit`, `FilterableFields`| `./types`           | Shared search types.                                    |\n| `FACT_DATA_TYPES`            | `./types`           | Sub-resource enumeration.                               |\n| `KNOWN_URLS`                 | `./`                | Twitch Extension URL disclosure.                        |\n| `PACKAGE_NAME`               | `./`                | Identifier for runtime version-pinning.                 |\n\n## Upstream spec\n\nTiltify does not publish a schema for the public Meilisearch indices. The\nfield shapes here mirror what `tiltify.com` itself sends. When you observe\nnew fields on the wire, update `src/types.ts` + the relevant wrapper class.\n\nThe companion REST OpenAPI snapshots (for `@playlive/tiltify-core`) live at\n[`specs/tiltify/`](../../../specs/tiltify/). Re-sync via `/charity:sync` or\n`bun run specs:sync:tiltify`.\n\n## Twitch Extension URL disclosure\n\nThe `KNOWN_URLS` export enumerates every absolute URL or host this package\ncan fetch. See [`docs/twitch-extension-checklist.md`](../../../docs/twitch-extension-checklist.md).\n\n```ts\nimport { KNOWN_URLS } from \"@playlive/tiltify-search\";\nconsole.log(KNOWN_URLS);\n// [\n//   \"https://site-search.tiltify.com\",\n//   \"https://flags.tiltify.com\",\n// ]\n```\n\nKeep this list and the source export in sync — the Extension submission form\nrequires the disclosure list verbatim.\n\n## Migration from `@playlive/tiltify-tools`\n\n`@playlive/tiltify-search` is a near drop-in replacement for the search +\nflags surface that used to live inside `tiltify-tools`. Every class, method\nsignature, and exported type is preserved unchanged with one exception:\n\n- **`UserSearch#getUserBySlug` was removed.** That method hit the Tiltify\n  GraphQL endpoint and required a transitive GraphQL dependency. Per PRD\n  §5.3, the search package now stays free of any GraphQL dependency.\n  Replacement: `TiltifyGraphQL#getUserBySlug` in\n  [`@playlive/tiltify-graphql`](../graphql/README.md).\n\nImports just move:\n\n```diff\n- import { CampaignSearch } from \"@playlive/tiltify-tools/campaign-search\";\n+ import { CampaignSearch } from \"@playlive/tiltify-search\";\n```\n\nSee the root [`MIGRATION.md`](../../../MIGRATION.md) for the full per-symbol\ntable.\n\n## Examples\n\nRealistic end-to-end scenarios (cause search → reward enumeration → top\nauction-house drill-down) land in `examples/` once `dev/greenroom` (phase 8)\nis wired up as the harness.\n\n## Contributing\n\nSee [CONTRIBUTING.md](../../../CONTRIBUTING.md). To add a new search\nwrapper:\n\n1. Add the class to `src/<name>-search.ts` with full TSDoc.\n2. Re-export from `src/index.ts` + add a subpath in `package.json` exports.\n3. Update `build.ts` entrypoints.\n4. Port unit tests under `tests/unit/`.\n5. Append to the changelog + migration table.\n\n## License\n\nMIT — see [LICENSE](../../../LICENSE). Distributed via Play Live\nCodeArtifact (PRD §6).\n","readmeFilename":"README.md","dist":{"tarball":"https://packages.playlive.experience.stjude.org/@playlive/tiltify-search/-/tiltify-search-0.4.3.tgz","shasum":"bc591cb5c2aadb76d5e4580abea93c250d86041f","integrity":"sha512-TnggFe5kjyQjzN3ODFvuV369Vvtsu7fUMt0Cu6aP+nxxlsN/J2/L2cEN/7LT3I7OlTO6XSmoAy9YBwASxJW7Sg=="}},"0.4.4":{"name":"@playlive/tiltify-search","version":"0.4.4","description":"Meilisearch wrappers + flags client for the public Tiltify site-search surface.","type":"module","sideEffects":false,"main":"./index.js","types":"./index.d.ts","exports":{".":{"import":"./index.js","types":"./index.d.ts"},"./types":{"import":"./types.js","types":"./types.d.ts"},"./constants":{"import":"./constants.js","types":"./constants.d.ts"},"./filters":{"import":"./build-filter-string.js","types":"./build-filter-string.d.ts"},"./flags":{"import":"./tiltify-flags.js","types":"./tiltify-flags.d.ts"},"./multi":{"import":"./multi-search.js","types":"./multi-search.d.ts"},"./campaigns":{"import":"./campaign-search.js","types":"./campaign-search.d.ts"},"./teams":{"import":"./team-search.js","types":"./team-search.d.ts"},"./users":{"import":"./user-search.js","types":"./user-search.d.ts"},"./causes":{"import":"./cause-search.js","types":"./cause-search.d.ts"},"./rewards":{"import":"./reward-search.js","types":"./reward-search.d.ts"},"./auction-houses":{"import":"./auction-house-search.js","types":"./auction-house-search.d.ts"},"./converters":{"import":"./converters.js","types":"./converters.d.ts"},"./http-client":{"import":"./http-client.js","types":"./http-client.d.ts"},"./meilisearch-client":{"import":"./meilisearch-client.js","types":"./meilisearch-client.d.ts"}},"peerDependencies":{"@playlive/tiltify-core":"^0.4.6","meilisearch":"^0.54.0"},"peerDependenciesMeta":{"@playlive/tiltify-core":{"optional":true},"meilisearch":{"optional":false}},"playlive":{"target":"browser","frontendEligible":true,"coverageFloor":85},"publishConfig":{"access":"restricted","registry":"https://playlive-767397689694.d.codeartifact.us-east-1.amazonaws.com/npm/playlive/"},"integrity":"sha512-jBxKnYHQwWSzEAz/3qNQhp8bZEPWOJW6c5XNj3vkhuatEHpmkEafjIJS4x7NNjiM4qr1JHOIizigj/0he633wA==","shasum":"2d53029e78671d0d8446bfe6dc7bf959779efb81","readme":"# @playlive/tiltify-search\n\nMeilisearch wrappers + a `flags.tiltify.com` client for the public Tiltify\nsite-search surface. Ported from `@playlive/tiltify-tools`; class signatures,\ndefaults, and the filter-string builder are preserved verbatim so consumers\ncan migrate by changing the import specifier alone.\n\n![Coverage](./coverage-badge.svg)\n\n## Install\n\n```bash\nbun add @playlive/tiltify-search meilisearch\n```\n\n`meilisearch` is an **optional peer dependency** — it's only required if you\nimport a class that wraps it (`CampaignSearch`, `AuctionHouseSearch`,\n`CauseSearch`, `RewardSearch`, `TeamSearch`, `UserSearch`). The\n`TiltifyMultiSearch`, `TiltifyFlags`, and `buildFilterString` exports use\nonly native `fetch` and have zero peer deps.\n\n## Quick start\n\n```ts\nimport { CampaignSearch, TiltifyFlags } from \"@playlive/tiltify-search\";\n\nconst cs = new CampaignSearch();\nconst page = await cs.getCampaigns({\n  page: 1,\n  hitsPerPage: 20,\n  filter: { public: true, type: \"campaign\" },\n  query: \"marathon\",\n});\n\n// Walk every campaign matching a filter — works around Meilisearch's\n// `maxTotalHits` cap by recursively partitioning along facetable axes.\nconst all = await cs.getAllCampaigns(\n  { public: true, type: \"campaign\" },\n  ({ collected, total }) => console.log(`${collected}/${total}`),\n);\n\n// Hit the public flag endpoint\nconst flags = await new TiltifyFlags().getFlags();\n```\n\n## Subpath exports\n\n| Subpath                                | Description                                                                  |\n| -------------------------------------- | ---------------------------------------------------------------------------- |\n| `@playlive/tiltify-search`             | Default barrel — re-exports everything below.                                |\n| `@playlive/tiltify-search/types`       | Type-only barrel (`FactHit`, `FilterableFields`, `FACT_DATA_TYPES`).         |\n| `@playlive/tiltify-search/constants`   | `DEFAULT_SEARCH_API_KEY`, `DEFAULT_SEARCH_HOST`, `DEFAULT_FLAGS_URL`.        |\n| `@playlive/tiltify-search/filters`     | `buildFilterString` (no meilisearch dep).                                     |\n| `@playlive/tiltify-search/flags`       | `TiltifyFlags` (no meilisearch dep).                                          |\n| `@playlive/tiltify-search/multi`       | `TiltifyMultiSearch` (no meilisearch dep — raw HTTP).                         |\n| `@playlive/tiltify-search/campaigns`   | `CampaignSearch` + the `getAllCampaigns` partitioner.                         |\n| `@playlive/tiltify-search/teams`       | `TeamSearch`.                                                                 |\n| `@playlive/tiltify-search/users`       | `UserSearch`.                                                                 |\n| `@playlive/tiltify-search/causes`      | `CauseSearch` + cause-index types.                                            |\n| `@playlive/tiltify-search/rewards`     | `RewardSearch` + reward types.                                                |\n| `@playlive/tiltify-search/auction-houses` | `AuctionHouseSearch` + `CAUSE_IDS.ST_JUDE`.                               |\n\nThe `/filters`, `/flags`, `/multi`, and `/types` subpaths are completely\nfree of `meilisearch` — useful when you want filter-string composition or\nthe raw multi-search endpoint without paying for the SDK.\n\n## API reference\n\nRun `bun run docs:build` inside this package to emit the TypeDoc site at\n`dist/docs/`. The aggregate site (every package merged) is built via\n`bun run docs:site` at the workspace root.\n\nTop-level exports:\n\n| Export                       | Source              | Notes                                                  |\n| ---------------------------- | ------------------- | ------------------------------------------------------ |\n| `buildFilterString`          | `./filters`         | Meilisearch filter literal composer.                   |\n| `CampaignSearch`             | `./campaigns`       | `facts` index wrapper + `getAllCampaigns` partitioner. |\n| `AuctionHouseSearch`         | `./auction-houses`  | `facts` index wrapper scoped to `auction_house`.       |\n| `CAUSE_IDS`                  | `./auction-houses`  | `{ ST_JUDE: \"...\" }`.                                  |\n| `CauseSearch`                | `./causes`          | Wraps `causes`, `fundraising_events`, `causes_and_fes`. |\n| `RewardSearch`               | `./rewards`         | `rewards` index wrapper.                                |\n| `TeamSearch`                 | `./teams`           | `teams` index wrapper.                                  |\n| `UserSearch`                 | `./users`           | `user` index wrapper (`findUserByUsername` only).       |\n| `TiltifyMultiSearch`         | `./multi`           | Native-fetch wrapper for `POST /multi-search`.          |\n| `TiltifyFlags`               | `./flags`           | `flags.tiltify.com` client.                             |\n| `FactHit`, `FilterableFields`| `./types`           | Shared search types.                                    |\n| `FACT_DATA_TYPES`            | `./types`           | Sub-resource enumeration.                               |\n| `KNOWN_URLS`                 | `./`                | Twitch Extension URL disclosure.                        |\n| `PACKAGE_NAME`               | `./`                | Identifier for runtime version-pinning.                 |\n\n## Upstream spec\n\nTiltify does not publish a schema for the public Meilisearch indices. The\nfield shapes here mirror what `tiltify.com` itself sends. When you observe\nnew fields on the wire, update `src/types.ts` + the relevant wrapper class.\n\nThe companion REST OpenAPI snapshots (for `@playlive/tiltify-core`) live at\n[`specs/tiltify/`](../../../specs/tiltify/). Re-sync via `/charity:sync` or\n`bun run specs:sync:tiltify`.\n\n## Twitch Extension URL disclosure\n\nThe `KNOWN_URLS` export enumerates every absolute URL or host this package\ncan fetch. See [`docs/twitch-extension-checklist.md`](../../../docs/twitch-extension-checklist.md).\n\n```ts\nimport { KNOWN_URLS } from \"@playlive/tiltify-search\";\nconsole.log(KNOWN_URLS);\n// [\n//   \"https://site-search.tiltify.com\",\n//   \"https://flags.tiltify.com\",\n// ]\n```\n\nKeep this list and the source export in sync — the Extension submission form\nrequires the disclosure list verbatim.\n\n## Migration from `@playlive/tiltify-tools`\n\n`@playlive/tiltify-search` is a near drop-in replacement for the search +\nflags surface that used to live inside `tiltify-tools`. Every class, method\nsignature, and exported type is preserved unchanged with one exception:\n\n- **`UserSearch#getUserBySlug` was removed.** That method hit the Tiltify\n  GraphQL endpoint and required a transitive GraphQL dependency. Per PRD\n  §5.3, the search package now stays free of any GraphQL dependency.\n  Replacement: `TiltifyGraphQL#getUserBySlug` in\n  [`@playlive/tiltify-graphql`](../graphql/README.md).\n\nImports just move:\n\n```diff\n- import { CampaignSearch } from \"@playlive/tiltify-tools/campaign-search\";\n+ import { CampaignSearch } from \"@playlive/tiltify-search\";\n```\n\nSee the root [`MIGRATION.md`](../../../MIGRATION.md) for the full per-symbol\ntable.\n\n## Examples\n\nRealistic end-to-end scenarios (cause search → reward enumeration → top\nauction-house drill-down) land in `examples/` once `dev/greenroom` (phase 8)\nis wired up as the harness.\n\n## Contributing\n\nSee [CONTRIBUTING.md](../../../CONTRIBUTING.md). To add a new search\nwrapper:\n\n1. Add the class to `src/<name>-search.ts` with full TSDoc.\n2. Re-export from `src/index.ts` + add a subpath in `package.json` exports.\n3. Update `build.ts` entrypoints.\n4. Port unit tests under `tests/unit/`.\n5. Append to the changelog + migration table.\n\n## License\n\nMIT — see [LICENSE](../../../LICENSE). Distributed via Play Live\nCodeArtifact (PRD §6).\n","readmeFilename":"README.md","dist":{"tarball":"https://packages.playlive.experience.stjude.org/@playlive/tiltify-search/-/tiltify-search-0.4.4.tgz","shasum":"2d53029e78671d0d8446bfe6dc7bf959779efb81","integrity":"sha512-jBxKnYHQwWSzEAz/3qNQhp8bZEPWOJW6c5XNj3vkhuatEHpmkEafjIJS4x7NNjiM4qr1JHOIizigj/0he633wA=="}},"0.4.6":{"name":"@playlive/tiltify-search","version":"0.4.6","description":"Meilisearch wrappers + flags client for the public Tiltify site-search surface.","type":"module","sideEffects":false,"main":"./index.js","types":"./index.d.ts","exports":{".":{"import":"./index.js","types":"./index.d.ts"},"./types":{"import":"./types.js","types":"./types.d.ts"},"./constants":{"import":"./constants.js","types":"./constants.d.ts"},"./filters":{"import":"./build-filter-string.js","types":"./build-filter-string.d.ts"},"./flags":{"import":"./tiltify-flags.js","types":"./tiltify-flags.d.ts"},"./multi":{"import":"./multi-search.js","types":"./multi-search.d.ts"},"./campaigns":{"import":"./campaign-search.js","types":"./campaign-search.d.ts"},"./teams":{"import":"./team-search.js","types":"./team-search.d.ts"},"./users":{"import":"./user-search.js","types":"./user-search.d.ts"},"./causes":{"import":"./cause-search.js","types":"./cause-search.d.ts"},"./rewards":{"import":"./reward-search.js","types":"./reward-search.d.ts"},"./auction-houses":{"import":"./auction-house-search.js","types":"./auction-house-search.d.ts"},"./converters":{"import":"./converters.js","types":"./converters.d.ts"},"./http-client":{"import":"./http-client.js","types":"./http-client.d.ts"},"./meilisearch-client":{"import":"./meilisearch-client.js","types":"./meilisearch-client.d.ts"}},"peerDependencies":{"@playlive/tiltify-core":"^0.4.18","meilisearch":"^0.54.0"},"peerDependenciesMeta":{"@playlive/tiltify-core":{"optional":true},"meilisearch":{"optional":false}},"playlive":{"target":"browser","frontendEligible":true,"coverageFloor":85},"publishConfig":{"access":"restricted","registry":"https://playlive-767397689694.d.codeartifact.us-east-1.amazonaws.com/npm/playlive/"},"integrity":"sha512-xxyvktUxf8A6m2dZ/v0ZCW4nSQFAu7P8ZBDBqYA8AYS+4miCoCtGDwDwyWoyc7liGlJ3T49g+h/bXUVl2mGsUQ==","shasum":"f431ea856a44f1101db7a2ad4f5a9f3d2b489209","readme":"# @playlive/tiltify-search\n\nMeilisearch wrappers + a `flags.tiltify.com` client for the public Tiltify\nsite-search surface. Ported from `@playlive/tiltify-tools`; class signatures,\ndefaults, and the filter-string builder are preserved verbatim so consumers\ncan migrate by changing the import specifier alone.\n\n![Coverage](./coverage-badge.svg)\n\n## Install\n\n```bash\nbun add @playlive/tiltify-search meilisearch\n```\n\nTwo peer dependencies:\n\n| Peer                     | Range        | Optional | Needed for                                                                  |\n| ------------------------ | ------------ | -------- | --------------------------------------------------------------------------- |\n| `meilisearch`            | `^0.54.0`    | no       | Every `*Search` class, plus `createMeilisearchClient`.                       |\n| `@playlive/tiltify-core` | `workspace:*`| yes      | Only `@playlive/tiltify-search/converters` (REST campaign → `FactHit`).      |\n\n`meilisearch` is declared non-optional because the default barrel re-exports\nthe index wrappers. The `/filters`, `/flags`, `/multi`, `/http-client`, and\n`/types` subpaths never touch it, so importing those directly keeps it out of\nyour bundle even though the manifest asks for it.\n\n## Quick start\n\n```ts\nimport { CampaignSearch, TiltifyFlags } from \"@playlive/tiltify-search\";\n\nconst cs = new CampaignSearch();\nconst page = await cs.getCampaigns({\n  page: 1,\n  hitsPerPage: 20,\n  filter: { public: true, type: \"campaign\" },\n  query: \"marathon\",\n});\n\n// Walk every campaign matching a filter — works around Meilisearch's\n// `maxTotalHits` cap by recursively partitioning along facetable axes.\nconst all = await cs.getAllCampaigns(\n  { public: true, type: \"campaign\" },\n  ({ collected, total }) => console.log(`${collected}/${total}`),\n);\n\n// Hit the public flag endpoint\nconst flags = await new TiltifyFlags().getFlags();\n```\n\n## Subpath exports\n\n| Subpath                                   | Description                                                                    |\n| ----------------------------------------- | ------------------------------------------------------------------------------ |\n| `@playlive/tiltify-search`                | Default barrel — everything except `/converters`.                               |\n| `@playlive/tiltify-search/types`          | `FactHit`, `FilterableFields`, `Avatar`, `FACT_DATA_TYPES`, `FactDataType`.     |\n| `@playlive/tiltify-search/constants`      | `DEFAULT_SEARCH_API_KEY`, `DEFAULT_SEARCH_HOST`, `DEFAULT_FLAGS_URL`.           |\n| `@playlive/tiltify-search/filters`        | `buildFilterString` (no meilisearch dep).                                       |\n| `@playlive/tiltify-search/flags`          | `TiltifyFlags`, `TiltifyFlag` (no meilisearch dep).                             |\n| `@playlive/tiltify-search/multi`          | `TiltifyMultiSearch` + its types (no meilisearch dep — raw HTTP).               |\n| `@playlive/tiltify-search/campaigns`      | `CampaignSearch` + the `getAllCampaigns` partitioner and its option types.      |\n| `@playlive/tiltify-search/teams`          | `TeamSearch`.                                                                   |\n| `@playlive/tiltify-search/users`          | `UserSearch`.                                                                   |\n| `@playlive/tiltify-search/causes`         | `CauseSearch` + cause/FE index types and `CAUSE_INDEX_UIDS`.                     |\n| `@playlive/tiltify-search/rewards`        | `RewardSearch` + `RewardHit` / `RewardFilterableFields`.                         |\n| `@playlive/tiltify-search/auction-houses` | `AuctionHouseSearch` + `CAUSE_IDS.ST_JUDE`.                                     |\n| `@playlive/tiltify-search/http-client`    | `createResilientHttpClient`, `TiltifySearchHttpError`, `RetryInfo` (no meilisearch dep). |\n| `@playlive/tiltify-search/meilisearch-client` | `createMeilisearchClient`, `createTiltifyFetchAdapter`, the Tiltify page/hit caps. |\n| `@playlive/tiltify-search/converters`     | `tiltifyCampaignToFactHit`, `restCampaignToFactHit`. **Opt-in only** — pulls `@playlive/tiltify-core`. |\n\nThe `/filters`, `/flags`, `/multi`, `/http-client`, and `/types` subpaths are\ncompletely free of `meilisearch` — useful when you want filter-string\ncomposition, the retry client, or the raw multi-search endpoint without paying\nfor the SDK. `/converters` is deliberately **not** re-exported from the default\nbarrel so consumers who don't use it never pull `@playlive/tiltify-core` into\ntheir bundle.\n\n## API reference\n\nRun `bun run docs:build` inside this package to emit the TypeDoc site at\n`dist/docs/`. The aggregate site (every package merged) is built via\n`bun run docs:site` at the workspace root.\n\nTop-level exports (default barrel):\n\n| Export                                                           | Source                 | Kind     | Notes                                                            |\n| ----------------------------------------------------------------- | ---------------------- | -------- | ---------------------------------------------------------------- |\n| `buildFilterString`                                              | `./filters`            | function | Meilisearch filter literal composer; escapes `\"` and `\\`.        |\n| `CampaignSearch`                                                 | `./campaigns`          | class    | `facts` index wrapper + `getAllCampaigns` partitioner.           |\n| `CAMPAIGN_FACT_TYPES`, `CampaignFactType`                        | `./campaigns`          | const/type | `[\"campaign\", \"team_event\"]` — the `getAllCampaigns` default.  |\n| `GetAllCampaignsFilter`, `GetAllCampaignsProgress`, `GetAllCampaignsOptions` | `./campaigns` | type | Filter, progress event, and concurrency options.                 |\n| `AuctionHouseSearch`                                             | `./auction-houses`     | class    | `facts` index wrapper scoped to `type = \"auction_house\"`.        |\n| `CAUSE_IDS`                                                      | `./auction-houses`     | const    | `{ ST_JUDE: \"400f5687-…\" }`.                                      |\n| `CauseSearch`                                                    | `./causes`             | class    | Wraps `causes`, `fundraising_events`, `causes_and_fes`.          |\n| `CAUSE_INDEX_UIDS`, `CauseIndexUid`                              | `./causes`             | const/type | The three cause/FE index uids.                                 |\n| `CauseOrEventHit`, `CauseOrEventFilterableFields`                | `./causes`             | type     | Cause/FE hit + filter shapes.                                    |\n| `RewardSearch`                                                   | `./rewards`            | class    | `rewards` index wrapper.                                          |\n| `RewardHit`, `RewardFilterableFields`                            | `./rewards`            | type     | Reward hit + filter shapes.                                       |\n| `TeamSearch`                                                     | `./teams`              | class    | `teams` index wrapper (`findTeamByTeamName`).                     |\n| `UserSearch`                                                     | `./users`              | class    | `user` index wrapper (`findUserByUsername` only).                 |\n| `TiltifyMultiSearch`                                             | `./multi`              | class    | Native-fetch wrapper for `POST /multi-search`.                    |\n| `MultiSearchQuery`, `MultiSearchResult`, `MultiSearchResponse`   | `./multi`              | type     | Multi-search request/response shapes.                             |\n| `TiltifyFlags`, `TiltifyFlag`                                    | `./flags`              | class/type | `flags.tiltify.com` client.                                     |\n| `createResilientHttpClient`                                      | `./http-client`        | function | `Retry-After`-aware `httpClient` for Meilisearch.                 |\n| `TiltifySearchHttpError`                                         | `./http-client`        | class     | Carries `status`, `url`, `bodySample` (first 500 bytes).         |\n| `ResilientHttpClientOptions`, `RetryInfo`                        | `./http-client`        | type     | Retry tunables + the `onRetry` diagnostic payload.                |\n| `createMeilisearchClient`                                        | `./meilisearch-client` | function | Meilisearch client pre-wired with the resilient `httpClient`.     |\n| `createTiltifyFetchAdapter`                                      | `./meilisearch-client` | function | Routes single-index searches through `/multi-search` + `Origin`.  |\n| `translateIndexSearchToMultiSearch`                              | `./meilisearch-client` | const    | **Deprecated** alias of `createTiltifyFetchAdapter`; removed in 0.5.0. |\n| `TILTIFY_HITS_PER_PAGE_CAP`, `TILTIFY_MAX_PAGES`, `TILTIFY_MAX_TOTAL_HITS` | `./meilisearch-client` | const | `100` / `10` / `1000` — the upstream pagination window.  |\n| `FactHit`, `FilterableFields`, `Avatar`                          | `./types`              | type     | Shared `facts`-index shapes.                                      |\n| `FACT_DATA_TYPES`, `FactDataType`                                | `./types`              | const/type | Sub-resource enumeration for crawl orchestration.               |\n| `KNOWN_URLS`                                                     | `./`                   | const    | Twitch Extension URL disclosure.                                  |\n| `PACKAGE_NAME`                                                   | `./`                   | const    | Identifier for runtime version-pinning.                           |\n\nAvailable only via the `/converters` subpath (not in the barrel):\n`tiltifyCampaignToFactHit`, `restCampaignToFactHit`, `ConvertToFactHitOptions`.\n\n## Upstream spec\n\nTiltify does not publish a schema for the public Meilisearch indices. The field\nshapes here mirror what `tiltify.com` itself sends; when you observe new fields\non the wire, update [`src/types.ts`](./src/types.ts) + the relevant wrapper\nclass.\n\nThe host and public read-only key in [`src/constants.ts`](./src/constants.ts)\nare **generated** 1:1 from\n[`tests/integration/canonical-search-config.json`](./tests/integration/canonical-search-config.json)\n— don't hand-edit that module. `bun run regen-constants:check` (part of the\nroot `check:fast` gate) fails on drift; `bun run regen-constants` regenerates\nafter Tiltify rotates the key or moves the host.\n\nThe companion REST OpenAPI snapshots (for\n[`@playlive/tiltify-core`](../core/)) live at\n[`specs/tiltify/`](../../../specs/tiltify/). Re-sync via `/charity:sync` or\n`bun run sync-charity-specs` at the workspace root.\n\n## Twitch Extension URL disclosure\n\nThe `KNOWN_URLS` export enumerates every absolute URL or host this package\ncan fetch. See [`docs/twitch-extension-checklist.md`](../../../docs/twitch-extension-checklist.md).\n\n```ts\nimport { KNOWN_URLS } from \"@playlive/tiltify-search\";\nconsole.log(KNOWN_URLS);\n// [\n//   \"https://api.tiltify.com\",\n//   \"https://flags.tiltify.com\",\n// ]\n```\n\nThe Meilisearch indices moved from `site-search.tiltify.com` to\n`https://api.tiltify.com/search` (`DEFAULT_SEARCH_HOST`), which is why only the\ntwo hosts above appear. Keep this list and the source export in sync — the\nExtension submission form requires the disclosure list verbatim.\n\n## Migration from `@playlive/tiltify-tools`\n\n`@playlive/tiltify-search` is a near drop-in replacement for the search +\nflags surface that used to live inside `tiltify-tools`. Every class, method\nsignature, and exported type is preserved unchanged with one exception:\n\n- **`UserSearch#getUserBySlug` was removed.** That method hit the Tiltify\n  GraphQL endpoint and required a transitive GraphQL dependency. Per PRD\n  §5.3, the search package now stays free of any GraphQL dependency.\n  Replacement: `TiltifyGraphQL#getUserBySlug` in\n  [`@playlive/tiltify-graphql`](../graphql/).\n\nImports just move:\n\n```diff\n- import { CampaignSearch } from \"@playlive/tiltify-tools/campaign-search\";\n+ import { CampaignSearch } from \"@playlive/tiltify-search\";\n```\n\nSee the root [`MIGRATION.md`](../../../MIGRATION.md) for the full per-symbol\ntable.\n\n## Examples\n\n### Enumerate every St. Jude campaign, with progress and retry logging\n\n`getAllCampaigns` is the reason this package exists. Meilisearch caps any\nsingle (filter, query) tuple at `TILTIFY_MAX_TOTAL_HITS` (1000) reachable hits\nand Tiltify additionally caps `hitsPerPage` at 100 / `page` at 10 — so the\nmethod recursively partitions the filter along facetable axes until each leaf\nbucket fits under the cap, then paginates each leaf. Hits are deduped by `id`.\n\n```ts\nimport { CampaignSearch, type FactHit } from \"@playlive/tiltify-search\";\nimport { CAUSE_IDS } from \"@playlive/tiltify-search/auction-houses\";\nimport { TiltifySearchHttpError } from \"@playlive/tiltify-search/http-client\";\n\n// The third constructor arg tunes the resilient httpClient shared by every\n// wrapper class: Retry-After-aware backoff on 429/5xx, JSON content-type\n// guard, and structured errors with a body sample.\nconst campaigns = new CampaignSearch(undefined, undefined, {\n  maxRetries: 4,\n  baseBackoffMs: 750,\n  onRetry: ({ attempt, status, retryAfterMs, url }) => {\n    console.warn(`tiltify search retry ${attempt} (HTTP ${status}, +${retryAfterMs}ms) ${url}`);\n  },\n});\n\nexport async function allStJudeCampaigns(): Promise<FactHit[]> {\n  try {\n    const hits = await campaigns.getAllCampaigns(\n      { public: true, cause_public_id: CAUSE_IDS.ST_JUDE },\n      ({ collected, total }) => {\n        // `total` is fixed at probe time; `collected` grows monotonically.\n        process.stdout.write(`\\r${collected}/${total} campaigns…`);\n      },\n      // Default is 2 in-flight requests. Tiltify's Cloudflare layer\n      // rate-limits shared NAT egress IPs, so stay gentle from Lambda.\n      { concurrency: 2 },\n    );\n\n    return hits.sort((a, b) => b.total_amount_raised - a.total_amount_raised);\n  } catch (err) {\n    if (err instanceof TiltifySearchHttpError) {\n      // `bodySample` is the first 500 bytes — a Cloudflare challenge page\n      // reads very differently from a genuine Meilisearch error here.\n      console.error(`search failed HTTP ${err.status} on ${err.url}: ${err.bodySample}`);\n      return [];\n    }\n    throw err;\n  }\n}\n```\n\nOmitting `type` from the filter scopes results to `CAMPAIGN_FACT_TYPES`\n(`campaign` + `team_event`); the `facts` index also holds causes, fundraising\nevents, users, teams, and auction houses, which would otherwise leak in.\n\n### Compose a filter and drive `/multi-search` without the SDK\n\n`buildFilterString` and `TiltifyMultiSearch` have no `meilisearch` dependency,\nso this whole block tree-shakes down to plain `fetch`.\n\n```ts\nimport { buildFilterString } from \"@playlive/tiltify-search/filters\";\nimport { TiltifyMultiSearch } from \"@playlive/tiltify-search/multi\";\nimport type { FactHit } from \"@playlive/tiltify-search/types\";\n\nconst filter = buildFilterString({ public: true, type: \"campaign\", status: \"\" });\n// → 'public = true AND type = \"campaign\"'   (undefined + \"\" clauses are dropped)\n\nconst ms = new TiltifyMultiSearch();\nconst { results } = await ms.multiSearch<FactHit>([\n  { indexUid: \"facts\", q: \"st jude\", filter, hitsPerPage: 8, page: 1 },\n  { indexUid: \"causes_and_fes\", q: \"st jude\", hitsPerPage: 8, page: 1 },\n]);\n\nfor (const result of results) {\n  console.log(`${result.indexUid}: ${result.totalHits} hits in ${result.processingTimeMs}ms`);\n}\n```\n\n### Cause → fundraising events → rewards drill-down\n\nEach wrapper returns the raw Meilisearch response, so `hits`, `totalHits`, and\n`page` are all available.\n\n```ts\nimport { CauseSearch, RewardSearch } from \"@playlive/tiltify-search\";\n\nconst causes = new CauseSearch();\nconst rewards = new RewardSearch();\n\n// 1. Find the cause record in the unioned `causes_and_fes` index.\nconst { hits: causeHits } = await causes.getCauses({ query: \"st jude\", hitsPerPage: 1 });\nconst causeFactPublicId = causeHits[0]?.cause_fact_public_id;\nif (!causeFactPublicId) throw new Error(\"cause not found\");\n\n// 2. Every published fundraising event under that cause.\nconst { hits: events } = await causes.getFundraisingEventsByCauseFactPublicId({\n  causeFactPublicId,\n  hitsPerPage: 50,\n});\n\n// 3. Active rewards for the first event.\nconst first = events[0];\nif (first?.fundraising_event_public_id) {\n  const { hits: incentives } = await rewards.getRewards({\n    filter: {\n      fundraising_event_public_id: first.fundraising_event_public_id,\n      active: true,\n      public: true,\n    },\n    hitsPerPage: 50,\n  });\n  console.log(`${incentives.length} active rewards on ${first.name ?? first.id}`);\n}\n```\n\n### Merge unindexed REST campaigns into a search result set\n\nThe `facts` index lags for brand-new campaigns. `/converters` turns a Tiltify\nREST campaign into a `FactHit` so both sources render through the same UI code\n— prefer the real index hit whenever both exist for an `id`.\n\n```ts\nimport { tiltify } from \"@playlive/tiltify-core\";\nimport { CampaignSearch, type FactHit } from \"@playlive/tiltify-search\";\nimport { tiltifyCampaignToFactHit } from \"@playlive/tiltify-search/converters\";\n\ntiltify.UseProxy(\"prod\");\n\nconst indexed = await new CampaignSearch().getAllCampaigns({ public: true });\nconst byId = new Map<string, FactHit>(indexed.map((hit) => [hit.id, hit]));\n\nconst fresh = await tiltify.GetUserCampaigns(\"user-id\");\nfor (const campaign of fresh) {\n  // Index hits win; REST-derived hits only fill gaps.\n  if (!byId.has(campaign.id)) {\n    byId.set(campaign.id, tiltifyCampaignToFactHit(campaign));\n  }\n}\n```\n\n## Contributing\n\nSee [CONTRIBUTING.md](../../../CONTRIBUTING.md). To add a new search\nwrapper:\n\n1. Add the class to `src/<name>-search.ts` with full TSDoc, constructing its\n   client via `createMeilisearchClient` so it inherits the retry policy.\n2. Re-export from [`src/index.ts`](./src/index.ts) + add a subpath in\n   `package.json` exports.\n3. Update [`build.ts`](./build.ts) entrypoints.\n4. Port unit tests under [`tests/unit/`](./tests/unit/).\n5. Append to the [changelog](./CHANGELOG.md) + migration table.\n\n## License\n\nMIT — see [LICENSE](../../../LICENSE). Distributed via Play Live\nCodeArtifact (PRD §6).\n","readmeFilename":"README.md","dist":{"tarball":"https://packages.playlive.experience.stjude.org/@playlive/tiltify-search/-/tiltify-search-0.4.6.tgz","shasum":"f431ea856a44f1101db7a2ad4f5a9f3d2b489209","integrity":"sha512-xxyvktUxf8A6m2dZ/v0ZCW4nSQFAu7P8ZBDBqYA8AYS+4miCoCtGDwDwyWoyc7liGlJ3T49g+h/bXUVl2mGsUQ=="}},"0.4.7":{"name":"@playlive/tiltify-search","version":"0.4.7","description":"Meilisearch wrappers + flags client for the public Tiltify site-search surface.","type":"module","sideEffects":false,"main":"./index.js","types":"./index.d.ts","exports":{".":{"import":"./index.js","types":"./index.d.ts"},"./types":{"import":"./types.js","types":"./types.d.ts"},"./constants":{"import":"./constants.js","types":"./constants.d.ts"},"./filters":{"import":"./build-filter-string.js","types":"./build-filter-string.d.ts"},"./flags":{"import":"./tiltify-flags.js","types":"./tiltify-flags.d.ts"},"./multi":{"import":"./multi-search.js","types":"./multi-search.d.ts"},"./campaigns":{"import":"./campaign-search.js","types":"./campaign-search.d.ts"},"./teams":{"import":"./team-search.js","types":"./team-search.d.ts"},"./users":{"import":"./user-search.js","types":"./user-search.d.ts"},"./causes":{"import":"./cause-search.js","types":"./cause-search.d.ts"},"./rewards":{"import":"./reward-search.js","types":"./reward-search.d.ts"},"./auction-houses":{"import":"./auction-house-search.js","types":"./auction-house-search.d.ts"},"./converters":{"import":"./converters.js","types":"./converters.d.ts"},"./http-client":{"import":"./http-client.js","types":"./http-client.d.ts"},"./meilisearch-client":{"import":"./meilisearch-client.js","types":"./meilisearch-client.d.ts"}},"peerDependencies":{"@playlive/tiltify-core":"^0.4.19","meilisearch":"^0.54.0"},"peerDependenciesMeta":{"@playlive/tiltify-core":{"optional":true},"meilisearch":{"optional":false}},"playlive":{"target":"browser","frontendEligible":true,"coverageFloor":85},"publishConfig":{"access":"restricted","registry":"https://playlive-767397689694.d.codeartifact.us-east-1.amazonaws.com/npm/playlive/"},"integrity":"sha512-lW5PCmHkrXcrSzxDfCgknNgNT9o0s2Bk9FnE0vHylMqwL1Mvgs8nfGIQ3WEn4zz7dt1Mta8k93TRqy5eN89CHg==","shasum":"8a2bce5f24252c582f694ffe2f579d3cd413a982","readme":"# @playlive/tiltify-search\n\nMeilisearch wrappers + a `flags.tiltify.com` client for the public Tiltify\nsite-search surface. Ported from `@playlive/tiltify-tools`; class signatures,\ndefaults, and the filter-string builder are preserved verbatim so consumers\ncan migrate by changing the import specifier alone.\n\n![Coverage](./coverage-badge.svg)\n\n## Install\n\n```bash\nbun add @playlive/tiltify-search meilisearch\n```\n\nTwo peer dependencies:\n\n| Peer                     | Range        | Optional | Needed for                                                                  |\n| ------------------------ | ------------ | -------- | --------------------------------------------------------------------------- |\n| `meilisearch`            | `^0.54.0`    | no       | Every `*Search` class, plus `createMeilisearchClient`.                       |\n| `@playlive/tiltify-core` | `workspace:*`| yes      | Only `@playlive/tiltify-search/converters` (REST campaign → `FactHit`).      |\n\n`meilisearch` is declared non-optional because the default barrel re-exports\nthe index wrappers. The `/filters`, `/flags`, `/multi`, `/http-client`, and\n`/types` subpaths never touch it, so importing those directly keeps it out of\nyour bundle even though the manifest asks for it.\n\n## Quick start\n\n```ts\nimport { CampaignSearch, TiltifyFlags } from \"@playlive/tiltify-search\";\n\nconst cs = new CampaignSearch();\nconst page = await cs.getCampaigns({\n  page: 1,\n  hitsPerPage: 20,\n  filter: { public: true, type: \"campaign\" },\n  query: \"marathon\",\n});\n\n// Walk every campaign matching a filter — works around Meilisearch's\n// `maxTotalHits` cap by recursively partitioning along facetable axes.\nconst all = await cs.getAllCampaigns(\n  { public: true, type: \"campaign\" },\n  ({ collected, total }) => console.log(`${collected}/${total}`),\n);\n\n// Hit the public flag endpoint\nconst flags = await new TiltifyFlags().getFlags();\n```\n\n## Subpath exports\n\n| Subpath                                   | Description                                                                    |\n| ----------------------------------------- | ------------------------------------------------------------------------------ |\n| `@playlive/tiltify-search`                | Default barrel — everything except `/converters`.                               |\n| `@playlive/tiltify-search/types`          | `FactHit`, `FilterableFields`, `Avatar`, `FACT_DATA_TYPES`, `FactDataType`.     |\n| `@playlive/tiltify-search/constants`      | `DEFAULT_SEARCH_API_KEY`, `DEFAULT_SEARCH_HOST`, `DEFAULT_FLAGS_URL`.           |\n| `@playlive/tiltify-search/filters`        | `buildFilterString` (no meilisearch dep).                                       |\n| `@playlive/tiltify-search/flags`          | `TiltifyFlags`, `TiltifyFlag` (no meilisearch dep).                             |\n| `@playlive/tiltify-search/multi`          | `TiltifyMultiSearch` + its types (no meilisearch dep — raw HTTP).               |\n| `@playlive/tiltify-search/campaigns`      | `CampaignSearch` + the `getAllCampaigns` partitioner and its option types.      |\n| `@playlive/tiltify-search/teams`          | `TeamSearch`.                                                                   |\n| `@playlive/tiltify-search/users`          | `UserSearch`.                                                                   |\n| `@playlive/tiltify-search/causes`         | `CauseSearch` + cause/FE index types and `CAUSE_INDEX_UIDS`.                     |\n| `@playlive/tiltify-search/rewards`        | `RewardSearch` + `RewardHit` / `RewardFilterableFields`.                         |\n| `@playlive/tiltify-search/auction-houses` | `AuctionHouseSearch` + `CAUSE_IDS.ST_JUDE`.                                     |\n| `@playlive/tiltify-search/http-client`    | `createResilientHttpClient`, `TiltifySearchHttpError`, `RetryInfo` (no meilisearch dep). |\n| `@playlive/tiltify-search/meilisearch-client` | `createMeilisearchClient`, `createTiltifyFetchAdapter`, the Tiltify page/hit caps. |\n| `@playlive/tiltify-search/converters`     | `tiltifyCampaignToFactHit`, `restCampaignToFactHit`. **Opt-in only** — pulls `@playlive/tiltify-core`. |\n\nThe `/filters`, `/flags`, `/multi`, `/http-client`, and `/types` subpaths are\ncompletely free of `meilisearch` — useful when you want filter-string\ncomposition, the retry client, or the raw multi-search endpoint without paying\nfor the SDK. `/converters` is deliberately **not** re-exported from the default\nbarrel so consumers who don't use it never pull `@playlive/tiltify-core` into\ntheir bundle.\n\n## API reference\n\nFull generated API documentation:\n<https://packages.playlive.experience.stjude.org/p/@playlive/tiltify-search/docs/>\n\nTop-level exports (default barrel):\n\n| Export                                                           | Source                 | Kind     | Notes                                                            |\n| ----------------------------------------------------------------- | ---------------------- | -------- | ---------------------------------------------------------------- |\n| `buildFilterString`                                              | `./filters`            | function | Meilisearch filter literal composer; escapes `\"` and `\\`.        |\n| `CampaignSearch`                                                 | `./campaigns`          | class    | `facts` index wrapper + `getAllCampaigns` partitioner.           |\n| `CAMPAIGN_FACT_TYPES`, `CampaignFactType`                        | `./campaigns`          | const/type | `[\"campaign\", \"team_event\"]` — the `getAllCampaigns` default.  |\n| `GetAllCampaignsFilter`, `GetAllCampaignsProgress`, `GetAllCampaignsOptions` | `./campaigns` | type | Filter, progress event, and concurrency options.                 |\n| `AuctionHouseSearch`                                             | `./auction-houses`     | class    | `facts` index wrapper scoped to `type = \"auction_house\"`.        |\n| `CAUSE_IDS`                                                      | `./auction-houses`     | const    | `{ ST_JUDE: \"400f5687-…\" }`.                                      |\n| `CauseSearch`                                                    | `./causes`             | class    | Wraps `causes`, `fundraising_events`, `causes_and_fes`.          |\n| `CAUSE_INDEX_UIDS`, `CauseIndexUid`                              | `./causes`             | const/type | The three cause/FE index uids.                                 |\n| `CauseOrEventHit`, `CauseOrEventFilterableFields`                | `./causes`             | type     | Cause/FE hit + filter shapes.                                    |\n| `RewardSearch`                                                   | `./rewards`            | class    | `rewards` index wrapper.                                          |\n| `RewardHit`, `RewardFilterableFields`                            | `./rewards`            | type     | Reward hit + filter shapes.                                       |\n| `TeamSearch`                                                     | `./teams`              | class    | `teams` index wrapper (`findTeamByTeamName`).                     |\n| `UserSearch`                                                     | `./users`              | class    | `user` index wrapper (`findUserByUsername` only).                 |\n| `TiltifyMultiSearch`                                             | `./multi`              | class    | Native-fetch wrapper for `POST /multi-search`.                    |\n| `MultiSearchQuery`, `MultiSearchResult`, `MultiSearchResponse`   | `./multi`              | type     | Multi-search request/response shapes.                             |\n| `TiltifyFlags`, `TiltifyFlag`                                    | `./flags`              | class/type | `flags.tiltify.com` client.                                     |\n| `createResilientHttpClient`                                      | `./http-client`        | function | `Retry-After`-aware `httpClient` for Meilisearch.                 |\n| `TiltifySearchHttpError`                                         | `./http-client`        | class     | Carries `status`, `url`, `bodySample` (first 500 bytes).         |\n| `ResilientHttpClientOptions`, `RetryInfo`                        | `./http-client`        | type     | Retry tunables + the `onRetry` diagnostic payload.                |\n| `createMeilisearchClient`                                        | `./meilisearch-client` | function | Meilisearch client pre-wired with the resilient `httpClient`.     |\n| `createTiltifyFetchAdapter`                                      | `./meilisearch-client` | function | Routes single-index searches through `/multi-search` + `Origin`.  |\n| `translateIndexSearchToMultiSearch`                              | `./meilisearch-client` | const    | **Deprecated** alias of `createTiltifyFetchAdapter`; removed in 0.5.0. |\n| `TILTIFY_HITS_PER_PAGE_CAP`, `TILTIFY_MAX_PAGES`, `TILTIFY_MAX_TOTAL_HITS` | `./meilisearch-client` | const | `100` / `10` / `1000` — the upstream pagination window.  |\n| `FactHit`, `FilterableFields`, `Avatar`                          | `./types`              | type     | Shared `facts`-index shapes.                                      |\n| `FACT_DATA_TYPES`, `FactDataType`                                | `./types`              | const/type | Sub-resource enumeration for crawl orchestration.               |\n| `KNOWN_URLS`                                                     | `./`                   | const    | Twitch Extension URL disclosure.                                  |\n| `PACKAGE_NAME`                                                   | `./`                   | const    | Identifier for runtime version-pinning.                           |\n\nAvailable only via the `/converters` subpath (not in the barrel):\n`tiltifyCampaignToFactHit`, `restCampaignToFactHit`, `ConvertToFactHitOptions`.\n\n## Upstream spec\n\nThis package targets the **public Meilisearch indices behind `tiltify.com`'s\nsite search** (`https://api.tiltify.com/search`, `DEFAULT_SEARCH_HOST`) plus the\npublic flag endpoint at `https://flags.tiltify.com` (`DEFAULT_FLAGS_URL`).\nNeither has a published schema — the hit shapes here mirror what `tiltify.com`\nitself receives, so pin the version if you depend on exact field sets.\n\nThe host and the public read-only search key are exported as constants\n(`DEFAULT_SEARCH_HOST`, `DEFAULT_SEARCH_API_KEY`) and refreshed in a release\nwhenever Tiltify rotates the key or moves the host.\n\nFor the documented, spec-backed Tiltify surface — the v5 REST API used by\n[`@playlive/tiltify-core`](../core/) and by this package's `/converters`\nsubpath — see <https://developers.tiltify.com>.\n\n## Twitch Extension URL disclosure\n\nThe `KNOWN_URLS` export enumerates every absolute URL or host this package\ncan fetch — the list a Twitch Extension submission must disclose verbatim.\n\n```ts\nimport { KNOWN_URLS } from \"@playlive/tiltify-search\";\nconsole.log(KNOWN_URLS);\n// [\n//   \"https://api.tiltify.com\",\n//   \"https://flags.tiltify.com\",\n// ]\n```\n\nThe Meilisearch indices moved from `site-search.tiltify.com` to\n`https://api.tiltify.com/search` (`DEFAULT_SEARCH_HOST`), which is why only the\ntwo hosts above appear. Keep this list and the source export in sync — the\nExtension submission form requires the disclosure list verbatim.\n\n## Migration from `@playlive/tiltify-tools`\n\n`@playlive/tiltify-search` is a near drop-in replacement for the search +\nflags surface that used to live inside `tiltify-tools`. Every class, method\nsignature, and exported type is preserved unchanged with one exception:\n\n- **`UserSearch#getUserBySlug` was removed.** That method hit the Tiltify\n  GraphQL endpoint and required a transitive GraphQL dependency; this package\n  now stays free of any GraphQL dependency. Replacement:\n  `TiltifyGraphQL#getUserBySlug` in\n  [`@playlive/tiltify-graphql`](../graphql/).\n\nImports just move:\n\n```diff\n- import { CampaignSearch } from \"@playlive/tiltify-tools/campaign-search\";\n+ import { CampaignSearch } from \"@playlive/tiltify-search\";\n```\n\n## Examples\n\n### Enumerate every St. Jude campaign, with progress and retry logging\n\n`getAllCampaigns` is the reason this package exists. Meilisearch caps any\nsingle (filter, query) tuple at `TILTIFY_MAX_TOTAL_HITS` (1000) reachable hits\nand Tiltify additionally caps `hitsPerPage` at 100 / `page` at 10 — so the\nmethod recursively partitions the filter along facetable axes until each leaf\nbucket fits under the cap, then paginates each leaf. Hits are deduped by `id`.\n\n```ts\nimport { CampaignSearch, type FactHit } from \"@playlive/tiltify-search\";\nimport { CAUSE_IDS } from \"@playlive/tiltify-search/auction-houses\";\nimport { TiltifySearchHttpError } from \"@playlive/tiltify-search/http-client\";\n\n// The third constructor arg tunes the resilient httpClient shared by every\n// wrapper class: Retry-After-aware backoff on 429/5xx, JSON content-type\n// guard, and structured errors with a body sample.\nconst campaigns = new CampaignSearch(undefined, undefined, {\n  maxRetries: 4,\n  baseBackoffMs: 750,\n  onRetry: ({ attempt, status, retryAfterMs, url }) => {\n    console.warn(`tiltify search retry ${attempt} (HTTP ${status}, +${retryAfterMs}ms) ${url}`);\n  },\n});\n\nexport async function allStJudeCampaigns(): Promise<FactHit[]> {\n  try {\n    const hits = await campaigns.getAllCampaigns(\n      { public: true, cause_public_id: CAUSE_IDS.ST_JUDE },\n      ({ collected, total }) => {\n        // `total` is fixed at probe time; `collected` grows monotonically.\n        process.stdout.write(`\\r${collected}/${total} campaigns…`);\n      },\n      // Default is 2 in-flight requests. Tiltify's Cloudflare layer\n      // rate-limits shared NAT egress IPs, so stay gentle from Lambda.\n      { concurrency: 2 },\n    );\n\n    return hits.sort((a, b) => b.total_amount_raised - a.total_amount_raised);\n  } catch (err) {\n    if (err instanceof TiltifySearchHttpError) {\n      // `bodySample` is the first 500 bytes — a Cloudflare challenge page\n      // reads very differently from a genuine Meilisearch error here.\n      console.error(`search failed HTTP ${err.status} on ${err.url}: ${err.bodySample}`);\n      return [];\n    }\n    throw err;\n  }\n}\n```\n\nOmitting `type` from the filter scopes results to `CAMPAIGN_FACT_TYPES`\n(`campaign` + `team_event`); the `facts` index also holds causes, fundraising\nevents, users, teams, and auction houses, which would otherwise leak in.\n\n### Compose a filter and drive `/multi-search` without the SDK\n\n`buildFilterString` and `TiltifyMultiSearch` have no `meilisearch` dependency,\nso this whole block tree-shakes down to plain `fetch`.\n\n```ts\nimport { buildFilterString } from \"@playlive/tiltify-search/filters\";\nimport { TiltifyMultiSearch } from \"@playlive/tiltify-search/multi\";\nimport type { FactHit } from \"@playlive/tiltify-search/types\";\n\nconst filter = buildFilterString({ public: true, type: \"campaign\", status: \"\" });\n// → 'public = true AND type = \"campaign\"'   (undefined + \"\" clauses are dropped)\n\nconst ms = new TiltifyMultiSearch();\nconst { results } = await ms.multiSearch<FactHit>([\n  { indexUid: \"facts\", q: \"st jude\", filter, hitsPerPage: 8, page: 1 },\n  { indexUid: \"causes_and_fes\", q: \"st jude\", hitsPerPage: 8, page: 1 },\n]);\n\nfor (const result of results) {\n  console.log(`${result.indexUid}: ${result.totalHits} hits in ${result.processingTimeMs}ms`);\n}\n```\n\n### Cause → fundraising events → rewards drill-down\n\nEach wrapper returns the raw Meilisearch response, so `hits`, `totalHits`, and\n`page` are all available.\n\n```ts\nimport { CauseSearch, RewardSearch } from \"@playlive/tiltify-search\";\n\nconst causes = new CauseSearch();\nconst rewards = new RewardSearch();\n\n// 1. Find the cause record in the unioned `causes_and_fes` index.\nconst { hits: causeHits } = await causes.getCauses({ query: \"st jude\", hitsPerPage: 1 });\nconst causeFactPublicId = causeHits[0]?.cause_fact_public_id;\nif (!causeFactPublicId) throw new Error(\"cause not found\");\n\n// 2. Every published fundraising event under that cause.\nconst { hits: events } = await causes.getFundraisingEventsByCauseFactPublicId({\n  causeFactPublicId,\n  hitsPerPage: 50,\n});\n\n// 3. Active rewards for the first event.\nconst first = events[0];\nif (first?.fundraising_event_public_id) {\n  const { hits: incentives } = await rewards.getRewards({\n    filter: {\n      fundraising_event_public_id: first.fundraising_event_public_id,\n      active: true,\n      public: true,\n    },\n    hitsPerPage: 50,\n  });\n  console.log(`${incentives.length} active rewards on ${first.name ?? first.id}`);\n}\n```\n\n### Merge unindexed REST campaigns into a search result set\n\nThe `facts` index lags for brand-new campaigns. `/converters` turns a Tiltify\nREST campaign into a `FactHit` so both sources render through the same UI code\n— prefer the real index hit whenever both exist for an `id`.\n\n```ts\nimport { tiltify } from \"@playlive/tiltify-core\";\nimport { CampaignSearch, type FactHit } from \"@playlive/tiltify-search\";\nimport { tiltifyCampaignToFactHit } from \"@playlive/tiltify-search/converters\";\n\ntiltify.UseProxy(\"prod\");\n\nconst indexed = await new CampaignSearch().getAllCampaigns({ public: true });\nconst byId = new Map<string, FactHit>(indexed.map((hit) => [hit.id, hit]));\n\nconst fresh = await tiltify.GetUserCampaigns(\"user-id\");\nfor (const campaign of fresh) {\n  // Index hits win; REST-derived hits only fill gaps.\n  if (!byId.has(campaign.id)) {\n    byId.set(campaign.id, tiltifyCampaignToFactHit(campaign));\n  }\n}\n```\n\n## License\n\nMIT © St. Jude Children's Research Hospital\n","readmeFilename":"README.md","dist":{"tarball":"https://packages.playlive.experience.stjude.org/@playlive/tiltify-search/-/tiltify-search-0.4.7.tgz","shasum":"8a2bce5f24252c582f694ffe2f579d3cd413a982","integrity":"sha512-lW5PCmHkrXcrSzxDfCgknNgNT9o0s2Bk9FnE0vHylMqwL1Mvgs8nfGIQ3WEn4zz7dt1Mta8k93TRqy5eN89CHg=="}}},"time":{"0.4.5":"2026-08-26T18:10:12.706Z","modified":"2026-08-26T20:07:31.126Z","0.1.0":"2026-08-26T18:16:12.064Z","0.2.0":"2026-08-26T18:16:12.626Z","0.2.1":"2026-08-26T18:16:13.097Z","0.3.0":"2026-08-26T18:16:13.682Z","0.3.1":"2026-08-26T18:16:14.396Z","0.4.0":"2026-08-26T18:16:15.037Z","0.4.1":"2026-08-26T18:16:15.642Z","0.4.2":"2026-08-26T18:16:16.206Z","0.4.3":"2026-08-26T18:16:16.789Z","0.4.4":"2026-08-26T18:16:17.343Z","0.4.6":"2026-08-26T19:43:15.036Z","0.4.7":"2026-08-26T20:07:31.126Z"}}