windychen
  • Joined on 2026-05-26

@windychen/trans-form-typeorm (0.1.1)

Published 2026-08-07 11:36:18 +08:00 by windychen

Installation

@windychen:registry=https://gitea.windychen00n.work/api/packages/windychen/npm/
npm install @windychen/trans-form-typeorm@0.1.1
"@windychen/trans-form-typeorm": "0.1.1"

About this package

@windychen/trans-form-typeorm

TypeORM 适配包:把 @windychen/trans-form-middleware 解析出的结构化过滤器转为 FindOptionsWhere(对象式查询)或 QueryBuilder 条件(支持嵌套分组)。

版本 0.1.0 — 首个可发布版本:toFindOptionsWhere / applyToQueryBuilder,覆盖 EQ/NE/GT/GTE/LT/LTE/LIKE/IN/NOT_IN/BETWEEN/IS_NULL/IS_NOT_NULL 全部操作符。

安装

npm install @windychen/trans-form-typeorm typeorm

用法

import { parseFilters } from '@windychen/trans-form-middleware';
import { toFindOptionsWhere, applyToQueryBuilder } from '@windychen/trans-form-typeorm';

// 1. middleware 解析
const filters = parseFilters(
  [
    { field: 'name', value: 'xx', query: 'EQ' },
    { field: 'tags', value: 'a,b', query: 'IN', logic: 'OR' },
    { field: 'created', value: '2024-01-01,2024-12-31', query: 'BETWEEN', logic: 'AND' },
  ],
  { allowedFields: ['name', 'tags', 'created'] },
);

// 2a. FindOptionsWhere(repository.find)
const where = toFindOptionsWhere(filters);
// [{ name: Equal('xx') }, { tags: In(['a','b']), created: Between('2024-01-01','2024-12-31') }]
await repo.find({ where });

// 2b. QueryBuilder(支持嵌套分组)
const { qb, parameters } = applyToQueryBuilder(repo.createQueryBuilder('u'), filters, { alias: 'u' });
// u.name = :p1 OR (u.tags IN (:...p2) AND u.created BETWEEN :p3 AND :p4)

API

函数 说明
toFindOptionsWhere(filters, options?) → FindOptionsWhere[]。支持深层 OR 嵌套(递归 + 分配律展开):AND 项合并进同一对象,OR 项拆成数组元素,X AND (A OR B) 自动展开为 [{X,A},{X,B}]
applyToQueryBuilder(qb, filters, options?) → { qb, parameters }。支持嵌套分组括号表达式、参数绑定、alias 前缀
mapOperator(query, operatorMap?) 操作符码 → 工厂函数
DEFAULT_OPERATOR_MAP 默认操作符映射表

深层 OR 嵌套(toFindOptionsWhere)

输入支持 toTree 输出的嵌套结构({ logic, children }),自动展开:

逻辑 输出
A OR B [{A}, {B}]
X AND (A OR B) [{X,A}, {X,B}](分配律)
(A OR B) AND (C OR D) [{A,C},{A,D},{B,C},{B,D}](笛卡尔积)
A OR (B AND C) [{A}, {B,C}]
同字段 AND(name='a' AND name LIKE 'b') And(Equal('a'), Like('b'))

注意:分配律展开在最坏情况下呈指数增长(每组 OR 分支相乘)。实际查询条件数量有限,可放心使用;极端复杂的布尔树建议走 applyToQueryBuilder(括号表达式,无展开成本)。

选项

toFindOptionsWhere:{ skipFlags = ['disabled','hidden'], skipEmpty = false, operatorMap }

applyToQueryBuilder:{ skipFlags = ['disabled','hidden'], skipEmpty = false, operatorMap, alias = '', paramPrefix = 'p', method = 'andWhere' }

  • method: 'where' | 'andWhere' | 'orWhere',首条件挂载方式
  • 空 value 且非 IS_NULL/IS_NOT_NULL 的条件自动跳过;LIKE 值自动加 %

操作符映射

query FindOptionsWhere SQL
EQ Equal(v) = :p
NE Not(Equal(v)) <> :p
GT MoreThan(v) > :p
GTE MoreThanOrEqual(v) >= :p
LT LessThan(v) < :p
LTE LessThanOrEqual(v) <= :p
LIKE Like(v) LIKE :p(自动加 %)
IN In(values) IN (:...p)
NOT_IN Not(In(values)) NOT IN (:...p)
BETWEEN Between(a, b) BETWEEN :p1 AND :p2
IS_NULL IsNull() IS NULL
IS_NOT_NULL Not(IsNull()) IS NOT NULL

依赖

零运行时依赖;typeorm 为 peerDependency(^0.3.0)。

相关包

  • @windychen/trans-form-component — Vue 3 动态查询表单(schema 入 → filters 出)
  • @windychen/trans-form-middleware — 结构化过滤器解析(不碰 SQL)

Dependencies

Dependencies

ID Version
better-sqlite3 ^12.11.1

Development Dependencies

ID Version
typeorm ^0.3.20
vitest ^3.2.4

Peer Dependencies

ID Version
typeorm ^0.3.0

Keywords

typeorm filter query trans-form adapter
Details
npm
2026-08-07 11:36:18 +08:00
2
MIT
6.1 KiB
Assets (1)
Versions (3) View all
0.1.2 2026-08-07
0.1.1 2026-08-07
0.1.0 2026-08-07