Release 0.2.0

Complete OpenAPI 3.0/3.1 generation, diagnostics, lifecycle safety, enum and naming mappings, bilingual documentation, examples, and pub.dev release validation.
This commit is contained in:
mr.koi
2026-07-31 16:47:39 +08:00
parent ea93f09154
commit 454e6c51d7
56 changed files with 14506 additions and 491 deletions
+254
View File
@@ -0,0 +1,254 @@
# 配置参考
[English](../CONFIGURATION.md) | [简体中文](CONFIGURATION.md)
`koi_swagger_parser` 使用 YAML 配置。完整注释示例见
[koi_swagger_parser.example.yaml](../../koi_swagger_parser.example.yaml)。
未知字段会产生 `config.unknown_key`;非法 scalar 类型和非法组合会在 OpenAPI
解析前报错。
## 查找顺序与路径语义
未传入 `--config` 时,加载器按以下顺序在工作目录查找:
1. `koi_swagger_parser.yaml`
2. `koi_swagger_parser.yml`
3. `generator_config.yaml`
4. `generator_config.yml`
所有相对 OpenAPI 文件 source、输出目录和显式 manifest 路径都以所选配置文件的
目录为基准。未找到配置文件时,以命令调用目录为基准。
显式传入配置文件且未指定 `--cwd` 时,其目录也会成为 build_runner 使用的宿主
项目工作目录。`--cwd` 可覆盖命令工作目录,但不会重新解释配置中的相对路径。
HTTP(S) source URL 保持 URL 语义。
## 顶层字段
| 字段 | 类型 | 必填 | 默认值 |
|---|---|---:|---|
| `input` | map | 是 | 无 |
| `output` | map | 否 | 见下文 |
| `generation` | map | 否 | 见下文 |
| `formatting` | map | 否 | 见下文 |
必须至少配置一个启用的 `input.swagger_urls` 项。
## `input`
### `input.swagger_urls`
类型:字符串或 source 对象的列表。默认:空,会报错。
```yaml
input:
swagger_urls:
- ./openapi.yaml
- url: https://example.com/openapi.json
enabled: true
- url: ./experimental.yaml
enabled: false
```
source 对象字段:
| 字段 | 类型 | 必填 | 默认值 | 含义 |
|---|---|---:|---|---|
| `url` | string | 是 | 无 | 本地路径、file URL 或 HTTP(S) URL |
| `enabled` | boolean | 否 | `true` | 是否参与生成 |
source 按配置顺序处理。多个根文档会确定性合并;operation 冲突报错,component
冲突会确定性改名并产生诊断。
## `output`
| 字段 | 类型 | 默认值 | 含义 |
|---|---|---|---|
| `base_dir` | string path | `./lib/src` | 生成代码公共根 |
| `api_dir` | string path | `<base_dir>/api` | API 输出根 |
| `models_dir` | string path | `<base_dir>/api_models` | model 输出根 |
| `included_tags` | string list | 未设置 | 包含匹配 tag 的 operation |
| `excluded_tags` | string list | 未设置 | 排除匹配 tag 的 operation |
| `included_paths` | string list | 未设置 | 包含匹配的 OpenAPI path |
| `excluded_paths` | string list | 未设置 | 排除匹配的 OpenAPI path |
| `included_operations` | string list | 未设置 | 包含匹配 operation |
| `excluded_operations` | string list | 未设置 | 排除匹配 operation |
| `included_models` | string list | 未设置 | 把匹配 schema 加为生成根 |
| `excluded_models` | string list | 未设置 | 排除匹配 model |
| `split_by_tags` | boolean | `true` | 按 operation tag 拆分 API 文件 |
| `extract_version_from_url` | boolean | `false` | 尝试从 source URL 提取分组版本 |
| `clean_stale_files` | boolean | `true` | 安全删除不再生成的自有文件 |
| `skip_if_unchanged` | boolean | `true` | spec、config 和内容未变时跳过写入 |
| `manifest_path` | string path | `<project>/.dart_tool/koi_swagger_parser/manifest.json` | 所有权/hash manifest |
过滤项支持:
- 精确字符串;
- `*`、`?`、`**` glob;
- `regex:<expression>`,使用 Dart 正则语法。
同一值同时匹配 include/exclude 时,exclude 优先;相同字面量同时出现在两边会
产生 warning。若保留的 operation 依赖被排除 model,生成会失败,不会输出无法
编译的客户端。
stale cleanup 仅处理旧 manifest 记录、仍位于当前 API/model 根、且内容仍匹配
旧 hash 的文件。manifest 应放在生成的 API/model 根之外。
## `generation.preset`
| 字段 | 类型 | 默认值 | 可选值 |
|---|---|---|---|
| `name` | string | `koi_flutter` | `koi_flutter` |
当前版本只有一个 renderer preset:Dio + Retrofit API 和
Freezed/json_serializable model。
## `generation.api`
| 字段 | 类型 | 默认值 | 可选值/含义 |
|---|---|---|---|
| `enabled` | boolean | `true` | 生成 API |
| `use_retrofit` | boolean | `true` | 启用 API 时必须为 `true` |
| `cancel_token_support` | boolean | `false` | 添加 Dio `CancelToken` 参数 |
| `response_mode` | string | `body` | `body`、`http_response` |
| `binary_response_mode` | string | `bytes` | `bytes`、`stream` |
`generation.api.enabled: true` 要求 `generation.models.enabled: true`,因为
当前 Retrofit renderer 会导入生成的 model index。
### `generation.api.client`
| 字段 | 类型 | 默认值 | 含义 |
|---|---|---|---|
| `class_name` | string | `ApiClient` | 生成的 client class 名 |
| `file_name` | string | `api_client` | 生成的 client 文件名 |
值会转换为安全的 Dart identifier/file name。
### `generation.api.response_wrapper`
| 字段 | 类型 | 默认值 | 可选值/含义 |
|---|---|---|---|
| `mode` | string | `passthrough` | `passthrough`、`external_generic` |
| `success_data_field` | string | `data` | envelope 中的成功 payload 字段 |
| `detect_standard_envelope` | boolean | `true` | 检测配置的 code/message/data 风格 envelope |
| `external_generic.import` | string | 无 | `external_generic` 模式必填 |
| `external_generic.class_name` | string | `BaseResult` | 外部 generic wrapper 类型 |
```yaml
generation:
api:
response_wrapper:
mode: external_generic
success_data_field: data
detect_standard_envelope: true
external_generic:
import: package:your_network/your_network.dart
class_name: BaseResult
```
兼容字段 `generation.api.base_result_import` 会在未显式设置 mode 时选择
`external_generic`,class name 为 `BaseResult`。新配置应优先使用结构化写法。
## `generation.models`
| 字段 | 类型 | 默认值 | 含义 |
|---|---|---|---|
| `enabled` | boolean | `true` | 生成 model |
| `class_prefix` | string | `Koi` | 生成 model 名称前缀 |
| `default_non_nullable_list_to_empty` | boolean | `true` | 符合条件的非空 list 默认使用空 list |
| `enum_unknown_fallback` | boolean | `false` | 生成并使用 `unknown` enum 成员 |
| `enum_unknown_default_case` | boolean | `false` | 上一字段的兼容别名 |
### `generation.models.json_serializable`
| 字段 | 类型 | 默认值 |
|---|---|---|
| `checked` | boolean | `true` |
| `explicit_to_json` | boolean | `true` |
| `include_if_null` | boolean | `false` |
这些值会在适用场景传给生成的 json_serializable annotation。
### Enum 映射
支持 list 和 map 两种写法:
```yaml
generation:
models:
enum_mappings:
OrderStatus:
- value: pending
name: waitingForPayment
description: 等待付款
- value: done
name: completed
Priority:
1: low
2:
name: high
description: 需要关注
```
外层 key 是 OpenAPI enum/schema 名称。wire `value` 可以是 string、number 或
boolean;`name` 必须是非空 Dart 成员名;`description` 可选。
兼容字段 `enum_key_mappings` 接受同样结构。两个字段映射同一 enum value 时,
`enum_mappings` 优先并产生 warning。vendor extension 优先级见
[README 的 Enum 映射](../../README.zh-CN.md#enum-映射)。
## `generation.mappings`
所有 mapping 段默认都是空 map。
| 字段 | 结构 | 含义 |
|---|---|---|
| `models` | `schema: DartName` | 重命名生成的 component model |
| `properties` | `schema: {wireProperty: dartField}` | 重命名指定 schema 的属性 |
| `parameters` | `operation: {wireParameter: dartParameter}` | 重命名指定 operation 的参数 |
| `operations` | `operation: dartMethod` | 重命名 operation |
| `schemas` | `schema: type-or-object` | 使用外部 Dart 类型,不生成该 schema |
| `types` | `openapiType[:format]: type-or-object` | 映射 OpenAPI scalar/type pattern |
| `imports` | `DartType: packageImport` | 为映射后的 Dart 类型提供 import |
operation key 可以是 `operationId` 或 `METHOD /path`。type mapping 先尝试
`type:format`,再尝试 `type`。
type-or-object 可以是 Dart 类型字符串,也可以是:
```yaml
type: UuidValue
import: package:uuid/uuid_value.dart
```
同一 mapping scope 内,两个 source name 不能指向同一个 Dart 名。相同 schema
不能同时出现在 `models` 和 `schemas`。同一个 Dart 类型不能解析出冲突 import。
这些组合都会报配置错误。
## `formatting`
| 字段 | 类型 | 默认值 | 可选值/含义 |
|---|---|---|---|
| `run_dart_fix` | boolean | `false` | 对本轮改变的主生成文件执行 `dart fix --apply` |
| `run_dart_format` | boolean | `true` | 格式化本轮改变的主生成文件 |
| `run_build_runner` | boolean | `false` | 主文件写入后运行 build_runner |
| `build_runner_mode` | string | `build` | `build`、`watch` |
| `delete_conflicting_outputs` | boolean | `true` | 向 build_runner 传入 `--delete-conflicting-outputs` |
CLI `--watch` 会在非 dry-run 生成后启动 build_runner watch,不受配置 mode
限制。watch 是长驻流程,适合交互式开发,不适合一次性 CI job。
## 组合规则
加载器会强制以下关系:
- API 和 model 不能同时关闭;
- API 当前依赖 model;
- API 当前要求 `use_retrofit: true`;
- `external_generic` response wrapper 需要非空 import;
- 未知 preset、enum/response/build-runner mode 会报错;
- 非法 filter 正则会报错;
- mapping target/import 冲突会报错。
稳定 code 和处理方式见[诊断参考](DIAGNOSTICS.md)。