# trans-form-middleware — Design (Q1–Q61) Status: **implementation scaffold** (v0.1.0) Companion package: `@windychen/trans-form-component` (Vue 3 dynamic query form). ## Role Receive component filter output → structured `{ field, query, op, value, logic?, values?, empty? }[]`. **No SQL generation.** ## Key decisions | # | Decision | |---|----------| | 1–2 | Node.js pure JS; structured filters only | | 8 | Dual fields: `query` (code) + `op` (symbol) | | 14 | `mode`: pass-through (default) / flat / tree | | 24–25 | Zero deps; ESM only; no bundling (`src/index.js`) | | 38 | `empty: true` preserved by default | | 39 | Built-in `DEFAULT_OPERATOR_MAP`, merge via `operatorMap` | | 41 | Multi-function exports: `parseFilters`, `toTree`, `mapOperators`, … | | 44 | `strict` default false | | 46 | Multi-value: `value` (string) + `values` (parsed array) | | 49–50 | `allowedFields` required; `unknownField: 'error'` default | | 60 | Component emits all state flags; middleware skips `disabled` by default | | 61 | Also skips `hidden`; `skipEmpty` option controls empty items | ## Output example ```json [ { "field": "tags", "query": "IN", "op": "IN", "value": "a,b,c", "values": ["a", "b", "c"], "logic": "OR" } ] ``` ## Operator map `EQ→=`, `NE→<>`, `GT→>`, `GTE→>=`, `LT→<`, `LTE→<=`, `LIKE→LIKE`, `IN→IN`, `NOT_IN→NOT IN`, `BETWEEN→BETWEEN`, `IS_NULL→IS NULL`, `IS_NOT_NULL→IS NOT NULL` ## CI Copy of windychen-utils pattern: commit message must contain `chore` + `版本` + `更新` to trigger publish.