Complete OpenAPI 3.0/3.1 generation, diagnostics, lifecycle safety, enum and naming mappings, bilingual documentation, examples, and pub.dev release validation.
238 lines
7.5 KiB
Markdown
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.
|