Complete OpenAPI 3.0/3.1 generation, diagnostics, lifecycle safety, enum and naming mappings, bilingual documentation, examples, and pub.dev release validation.
270 lines
10 KiB
Markdown
270 lines
10 KiB
Markdown
# Configuration reference
|
|
|
|
[English](CONFIGURATION.md) | [Chinese (Simplified)](zh-CN/CONFIGURATION.md)
|
|
|
|
`koi_swagger_parser` reads YAML configuration. The complete commented example
|
|
is [koi_swagger_parser.example.yaml](../koi_swagger_parser.example.yaml).
|
|
Unknown keys produce `config.unknown_key`; invalid scalar types and invalid
|
|
combinations produce errors before OpenAPI parsing starts.
|
|
|
|
## Discovery and path semantics
|
|
|
|
Without `--config`, the loader searches the working directory in this order:
|
|
|
|
1. `koi_swagger_parser.yaml`
|
|
2. `koi_swagger_parser.yml`
|
|
3. `generator_config.yaml`
|
|
4. `generator_config.yml`
|
|
|
|
All relative OpenAPI file sources, output directories, and explicit manifest
|
|
paths are resolved against the directory containing the selected
|
|
configuration file. If no configuration file is found, they are resolved
|
|
against the invocation directory.
|
|
|
|
When an explicit configuration file is supplied and `--cwd` is omitted, its
|
|
directory is also the host-project working directory used for build_runner.
|
|
`--cwd` overrides that command working directory but does not rebase relative
|
|
configuration paths. HTTP(S) source URLs remain URLs.
|
|
|
|
## Top-level sections
|
|
|
|
| Field | Type | Required | Default |
|
|
|---|---|---:|---|
|
|
| `input` | map | yes | none |
|
|
| `output` | map | no | defaults below |
|
|
| `generation` | map | no | defaults below |
|
|
| `formatting` | map | no | defaults below |
|
|
|
|
At least one enabled `input.swagger_urls` entry is required.
|
|
|
|
## `input`
|
|
|
|
### `input.swagger_urls`
|
|
|
|
Type: list of strings or source objects. Default: empty, which is an error.
|
|
|
|
```yaml
|
|
input:
|
|
swagger_urls:
|
|
- ./openapi.yaml
|
|
- url: https://example.com/openapi.json
|
|
enabled: true
|
|
- url: ./experimental.yaml
|
|
enabled: false
|
|
```
|
|
|
|
Each source object accepts:
|
|
|
|
| Field | Type | Required | Default | Meaning |
|
|
|---|---|---:|---|---|
|
|
| `url` | string | yes | none | Local path, file URL, or HTTP(S) URL |
|
|
| `enabled` | boolean | no | `true` | Whether the source participates |
|
|
|
|
Sources are processed in configuration order. Multiple roots are merged
|
|
deterministically; conflicting operations are errors and conflicting
|
|
components are renamed with diagnostics.
|
|
|
|
## `output`
|
|
|
|
| Field | Type | Default | Meaning |
|
|
|---|---|---|---|
|
|
| `base_dir` | string path | `./lib/src` | Common generated-code base |
|
|
| `api_dir` | string path | `<base_dir>/api` | Generated API root |
|
|
| `models_dir` | string path | `<base_dir>/api_models` | Generated model root |
|
|
| `included_tags` | string list | unset | Include matching operation tags |
|
|
| `excluded_tags` | string list | unset | Exclude matching operation tags |
|
|
| `included_paths` | string list | unset | Include matching OpenAPI paths |
|
|
| `excluded_paths` | string list | unset | Exclude matching OpenAPI paths |
|
|
| `included_operations` | string list | unset | Include matching operations |
|
|
| `excluded_operations` | string list | unset | Exclude matching operations |
|
|
| `included_models` | string list | unset | Add matching schemas as roots |
|
|
| `excluded_models` | string list | unset | Exclude matching models |
|
|
| `split_by_tags` | boolean | `true` | Split API files by operation tag |
|
|
| `extract_version_from_url` | boolean | `false` | Try to derive grouping version from a source URL |
|
|
| `clean_stale_files` | boolean | `true` | Safely remove obsolete owned files |
|
|
| `skip_if_unchanged` | boolean | `true` | Skip writes when spec, config, and content are unchanged |
|
|
| `manifest_path` | string path | `<project>/.dart_tool/koi_swagger_parser/manifest.json` | Ownership/hash manifest |
|
|
|
|
Filter entries accept:
|
|
|
|
- an exact string;
|
|
- `*`, `?`, and `**` glob syntax;
|
|
- `regex:<expression>`, using Dart regular-expression syntax.
|
|
|
|
An exclusion wins when the same value matches include and exclude rules.
|
|
Putting the same literal in both lists produces a warning. If an included
|
|
operation requires an excluded model, generation fails instead of emitting an
|
|
uncompilable client.
|
|
|
|
Stale cleanup is limited to files recorded in the previous manifest, inside
|
|
the current API/model roots, with content that still matches the previous
|
|
hash. Keep the manifest outside the generated API/model roots.
|
|
|
|
## `generation.preset`
|
|
|
|
| Field | Type | Default | Allowed values |
|
|
|---|---|---|---|
|
|
| `name` | string | `koi_flutter` | `koi_flutter` |
|
|
|
|
The current release has one renderer preset: Dio + Retrofit APIs and
|
|
Freezed/json_serializable models.
|
|
|
|
## `generation.api`
|
|
|
|
| Field | Type | Default | Allowed values / meaning |
|
|
|---|---|---|---|
|
|
| `enabled` | boolean | `true` | Generate API files |
|
|
| `use_retrofit` | boolean | `true` | Must remain `true` when API generation is enabled |
|
|
| `cancel_token_support` | boolean | `false` | Add Dio `CancelToken` parameters |
|
|
| `response_mode` | string | `body` | `body`, `http_response` |
|
|
| `binary_response_mode` | string | `bytes` | `bytes`, `stream` |
|
|
|
|
`generation.api.enabled: true` requires
|
|
`generation.models.enabled: true`, because the current Retrofit renderer
|
|
imports the generated model index.
|
|
|
|
### `generation.api.client`
|
|
|
|
| Field | Type | Default | Meaning |
|
|
|---|---|---|---|
|
|
| `class_name` | string | `ApiClient` | Generated client class name |
|
|
| `file_name` | string | `api_client` | Generated client file stem |
|
|
|
|
Values are converted to safe Dart identifiers/file names.
|
|
|
|
### `generation.api.response_wrapper`
|
|
|
|
| Field | Type | Default | Allowed values / meaning |
|
|
|---|---|---|---|
|
|
| `mode` | string | `passthrough` | `passthrough`, `external_generic` |
|
|
| `success_data_field` | string | `data` | Envelope field containing the success payload |
|
|
| `detect_standard_envelope` | boolean | `true` | Detect configured code/message/data-style envelopes |
|
|
| `external_generic.import` | string | none | Required in `external_generic` mode |
|
|
| `external_generic.class_name` | string | `BaseResult` | External generic wrapper type |
|
|
|
|
Example:
|
|
|
|
```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
|
|
```
|
|
|
|
The legacy `generation.api.base_result_import` key selects
|
|
`external_generic` with class name `BaseResult` when no explicit mode is set.
|
|
Prefer the structured form for new configurations.
|
|
|
|
## `generation.models`
|
|
|
|
| Field | Type | Default | Meaning |
|
|
|---|---|---|---|
|
|
| `enabled` | boolean | `true` | Generate model files |
|
|
| `class_prefix` | string | `Koi` | Prefix for generated model names |
|
|
| `default_non_nullable_list_to_empty` | boolean | `true` | Default eligible non-nullable list values to an empty list |
|
|
| `enum_unknown_fallback` | boolean | `false` | Generate and use an `unknown` enum member |
|
|
| `enum_unknown_default_case` | boolean | `false` | Legacy alias for `enum_unknown_fallback` |
|
|
|
|
### `generation.models.json_serializable`
|
|
|
|
| Field | Type | Default |
|
|
|---|---|---|
|
|
| `checked` | boolean | `true` |
|
|
| `explicit_to_json` | boolean | `true` |
|
|
| `include_if_null` | boolean | `false` |
|
|
|
|
These values are forwarded to generated json_serializable annotations where
|
|
applicable.
|
|
|
|
### Enum mappings
|
|
|
|
Both list and map forms are accepted:
|
|
|
|
```yaml
|
|
generation:
|
|
models:
|
|
enum_mappings:
|
|
OrderStatus:
|
|
- value: pending
|
|
name: waitingForPayment
|
|
description: Waiting for payment
|
|
- value: done
|
|
name: completed
|
|
Priority:
|
|
1: low
|
|
2:
|
|
name: high
|
|
description: Requires attention
|
|
```
|
|
|
|
The outer key is the OpenAPI enum/schema name. A wire `value` may be a string,
|
|
number, or boolean; `name` must be a non-empty Dart member name.
|
|
`description` is optional.
|
|
|
|
`enum_key_mappings` accepts the same shape for compatibility. When both fields
|
|
map the same enum value, `enum_mappings` wins and a warning is emitted. See
|
|
[Enum mappings in the README](../README.md#enum-mappings) for vendor-extension
|
|
precedence.
|
|
|
|
## `generation.mappings`
|
|
|
|
All mapping sections default to an empty map.
|
|
|
|
| Field | Shape | Meaning |
|
|
|---|---|---|
|
|
| `models` | `schema: DartName` | Rename generated component models |
|
|
| `properties` | `schema: {wireProperty: dartField}` | Rename properties within one schema |
|
|
| `parameters` | `operation: {wireParameter: dartParameter}` | Rename parameters within one operation |
|
|
| `operations` | `operation: dartMethod` | Rename operations |
|
|
| `schemas` | `schema: type-or-object` | Reuse an external Dart type instead of generating the schema |
|
|
| `types` | `openapiType[:format]: type-or-object` | Map an OpenAPI scalar/type pattern |
|
|
| `imports` | `DartType: packageImport` | Supply imports for mapped Dart types |
|
|
|
|
Operation keys may be an `operationId` or `METHOD /path`. Type mappings try
|
|
`type:format` before `type`.
|
|
|
|
A type-or-object value is either a Dart type string or:
|
|
|
|
```yaml
|
|
type: UuidValue
|
|
import: package:uuid/uuid_value.dart
|
|
```
|
|
|
|
Within one mapping scope, two source names cannot target the same Dart name.
|
|
The same schema cannot appear in both `models` and `schemas`. A Dart type
|
|
cannot resolve to conflicting imports. These combinations are configuration
|
|
errors.
|
|
|
|
## `formatting`
|
|
|
|
| Field | Type | Default | Allowed values / meaning |
|
|
|---|---|---|---|
|
|
| `run_dart_fix` | boolean | `false` | Run `dart fix --apply` on changed primary generated files |
|
|
| `run_dart_format` | boolean | `true` | Format changed primary generated files |
|
|
| `run_build_runner` | boolean | `false` | Run build_runner after the primary write |
|
|
| `build_runner_mode` | string | `build` | `build`, `watch` |
|
|
| `delete_conflicting_outputs` | boolean | `true` | Pass `--delete-conflicting-outputs` to build_runner |
|
|
|
|
The CLI `--watch` flag starts build_runner watch after a non-dry generation,
|
|
regardless of the configured build_runner mode. Watch mode is long-running and
|
|
is intended for interactive development rather than one-shot CI jobs.
|
|
|
|
## Combination rules
|
|
|
|
The loader enforces these relationships:
|
|
|
|
- API and model generation cannot both be disabled.
|
|
- API generation currently requires model generation.
|
|
- API generation currently requires `use_retrofit: true`.
|
|
- `external_generic` response wrapping requires a non-empty import.
|
|
- Unknown preset and enum/response/build-runner mode values are errors.
|
|
- Invalid filter regular expressions are errors.
|
|
- Mapping target/import conflicts are errors.
|
|
|
|
See [Diagnostics](DIAGNOSTICS.md) for stable codes and remediation guidance.
|