Files
mr.koi 454e6c51d7 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.
2026-07-31 16:47:39 +08:00

238 lines
7.5 KiB
Markdown

# Migrating from swagger_generator_flutter
[English](MIGRATION.md) | [Chinese (Simplified)](zh-CN/MIGRATION.md)
This guide covers migration from the `generator_config.yaml` conventions used
by `swagger_generator_flutter`. Perform the migration in the consuming
Dart/Flutter repository; no local machine path is assumed.
## Recommended sequence
1. Preserve the old generated output on a separate branch.
2. Copy
[koi_swagger_parser.example.yaml](../koi_swagger_parser.example.yaml) and
migrate only sources, output roots, and response wrapping first.
3. Set `clean_stale_files: false` for the first run and use `--dry-run`.
4. Generate into temporary directories and compare API signatures, JSON keys,
and imports.
5. Migrate enum, naming, and custom type mappings.
6. Run build_runner, `dart analyze`, and the host project's tests.
7. After reviewing the output, switch to the final directories and enable
`clean_stale_files: true`.
## Settings that carry over
| Previous field | New field or behavior |
|---|---|
| `input.swagger_urls` | Same name; strings/objects, `enabled`, local paths, and HTTP(S) sources are supported |
| `output.base_dir/api_dir/models_dir` | Same names |
| `output.included_tags/excluded_tags` | Same names, with glob and regular-expression support |
| `output.split_by_tags` | Same name |
| `generation.api.client.class_name/file_name` | Same names |
| `generation.api.cancel_token_support` | Same name |
| `generation.api.base_result_import` | Compatibility input; selects `external_generic` with `BaseResult` |
| `generation.models.class_prefix` | Same name |
| `generation.models.json_serializable.*` | Same names |
| `generation.models.enum_key_mappings` | Still accepted; migrate toward `enum_mappings` |
| `formatting.run_dart_format` | Same name |
An existing enum mapping does not need to be rewritten immediately:
```yaml
generation:
models:
enum_key_mappings:
TaskType:
- value: 1
name: spotCheck
description: Spot check
```
When both fields map the same wire value, `enum_mappings` wins. The generator
also recognizes `x-enumNames`, `x-enum-varnames`, and `x-enum-values`.
## Settings that need rewriting
### Response wrapper
Previous form:
```yaml
generation:
api:
base_result_type: BaseResult
base_result_import: package:app/network/base_result.dart
```
Recommended form:
```yaml
generation:
api:
response_wrapper:
mode: external_generic
detect_standard_envelope: true
success_data_field: data
external_generic:
import: package:app/network/base_result.dart
class_name: BaseResult
```
There is no automatic one-to-one migration for
`base_page_result_type/base_page_result_import`. Prefer an accurate pagination
schema in OpenAPI. To reuse an existing type, use
`generation.mappings.schemas`, or keep the server envelope in `passthrough`
mode.
### Type and import mappings
Previous top-level `type_mapping` and `imports` values were global. The new
configuration groups validated mappings under `generation.mappings`:
```yaml
generation:
mappings:
schemas:
Money:
type: Money
import: package:money2/money2.dart
types:
string:uuid:
type: UuidValue
import: package:uuid/uuid_value.dart
string:date-time: DateTime
imports:
UuidValue: package:uuid/uuid_value.dart
```
Type lookup tries `type:format` before `type`. A `schemas` entry means that the
schema is completely supplied by an external type and no Dart model is
generated for it.
### Ignored directories and files
The previous `ignored_directories` and `ignored_files` settings skipped files
after rendering and could leave APIs referencing missing models. Replace them
with semantic source filters:
```yaml
output:
excluded_paths:
- /api/v1/legacy/**
excluded_operations:
- regex:^internal
excluded_models:
- Legacy*
```
If a retained operation depends on an excluded model, generation fails with
`filter.required_model_excluded`. There is intentionally no setting that
arbitrarily drops a rendered file.
### Version extraction
Paths such as `/api/v1/` and `/v2/` are grouped automatically. To also try
extracting a version from the source URL:
```yaml
output:
extract_version_from_url: true
```
The previous custom
`generation.api.version_extraction.pattern/default_version` setting has no
one-to-one equivalent. A URL extraction failure produces a diagnostic and
falls back to path-based grouping.
### build_runner
The previous workflow commonly ran build_runner separately. It can now be
part of generation:
```yaml
formatting:
run_dart_format: true
run_build_runner: true
build_runner_mode: build
delete_conflicting_outputs: true
```
For interactive development:
```bash
dart run koi_swagger_parser generate --watch
```
Watch mode is long-running and should not be used for a one-shot CI job.
## Previous settings that are not read
These fields produce a `config.unknown_key` warning:
- `generator.name/version/author/copyright`;
- `input.validate_schema/strict_mode`;
- `output.api_file_suffix/model_file_suffix`;
- `generation.api.use_dio/parser/method_naming`;
- `generation.models.class_naming/field_naming/use_const_constructor`;
- top-level `validation.on_error/on_warning`;
- top-level generic import ordering/grouping settings.
The new generator uses structured errors for cases that would break wire
semantics or compilation. It does not provide a warn/ignore override for those
errors. Unsupported constructs that can be omitted safely, such as callbacks
and links, produce warnings.
## Generated-code differences to review
- A schema with read-only/write-only fields can become `FooRequest` and
`FooResponse`.
- An optional field whose schema disallows null still uses a nullable Dart
argument to represent absence, together with `disallowNullValue`; explicit
JSON null is rejected.
- A root object with `properties` plus `additionalProperties` flattens extras
into the JSON root.
- A `default` response is never treated as successful.
- Complex parameter styles can introduce a public transport adapter and a
private Retrofit delegate.
- API methods can return `HttpResponse<T>`; binary output can use bytes or a
stream.
- Generated enums include wire conversion, and unknown fallback uses an
internal sentinel wire value.
- Stale files are removed only through manifest ownership; a user-modified
stale file is preserved.
## CLI comparison
Previous:
```bash
dart run swagger_generator_flutter generate --all
```
New:
```bash
dart run koi_swagger_parser generate --all
dart run koi_swagger_parser generate --dry-run --verbose
```
Previous `--api`, `--models`, `--docs`, and CLI tag overrides are not retained.
Use `generation.*.enabled` and output filters. The current generator does not
emit a separate API documentation site.
## Acceptance checklist
- The dry run has no error diagnostics.
- Enum wire values and Dart member names match the previous contract.
- Request/response directional models contain the expected fields.
- Cookie, query, and path serialization produces equivalent requests.
- Error and default responses are not decoded as successful responses.
- External custom types have correct imports and JSON conversion.
- `dart run build_runner build --delete-conflicting-outputs` succeeds.
- `dart analyze` and host-project tests pass.
- The second generation reports `lifecycle.unchanged_skipped`.
- Removing an operation deletes only unmodified files owned by the manifest.
For every available backend fixture, compare runtime serialization in addition
to generated source text.