{"_id":"@anycms/json-query","name":"@anycms/json-query","dist-tags":{"latest":"0.1.1"},"versions":{"0.1.1":{"name":"@anycms/json-query","version":"0.1.1","description":"TypeScript SDK for anycms-sea-orm JSON query engine","keywords":["anycms","json-query","query-builder","typescript","sea-orm"],"license":"MIT","author":{"name":"Liangdi"},"repository":{"type":"git","url":"git+https://git.404.net.cn/anycms-rs/anycms-sea-orm.git","directory":"ts-sdk"},"main":"dist/index.js","types":"dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"}},"scripts":{"build":"tsc","prepublishOnly":"npm run build"},"devDependencies":{"typescript":">=5.0"},"publishConfig":{"access":"public"},"_id":"@anycms/json-query@0.1.1","gitHead":"7cf0b7a5a5ea96db874b6e5a3225ff6cf9258a09","_nodeVersion":"22.16.0","_npmVersion":"10.9.2","dist":{"integrity":"sha512-iCJnXnK2bkLedDAkamEfuheML48BUr42HmyqBag2fUOBL7pZEdnC/IMKV+96jqCFgVgBmUQXK9gHk+rsFu5gEQ==","shasum":"9b2667b0f5e7d84ab5153a70e8d4a1d471182c6d","tarball":"https://registry.npmjs.org/@anycms/json-query/-/json-query-0.1.1.tgz","fileCount":6,"unpackedSize":43115,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIGmZhHuascqWX7atDmvXxlfp46frPnTarRuPbET1d4Z7AiEAi55o+BxR/w83WtA2669ueBcBNMo4R/ToQ2Y7M7WS244="}]},"_npmUser":{"name":"wuliangdi","email":"wu@liangdi.me"},"directories":{},"maintainers":[{"name":"wuliangdi","email":"wu@liangdi.me"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/json-query_0.1.1_1778956844736_0.2330017994186535"},"_hasShrinkwrap":false}},"time":{"created":"2026-05-16T18:40:44.502Z","0.1.1":"2026-05-16T18:40:44.914Z","modified":"2026-05-16T18:40:45.182Z"},"maintainers":[{"name":"wuliangdi","email":"wu@liangdi.me"}],"description":"TypeScript SDK for anycms-sea-orm JSON query engine","keywords":["anycms","json-query","query-builder","typescript","sea-orm"],"repository":{"type":"git","url":"git+https://git.404.net.cn/anycms-rs/anycms-sea-orm.git","directory":"ts-sdk"},"author":{"name":"Liangdi"},"license":"MIT","readme":"# @anycms/json-query\n\nTypeScript SDK for [anycms-sea-orm](https://github.com/liangdi/anycms-sea-orm) JSON query engine.\n\n提供类型安全的查询构建器和通用 API 客户端，与后端 JsonQueryEngine 一一对应，支持 AND/OR 任意嵌套组合。\n\n## 安装\n\n```bash\nnpm install @anycms/json-query\n```\n\n## 使用\n\n### 简单查询\n\n```ts\nimport { QueryBuilder, createEntityApi } from '@anycms/json-query';\n\nconst query = new QueryBuilder()\n  .eq('status', 1)\n  .in('level', [1, 2, 3])\n  .keyword('搜索关键词')\n  .sort('created_time', 'desc')\n  .page(1, 20)\n  .build();\n```\n\n### AND/OR 嵌套\n\n```ts\n// status=1 AND (level=1 OR level=2)\nconst query = new QueryBuilder()\n  .eq('status', 1)\n  .or(b => b.eq('level', 1).eq('level', 2))\n  .build();\n```\n\n### 复杂嵌套\n\n```ts\n// (type=1 AND level>=2) OR (type=2 AND level=3)\nconst query = new QueryBuilder()\n  .orGroup([\n    b => b.eq('type', 1).gte('level', 2),\n    b => b.eq('type', 2).eq('level', 3),\n  ])\n  .build();\n```\n\n### 范围查询\n\n```ts\n// 价格在 100~500 之间\nconst query = new QueryBuilder()\n  .between('price', 100, 500)\n  .build();\n\n// 时间范围\nconst query = new QueryBuilder()\n  .between('created_time', 1700000000, 1800000000)\n  .build();\n```\n\n### 文本过滤\n\n```ts\n// 不包含 \"spam\"\nconst query = new QueryBuilder()\n  .notContains('title', 'spam')\n  .build();\n\n// 空字符串或 NULL\nconst query = new QueryBuilder()\n  .isEmpty('remark')\n  .build();\n\n// 非空且有内容\nconst query = new QueryBuilder()\n  .isNotEmpty('remark')\n  .build();\n```\n\n### 通用实体 API 客户端\n\n```ts\nconst customerApi = createEntityApi<Customer>('/api/customer');\n\n// JsonQuery 查询\nconst result = await customerApi.query(\n  new QueryBuilder().eq('status', 1).page(1, 20).build()\n);\n\n// CRUD\nawait customerApi.create({ name: 'New' });\nawait customerApi.get('id');\nawait customerApi.update('id', { name: 'Updated' });\nawait customerApi.delete('id');\n```\n\n## API 参考\n\n### QueryBuilder\n\n| 方法 | 说明 |\n|------|------|\n| `eq(field, value)` | 等于 |\n| `ne(field, value)` | 不等于 |\n| `gt(field, value)` | 大于 |\n| `gte(field, value)` | 大于等于 |\n| `lt(field, value)` | 小于 |\n| `lte(field, value)` | 小于等于 |\n| `contains(field, value)` | 模糊包含 (LIKE %value%) |\n| `notContains(field, value)` | 不包含 (NOT LIKE %value%) |\n| `startsWith(field, value)` | 前缀匹配 |\n| `endsWith(field, value)` | 后缀匹配 |\n| `in(field, values)` | 在列表中 |\n| `notIn(field, values)` | 不在列表中 |\n| `between(field, min, max)` | 范围查询 |\n| `isNull(field)` | 为空 (IS NULL) |\n| `isNotNull(field)` | 不为空 (IS NOT NULL) |\n| `isEmpty(field)` | 空字符串 (= '' OR IS NULL) |\n| `isNotEmpty(field)` | 非空字符串 (!= '' AND IS NOT NULL) |\n| `keyword(keyword)` | 关键词搜索 |\n| `sort(field, order)` | 排序 (order: 'asc' / 'desc') |\n| `asc(field)` | 升序排序 |\n| `desc(field)` | 降序排序 |\n| `page(page, pageSize)` | 分页 (默认 pageSize=20) |\n| `or(fn)` | 添加 OR 组 |\n| `and(fn)` | 添加 AND 组 |\n| `orGroup(fns)` | 多个 AND 组之间 OR |\n| `build()` | 构建 JsonQuery 对象 |\n\n### createEntityApi\n\n```ts\nconst api = createEntityApi<T>(basePath, options?)\n```\n\n| 方法 | HTTP | 说明 |\n|------|------|------|\n| `query(jsonQuery)` | POST .../query | JSON 动态查询 |\n| `list(params?)` | GET .../list | 简单列表查询 |\n| `get(id)` | GET .../id | 按 ID 获取 |\n| `create(data)` | POST ... | 创建 |\n| `update(id, data)` | PUT .../id | 更新 |\n| `delete(id)` | DELETE .../id | 删除 |\n\n## License\n\nMIT\n","readmeFilename":"README.md","_rev":"1-6a34dc41be4a8373dfe6c90b5fa6695a"}