@ bitbaum/ listkit (英语)
列表作为查询. 过滤、排序、搜索和呼呼都是同样的问题 随处可见 随处可见.
2026-09-11年对这支舰队的十二个储存库的调查发现:
| 什麽 | 计数 |
|---|---|
| 不兼容的过滤状态形状 | 12,没有两样 |
| 手建 URL 构建器 | ~34岁 |
| 复制“ 在一组中切换一个值” | ~25,在两个编码中 |
| 5起不同时间的故障 | ~11个 |
页:1 Math.ceil(total / pageSize) | ~ 11, 三分一还 |
重置那个逃生地点 % 财务报告和审定财务报表 _ 在 SQL 之前 LIKE | 7个中有3个需要 |
切换复制品中有两本是字符化的 完全相同 共享代码 。 一回波写了八回一样的三行体 方方面面,加上11个其布尔旗帜——大约120个 表达一个想法的行.
URL 构建者中有四个活虫, 此解码器存在, 所以它们不能 重写:
- 一个建造
new URLSearchParams()从头开始,所以用一个预先设定的沉默 抹去读者的积极搜索和其他五个方面; - 一个更改了日期范围而不清除
page,将读者登入第4页 (a) 2页的结果; - 所以后来增加的每个参数都不得不 以六个单独的模板字符串来记住;
- 一个用过
push而不是说replace用于解开的搜索框,所以后面 按钮向后走过每个字的中间拼写.
飞来飞去
这个 决定没有别的.
import { parseQuery, writeQuery, applyQuery, type ListSpec } from "@bitbaum/listkit";
const spec: ListSpec<Project> = {
facets: [
{ key: "kind", kind: "one", value: (p) => p.kind, options: ["product", "client", "demo"] },
{ key: "status", kind: "many", value: (p) => p.status, options: ["live", "prospect"] },
{ key: "nosite", kind: "flag", value: (p) => !p.site },
],
search: { text: (p) => [p.name, p.description, p.host] },
sorts: [
{ key: "name", by: [(p) => p.name] },
{ key: "newest", by: [(p) => p.since, (p) => p.name] },
],
defaultSort: "name",
defaultPageSize: 25,
};
const query = parseQuery(searchParams, spec); // validated, clamped
const { rows, matched, page, counts } = applyQuery(projects, spec, query);
const url = `?${writeQuery(searchParams, next, spec, query)}`;
5个面型,没有魔法哨兵
one • 妇女 many • 妇女 flag • 妇女 range • 妇女 ordinal。“无过滤器”的值是
空选择从来没有魔法弦。 一个被调查的Repo使用了翻译
标签("Alle"由于它的全部价值,它使过滤器身份取决于
读者语言.
规则测试针
- 一个 空选择过滤器而不是所有的东西.
- 缺少的数值在两个方向排序最后. 没有日期的记录不是 最古老的记录.
?page=0永远不能成为负抵消,而空列表仍然有 1页而不是"0页".- 面额计数是用面额自己选择的被解除来计算的,所以同时
过滤通过
kind=product旁边的计数kind=demo仍然说多少 演示是存在的,而不是零. - 写上你得到的段落. 当地人或裁判生还.
page当结果设定更改时被删除,只保留页面移动时.- 一个被取代的自动搜索决定
undefined,所以慢"ab"无法 覆盖一个快的"abc". - 每个搜索单词必须匹配, 折叠,则非对决得分为0.
- 读者选择的类型 永远不会被相关性压倒.
寻找人们的类型
- 每个字,任何命令.
bike sell发现"卖出我的旧自行车". - (原始内容存档于2018-10-09). Accents and ß fold.
zurich找到"苏黎世",strasse发现"Straße". - 最佳比赛第一. 虽然搜索是积极的,读者没有选择
一种,结果排序 在一个字匹配 -
search.text列表字段 最重要的是,首先, 和如何好: 整个领域,它的开始,一个字的 开始,任何内部。 短语匹配可赚取奖金; 链接保存默认值 秩序。 秩序。 一种读者选择的胜利.?sort=relevance问吧 明确;search: { rank: false }选择列表退出. - SQL也有一条规则.
searchTerms(q)给出折叠的单词; 应用一个likeContains数据库与数组一致. (以同样的方式将一栏打起-unaccent()(原始内容存档于2013-10-12). Postgres
没有停止,没有打字的容忍,没有索引:这是搜索引擎的工作.
它故意不运送的东西
标记,令牌,回放,搜索引擎,或HTTP客户端.
其中9个字节和6个芯片治疗 repos, 几个不同的 目标 一个市场是单色的 设计,一种产品保留了比特币UI的口音颜色,一种是唯一一种 舰队中具有RTL-意识的水面. 舰队已经进行了实验 共享渲染器拥有标记:20个中的2个消费者和 将同样的两个缺陷运入两个无法修复的下游,因为一个消费者 无法补上它没有的标记 .
集中统治;使地方化.
处决引擎也是你的. applyQuery 是内存引擎,用于
分界所收. 一样 ListSpec 描述 SQL 构建器应该做什么
一个大.. escapeLike 财务报告和审定财务报表 likeContains 完全用于此目的.
强制执行一个执行模式 将服务于一个回扣 并拖住其余.
安装
pnpm add @bitbaum/listkit
开发
pnpm install
pnpm run verify # format, lint, typecheck, build, test
测试导入软件包 按名称断了 exports 或者说 files 地图失败
而不是第一个消费者的安装.
麻省理工学院.
部分 位点 开放的AI-本土产品 在苏黎世建造的基础设施。 这里的每个软件包都列出使用该软件的应用程序: 使用 listkit 的应用程序。 。 。 .
Git 发布包括编译 dist/ 不需要消费者准备建造 软件包CI重建后拒绝与承诺输出不匹配,因此消费者可以保留pnpm默认的构建标记限制. 同样的公共出口为Git和npm安装服务.