{"_id":"@cyblow/paginate-core","_rev":"3-a6752b4d20ebd67b00bb4562b0a23231","name":"@cyblow/paginate-core","dist-tags":{"latest":"0.1.5"},"versions":{"0.1.3":{"name":"@cyblow/paginate-core","version":"0.1.3","license":"MIT","_id":"@cyblow/paginate-core@0.1.3","maintainers":[{"name":"cyblow","email":"lens-mattes-80@icloud.com"}],"homepage":"https://github.com/CybLow/paginate#readme","bugs":{"url":"https://github.com/CybLow/paginate/issues"},"dist":{"shasum":"7a3a0091675ea06169d7f086ed00ceaae6b5084d","tarball":"https://registry.npmjs.org/@cyblow/paginate-core/-/paginate-core-0.1.3.tgz","fileCount":4,"integrity":"sha512-n2HbuMcqKoOXHpvUq+bsl1vy7lgxumtn/fexE8ZEWhG5erE/Aha/vFJGMzFIZdAIywKdnJqu9ir17Axtc0uzgg==","signatures":[{"sig":"MEYCIQDHm7axK4NGbzcuMXxOLaR9a0FlEM60SGL2LvTqyhm0pQIhAL+O0ZV7Fr1mrQVx3hqXi0nWDIjE8gGIVHsYBrQtBKX6","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":19879},"main":"index.js","napi":{"name":"@cyblow/paginate-core","triples":{"defaults":true,"additional":["aarch64-apple-darwin","aarch64-unknown-linux-gnu","x86_64-unknown-linux-musl","aarch64-unknown-linux-musl","aarch64-pc-windows-msvc"]}},"types":"index.d.ts","engines":{"node":">=12.22.0"},"gitHead":"b6f01d340844b28340a3fa0ff8fea11092d5eb3d","scripts":{"build":"napi build --platform --release","artifacts":"napi artifacts","build:debug":"napi build --platform","prepublishOnly":"napi prepublish -t npm"},"_npmUser":{"name":"cyblow","email":"lens-mattes-80@icloud.com"},"repository":{"url":"git+https://github.com/CybLow/paginate.git","type":"git"},"_npmVersion":"10.8.2","description":"Node/TypeScript native bindings for paginate-core (cursor codec, text normalization, pagination math, filtering, sorting, search).","directories":{},"_nodeVersion":"20.20.2","_hasShrinkwrap":false,"devDependencies":{"@napi-rs/cli":"^2.18.0"},"optionalDependencies":{"@cyblow/paginate-core-darwin-x64":"0.1.3","@cyblow/paginate-core-darwin-arm64":"0.1.3","@cyblow/paginate-core-linux-x64-gnu":"0.1.3","@cyblow/paginate-core-linux-x64-musl":"0.1.3","@cyblow/paginate-core-win32-x64-msvc":"0.1.3","@cyblow/paginate-core-linux-arm64-gnu":"0.1.3","@cyblow/paginate-core-linux-arm64-musl":"0.1.3","@cyblow/paginate-core-win32-arm64-msvc":"0.1.3"},"_npmOperationalInternal":{"tmp":"tmp/paginate-core_0.1.3_1780572811544_0.25814872171482484","host":"s3://npm-registry-packages-npm-production"}},"0.1.4":{"name":"@cyblow/paginate-core","version":"0.1.4","license":"MIT","_id":"@cyblow/paginate-core@0.1.4","maintainers":[{"name":"cyblow","email":"lens-mattes-80@icloud.com"}],"homepage":"https://github.com/CybLow/paginate#readme","bugs":{"url":"https://github.com/CybLow/paginate/issues"},"dist":{"shasum":"bed774482a960c7b97cdf00b96282ec9821549e3","tarball":"https://registry.npmjs.org/@cyblow/paginate-core/-/paginate-core-0.1.4.tgz","fileCount":4,"integrity":"sha512-QUTgJtTsvgRmuzkLMT3OVKYQauaZX2ni0pkikMJgUqeadrLGFOSreSiLwdFiuheAMRI3Dw12f2Ju0+VidHYM9Q==","signatures":[{"sig":"MEYCIQDNjmWxT9K6fWJKjHBrx1EoG1jighy6AfiijK7Im+tDiQIhAOW+ROVoQfgRCM2ARE4FuX7avhhuT+hYxcG8HCwSRwTK","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":19928},"main":"index.js","napi":{"name":"@cyblow/paginate-core","triples":{"defaults":true,"additional":["aarch64-apple-darwin","aarch64-unknown-linux-gnu","x86_64-unknown-linux-musl","aarch64-unknown-linux-musl","aarch64-pc-windows-msvc"]}},"types":"index.d.ts","engines":{"node":">=12.22.0"},"gitHead":"445b76797e8a2821912f4d03aa4cf7175e2af143","scripts":{"build":"napi build --platform --release","artifacts":"napi artifacts","build:debug":"napi build --platform","prepublishOnly":"napi prepublish -t npm"},"_npmUser":{"name":"cyblow","email":"lens-mattes-80@icloud.com"},"repository":{"url":"git+https://github.com/CybLow/paginate.git","type":"git"},"_npmVersion":"10.8.2","description":"Node/TypeScript native bindings for paginate-core (cursor codec, text normalization, pagination math, filtering, sorting, search).","directories":{},"_nodeVersion":"20.20.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"@napi-rs/cli":"^2.18.0"},"optionalDependencies":{"@cyblow/paginate-core-darwin-x64":"0.1.4","@cyblow/paginate-core-darwin-arm64":"0.1.4","@cyblow/paginate-core-linux-x64-gnu":"0.1.4","@cyblow/paginate-core-linux-x64-musl":"0.1.4","@cyblow/paginate-core-win32-x64-msvc":"0.1.4","@cyblow/paginate-core-linux-arm64-gnu":"0.1.4","@cyblow/paginate-core-linux-arm64-musl":"0.1.4","@cyblow/paginate-core-win32-arm64-msvc":"0.1.4"},"_npmOperationalInternal":{"tmp":"tmp/paginate-core_0.1.4_1780573285560_0.9611731917292705","host":"s3://npm-registry-packages-npm-production"}},"0.1.5":{"name":"@cyblow/paginate-core","version":"0.1.5","description":"Node/TypeScript native bindings for paginate-core (cursor codec, text normalization, pagination math, filtering, sorting, search).","license":"MIT","repository":{"type":"git","url":"git+https://github.com/CybLow/paginate.git"},"main":"index.js","types":"index.d.ts","publishConfig":{"access":"public"},"napi":{"name":"paginate-core","triples":{"defaults":true,"additional":["aarch64-apple-darwin","aarch64-unknown-linux-gnu","x86_64-unknown-linux-musl","aarch64-unknown-linux-musl","aarch64-pc-windows-msvc"]}},"engines":{"node":">=12.22.0"},"scripts":{"build":"napi build --platform --release","build:debug":"napi build --platform","artifacts":"napi artifacts","prepublishOnly":"napi prepublish -t npm"},"devDependencies":{"@napi-rs/cli":"^2.18.0"},"optionalDependencies":{"@cyblow/paginate-core-win32-x64-msvc":"0.1.5","@cyblow/paginate-core-darwin-x64":"0.1.5","@cyblow/paginate-core-linux-x64-gnu":"0.1.5","@cyblow/paginate-core-darwin-arm64":"0.1.5","@cyblow/paginate-core-linux-arm64-gnu":"0.1.5","@cyblow/paginate-core-linux-x64-musl":"0.1.5","@cyblow/paginate-core-linux-arm64-musl":"0.1.5","@cyblow/paginate-core-win32-arm64-msvc":"0.1.5"},"_id":"@cyblow/paginate-core@0.1.5","gitHead":"6beaf34285d1399b8211614cf93e309bc50beefc","bugs":{"url":"https://github.com/CybLow/paginate/issues"},"homepage":"https://github.com/CybLow/paginate#readme","_nodeVersion":"20.20.2","_npmVersion":"10.8.2","dist":{"integrity":"sha512-lDf/77yZ1eF+JexjZXX7KB/20tuDq8Km+x4k8OyvSAsAlBtRXVuzPqLaVi7BR7NOySyjeW3KSemwmad9r4vx9w==","shasum":"e7a87daa5939e6894a7e133bb4a507fe632fb33e","tarball":"https://registry.npmjs.org/@cyblow/paginate-core/-/paginate-core-0.1.5.tgz","fileCount":4,"unpackedSize":19632,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIDjUJRyw4CModWFWel72mODS9z8DSw0C1USGLRAsyrVCAiEAzODEMENYxsg96Hhi/DE5uD1JdMw8m70WRvF2hjFdWjY="}]},"_npmUser":{"name":"cyblow","email":"lens-mattes-80@icloud.com"},"directories":{},"maintainers":[{"name":"cyblow","email":"lens-mattes-80@icloud.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/paginate-core_0.1.5_1780681569026_0.7704485110560966"},"_hasShrinkwrap":false}},"time":{"created":"2026-06-04T11:33:31.422Z","modified":"2026-06-05T17:46:09.290Z","0.1.3":"2026-06-04T11:33:31.737Z","0.1.4":"2026-06-04T11:41:25.702Z","0.1.5":"2026-06-05T17:46:09.165Z"},"bugs":{"url":"https://github.com/CybLow/paginate/issues"},"license":"MIT","homepage":"https://github.com/CybLow/paginate#readme","repository":{"type":"git","url":"git+https://github.com/CybLow/paginate.git"},"description":"Node/TypeScript native bindings for paginate-core (cursor codec, text normalization, pagination math, filtering, sorting, search).","maintainers":[{"name":"cyblow","email":"lens-mattes-80@icloud.com"}],"readme":"# paginate-node\n\nnapi-rs (Node-API) adapter that exposes the pure-Rust [`paginate-core`](../core)\nengine to Node.js / TypeScript. It mirrors the [PyO3 adapter](../py) surface so\nboth runtimes share one engine and one set of behaviours (the cursor wire format\nis byte-identical across Python, Node, and the core itself).\n\n## What it exposes\n\nRust function names are exported to JavaScript as camelCase (napi-rs convention):\n\n| JS export | Signature | Description |\n|-----------|-----------|-------------|\n| `normalizeText` | `(value: string) => string` | NFKD accent-stripping text normalization. |\n| `offset` | `(page: number, limit: number) => number` | Zero-based row offset. |\n| `maxPages` | `(total: number, limit: number) => number` | Total page count (ceil). |\n| `clampPage` | `(page, limit, total) => number` | Clamp page into `[1, maxPage]`. |\n| `offsetMeta` | `(page, limit, total) => OffsetMeta` | `{ page, pages, hasNext, hasPrevious }`. |\n| `encodeCursor` | `(values: unknown) => string` | Encode ordering values into a URL-safe cursor. |\n| `decodeCursor` | `(cursor: string) => unknown[]` | Decode a cursor back into its ordering values. |\n| `filterIndices` | `(items, specs) => number[]` | Indices matching flat filter specs `[{field,op,value,logic?}]`. |\n| `sortIndices` | `(items, specs) => number[]` | Index permutation for sort specs `[{field,direction?,nulls?}]`. |\n| `searchIndices` | `(items, query, fields, …) => number[]` | Ranked search indices over `fields`. |\n\n### Cursor values\n\nOrdering values cross the boundary as plain JSON (`serde_json::Value`):\n`null` / `bool` / `number` (integral -> Int, otherwise Float) / `string` /\n`array` / `object`. JavaScript has no native datetime / Decimal / UUID types, so\nthe typed-scalar variants the Python codec round-trips are not minted here —\npass their ISO/canonical strings instead. Cursors remain interoperable: a cursor\nproduced by Python or the Rust core decodes here and vice versa.\n\n### Performance — prefer native Array methods for in-memory work\n\n`filterIndices` / `sortIndices` / `searchIndices` exist for **behaviour parity**\nwith pypaginate's exact semantics — **not** for speed. Marshalling a large array\nacross the napi boundary costs far more than the per-item work, so V8's\n`Array.filter` / `Array.sort` are **40–230× faster** (see\n[../../BENCHMARKS.md](../../BENCHMARKS.md)). Reach for the native engines only\nwhen you need pypaginate's precise operator / ranking behaviour; otherwise use\nplain JS. The **cursor codec** and `normalizeText` are the consistency-critical\npaths genuinely worth crossing the boundary for.\n\n## Building\n\nThis crate compiles to a Node-API addon (`crate-type = [\"cdylib\"]`). The native\naddon plus its generated `index.js` / `index.d.ts` glue are produced by\n[`@napi-rs/cli`](https://www.npmjs.com/package/@napi-rs/cli):\n\n```bash\nnpm install        # installs @napi-rs/cli\nnpm run build      # napi build --platform --release  -> *.node + index.{js,d.ts}\n```\n\n`build.rs` calls `napi_build::setup()` so the linker is configured for the host\nNode-API toolchain.\n\nA plain `cargo build -p paginate-node` / `cargo check -p paginate-node` compiles\nthe Rust object too, but only `@napi-rs/cli` emits the loadable addon and TS\ntype definitions.\n\n## Status\n\nBuilds and is validated from Node — cursor wire-identical to Python/core, and\nfilter/sort/search return correct results. The generated artifacts (`index.js`,\n`index.d.ts`, `*.node`) are build outputs and are not checked in. Consumed by\nthe `packages/ts` TypeScript package.\n","readmeFilename":"README.md"}