From 7a25eb1029ae457a01951f4d2a8a66fb4e579fde Mon Sep 17 00:00:00 2001 From: "Graciliano M. P." Date: Wed, 12 Aug 2026 05:31:19 -0300 Subject: [PATCH 1/7] fix: compare against a null parameter with IS NULL MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit A condition comparing a field to null passed as a *parameter* was encoded as `field = ?` bound to null. `= NULL` is never true in SQL, so the query returned no rows rather than the rows whose column is null. `ConditionSQLEncoder` already converted `=`/`IN` against null into `IS NULL`, and `!=`/`NOT IN` into `IS NOT NULL` — but only when the null was written straight into the statement. A null arriving as a parameter is encoded as a placeholder, whose text never equals 'null', so the conversion was skipped. Entity queries take the parameter form, which is where this shows up: selectByQuery(' state == ? && active == ? ', parameters: {'state': null, 'active': true}); SELECT ... WHERE ( "state" = ? AND "active" = ? ) -- [null, true] The encoder is shared, so this affected SQLite, PostgreSQL and MySQL alike, and any compound condition containing such a term — a matching half cannot rescue a half that never matches. `encodeConditionValuesWithOperator` now inspects the encoding value rather than its text: `EncodingValueNull` as before, and an `EncodingPlaceholder` whose value in the context is null. Neither writes the placeholder, so the statement carries no parameter for it. The regression test lives in the shared adapter suite, so all three adapters exercise it. Reverting the fix with the test in place fails 14 of the SQLite suite's cases; with it, all 91 pass. Co-Authored-By: Claude Opus 5 (1M context) --- CHANGELOG.md | 26 ++++++++++++++ lib/src/bones_api_condition_sql.dart | 36 ++++++++++++++++--- pubspec.yaml | 2 +- test/bones_api_entity_db_tests_base.dart | 46 ++++++++++++++++++++++++ 4 files changed, 105 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5c4a94a..aa50875 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,29 @@ +## 1.15.1 + +- Fixed: a condition comparing a field to `null` **passed as a parameter** was + encoded as `field = ?` bound to `null`. `= NULL` is never true in SQL, so the + query returned no rows instead of the rows whose column is null. + + `ConditionSQLEncoder` did turn `=`/`IN` against null into `IS NULL` (and + `!=`/`NOT IN` into `IS NOT NULL`), but only when the null was written + straight into the statement. A null arriving as a parameter is encoded as a + placeholder, whose text never equals `'null'`, so the conversion was skipped. + Entity queries take the parameter form, which is why it surfaced there: + + ```dart + // Returned [] with matching rows present; now returns the rows whose + // `state` is null. + repository.selectByQuery(' state == ? && active == ? ', + parameters: {'state': null, 'active': true}); + ``` + + The encoder is shared, so this affected every SQL adapter — SQLite, + PostgreSQL and MySQL alike — and any condition compared against a null + parameter, including compound ones whose other terms matched. + + Covered now by the shared adapter test suite, so all three adapters exercise + it. + ## 1.15.0 - Faster request dispatch. A logged route call is **~2.9x** faster diff --git a/lib/src/bones_api_condition_sql.dart b/lib/src/bones_api_condition_sql.dart index bc1e7d9..d33b024 100644 --- a/lib/src/bones_api_condition_sql.dart +++ b/lib/src/bones_api_condition_sql.dart @@ -253,7 +253,10 @@ class ConditionSQLEncoder extends ConditionEncoder { context.write(tableKey); context.write(' '); - var valueSQLRet = valueToSQL( + // The encoding value rather than only its text: a null supplied as a + // parameter encodes to a placeholder, so the text alone cannot say whether + // the comparison is against null. + var valueRet = valueToParameterValue( context, values, fieldKey: fieldKey, @@ -261,8 +264,8 @@ class ConditionSQLEncoder extends ConditionEncoder { valueAsList: valueAsList, ); - return valueSQLRet.resolveMapped((valueSQL) { - if (valueSQL == 'null') { + return valueRet.resolveMapped((value) { + if (isNullEncodingValue(value, context)) { switch (operator) { case '=': case 'IN': @@ -281,12 +284,37 @@ class ConditionSQLEncoder extends ConditionEncoder { context.write(operator); context.write(' '); - context.write(valueSQL); + context.write(value.encode); context.write(' '); return context; }); } + /// Whether [value] is a comparison against SQL `NULL`. + /// + /// A null written straight into the statement arrives as an + /// [EncodingValueNull], which is the case this encoder has always handled. A + /// null supplied as a *parameter* arrives as an [EncodingPlaceholder]: its + /// text is the placeholder and the value itself is held in the context, so + /// it has to be looked up there. + /// + /// Missing that produced `field = ?` bound to null. `= NULL` is never true + /// in SQL, so such a query returned nothing at all rather than the rows whose + /// column is null. + bool isNullEncodingValue( + EncodingValue value, + EncodingContext context, + ) { + if (value is EncodingValueNull) return true; + + if (value is EncodingPlaceholder) { + // Absent and present-but-null both mean the statement binds null. + return context.parametersPlaceholders[value.key] == null; + } + + return false; + } + FutureOr> keyToSQL( KeyCondition c, EncodingContext context, diff --git a/pubspec.yaml b/pubspec.yaml index 795943f..acde0df 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,6 +1,6 @@ name: bones_api description: Bones_API - A powerful API backend framework for Dart. It comes with a built-in HTTP Server, route handler, entity handler, SQL translator, and DB adapters. -version: 1.15.0 +version: 1.15.1 homepage: https://github.com/Colossus-Services/bones_api environment: diff --git a/test/bones_api_entity_db_tests_base.dart b/test/bones_api_entity_db_tests_base.dart index ca2e86f..13ff905 100644 --- a/test/bones_api_entity_db_tests_base.dart +++ b/test/bones_api_entity_db_tests_base.dart @@ -1384,6 +1384,52 @@ Future runAdapterTests( expect(user4?.id, equals(user3.id)); } + { + // A null supplied as a parameter must become `IS NULL`, not `= ?` + // bound to null — which is never true in SQL, so the query + // silently returned nothing instead of the rows whose column is + // null. An inlined null was already handled; passing it as a + // parameter was not, and that is the form entity queries take. + var nullLevel = await userAPIRepository.selectByQuery( + " level == ? ", + parameters: {'level': null}, + ); + + expect( + nullLevel, + isNotEmpty, + reason: 'there are users with no level', + ); + expect( + nullLevel.map((e) => e.level), + everyElement(isNull), + reason: 'a null parameter must select the rows that are null', + ); + + // Compounded with another term — the shape that made this visible, + // since a true half cannot rescue a half that never matches. + var nullLevelCompound = await userAPIRepository.selectByQuery( + " level == ? && email != ? ", + parameters: {'level': null, 'email': 'nobody@$testDomain'}, + ); + + expect(nullLevelCompound, isNotEmpty); + expect(nullLevelCompound.map((e) => e.level), everyElement(isNull)); + + // And the negation, which has to become `IS NOT NULL`. + var notNullLevel = await userAPIRepository.selectByQuery( + " level != ? ", + parameters: {'level': null}, + ); + + expect(notNullLevel, isNotEmpty); + expect( + notNullLevel.map((e) => e.level), + everyElement(isNotNull), + reason: 'a negated null parameter must select the non-null rows', + ); + } + { var user4 = await userAPIRepository.selectFirstByQuery( "roles =~ ?", From 6ac8b01acd66587485a8359f058d9ea8fbfcfadc Mon Sep 17 00:00:00 2001 From: "Graciliano M. P." Date: Wed, 12 Aug 2026 05:42:11 -0300 Subject: [PATCH 2/7] fix: bump BonesAPI.VERSION alongside the pubspec `bones_api_test.dart` asserts the two agree, and the 1.15.1 bump missed the constant. Co-Authored-By: Claude Opus 5 (1M context) --- lib/src/bones_api_base.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/src/bones_api_base.dart b/lib/src/bones_api_base.dart index 3567eff..0bfddca 100644 --- a/lib/src/bones_api_base.dart +++ b/lib/src/bones_api_base.dart @@ -48,7 +48,7 @@ typedef APILogger = /// Bones API Library class. class BonesAPI { // ignore: constant_identifier_names - static const String VERSION = '1.15.0'; + static const String VERSION = '1.15.1'; static bool _boot = false; From 466dafac0e3b981653dcc1f6bdd38316f609dc1b Mon Sep 17 00:00:00 2001 From: "Graciliano M. P." Date: Wed, 12 Aug 2026 05:48:53 -0300 Subject: [PATCH 3/7] chore: reformat a generated file under Dart 3.13 `dart format` changed how it lays out argument lists, so `test/bones_api_test.reflection.g.dart` no longer matched its own formatting and `--set-exit-if-changed` failed CI. The generated content is unchanged; only the layout moved. Co-Authored-By: Claude Opus 5 (1M context) --- test/bones_api_test.reflection.g.dart | 19 +++++++------------ 1 file changed, 7 insertions(+), 12 deletions(-) diff --git a/test/bones_api_test.reflection.g.dart b/test/bones_api_test.reflection.g.dart index 59e951a..7d73409 100644 --- a/test/bones_api_test.reflection.g.dart +++ b/test/bones_api_test.reflection.g.dart @@ -1093,22 +1093,17 @@ extension MyInfoModuleProxy$reflectionProxy on MyInfoModuleProxy { } Future> mapKeys(Map map) { - var ret = onCall( - this, - 'mapKeys', - {'map': map}, - const __TR>>(Future, <__TR>[__TR.tListString]), - ); + var ret = onCall(this, 'mapKeys', { + 'map': map, + }, const __TR>>(Future, <__TR>[__TR.tListString])); return __retFut$>(ret); } Future> listMultiplier(List list, int m) { - var ret = onCall( - this, - 'listMultiplier', - {'list': list, 'm': m}, - const __TR>>(Future, <__TR>[__TR.tListInt]), - ); + var ret = onCall(this, 'listMultiplier', { + 'list': list, + 'm': m, + }, const __TR>>(Future, <__TR>[__TR.tListInt])); return __retFut$>(ret); } } From d05326534a8f9a40e52629bb7c986da72d77dc0f Mon Sep 17 00:00:00 2001 From: "Graciliano M. P." Date: Wed, 12 Aug 2026 05:58:02 -0300 Subject: [PATCH 4/7] chore: satisfy the Dart 3.13 analyzer MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit `dart analyze --fatal-infos --fatal-warnings` reports seven issues under 3.13 that 3.12 did not. None are new code; the analyser got stricter. Three warnings in `APIRoot`: - Two `invalid_return_type_for_then`. `Future.then`'s `onError` takes an untyped `(e, s)` closure, so there is no return context to infer `T` from and the helpers called inside resolved to `dynamic` — not assignable to what `then` expects. The type arguments are now explicit. - One `unawaited_return_in_try_block`, on a `FutureOr` the analyser cannot prove is not a future. Awaiting it is also the more correct form: a future returned bare from inside that `try` would carry its error past the `catch` below rather than into it. Four `use_super_parameters`, in the example and the Docker test configs. `SQLiteTestConfig` needed the explicit `memory:` argument dropped as well, since a super parameter forwards on its own. Co-Authored-By: Claude Opus 5 (1M context) --- example/bones_api_example.dart | 2 +- lib/src/bones_api_base.dart | 27 +++++++++++++++------- lib/src/bones_api_test_utils_mysql.dart | 9 ++------ lib/src/bones_api_test_utils_postgres.dart | 9 ++------ test/bones_api_entity_db_sqlite_test.dart | 4 ++-- 5 files changed, 26 insertions(+), 25 deletions(-) diff --git a/example/bones_api_example.dart b/example/bones_api_example.dart index 1af9702..876b1fa 100644 --- a/example/bones_api_example.dart +++ b/example/bones_api_example.dart @@ -60,7 +60,7 @@ class MyBTCModule extends APIModule { /// The `APIRoot` defines the API version and modules to use: class MyAPI extends APIRoot { - MyAPI({dynamic apiConfig}) : super('example', '1.0', apiConfig: apiConfig); + MyAPI({super.apiConfig}) : super('example', '1.0'); // Load the modules used by this API: @override diff --git a/lib/src/bones_api_base.dart b/lib/src/bones_api_base.dart index 0bfddca..87f9c3e 100644 --- a/lib/src/bones_api_base.dart +++ b/lib/src/bones_api_base.dart @@ -511,10 +511,14 @@ abstract class APIRoot with Initializable, Closable { if (response is APIResponse) { return response; } else if (response is Future?>) { - return response.then( + // The type argument is explicit on both branches: `onError` takes an + // untyped `(e, s)` closure, so there is no return context to infer + // from and `_callHandlersAsync` resolved to `dynamic` — which is not + // assignable to what `then` expects here. + return response.then?>( (resp) { if (resp != null) return resp; - return _callHandlersAsync( + return _callHandlersAsync( handlersIterator, request, handlersType, @@ -522,7 +526,7 @@ abstract class APIRoot with Initializable, Closable { }, onError: (e, s) { _logCallHandlersError(handlersType, handler, e, s); - return _callHandlersAsync( + return _callHandlersAsync( handlersIterator, request, handlersType, @@ -566,7 +570,11 @@ abstract class APIRoot with Initializable, Closable { if (response == null) continue; if (response is APIResponse) { - return response; + // Awaited rather than returned bare: the declared type is a + // `FutureOr`, so the analyzer cannot rule out a future here, and a + // future returned from inside this `try` would carry its error past + // the `catch` below instead of into it. + return await response; } else if (response is Future?>) { var resp = await response; if (resp != null) { @@ -647,12 +655,15 @@ abstract class APIRoot with Initializable, Closable { // to be rethrown by the previous `Zone`. if (response is Future>) { - return response.then( - (response) => _callZonedReturn(callZone, request, response), - onError: (e, s) => _callZonedReturn( + // Explicit type arguments: `onError` takes an untyped `(e, s)` + // closure, so there is no return context to infer `T` from and both + // helpers resolved to `dynamic`, which `then` will not accept here. + return response.then>( + (response) => _callZonedReturn(callZone, request, response), + onError: (e, s) => _callZonedReturn( callZone, request, - _resolveErrorAPIResponse(e, s), + _resolveErrorAPIResponse(e, s), ), ); } else { diff --git a/lib/src/bones_api_test_utils_mysql.dart b/lib/src/bones_api_test_utils_mysql.dart index 9bcc55f..f6abff9 100644 --- a/lib/src/bones_api_test_utils_mysql.dart +++ b/lib/src/bones_api_test_utils_mysql.dart @@ -19,16 +19,11 @@ class APITestConfigDockerMySQL APITestConfigDockerMySQL( Map apiConfig, { DockerHost? dockerHost, - String? containerNamePrefix, + super.containerNamePrefix, this.forceNativePasswordAuthentication = true, this.version = 'latest', super.cleanContainer, - }) : super( - dockerHost ?? DockerHostLocal(), - 'MySQL', - apiConfig, - containerNamePrefix: containerNamePrefix, - ) { + }) : super(dockerHost ?? DockerHostLocal(), 'MySQL', apiConfig) { DBMySQLAdapter.boot(); } diff --git a/lib/src/bones_api_test_utils_postgres.dart b/lib/src/bones_api_test_utils_postgres.dart index da9fb8b..2e92535 100644 --- a/lib/src/bones_api_test_utils_postgres.dart +++ b/lib/src/bones_api_test_utils_postgres.dart @@ -26,18 +26,13 @@ class APITestConfigDockerPostgreSQL APITestConfigDockerPostgreSQL( Map apiConfig, { DockerHost? dockerHost, - String? containerNamePrefix, + super.containerNamePrefix, this.postgresPort, this.maxConnections, this.logStatement, this.version = 'latest', super.cleanContainer, - }) : super( - dockerHost ?? DockerHostLocal(), - 'PostgreSQL', - apiConfig, - containerNamePrefix: containerNamePrefix, - ) { + }) : super(dockerHost ?? DockerHostLocal(), 'PostgreSQL', apiConfig) { DBPostgreSQLAdapter.boot(); } diff --git a/test/bones_api_entity_db_sqlite_test.dart b/test/bones_api_entity_db_sqlite_test.dart index 596d4fc..7333b84 100644 --- a/test/bones_api_entity_db_sqlite_test.dart +++ b/test/bones_api_entity_db_sqlite_test.dart @@ -16,7 +16,7 @@ class SQLiteTestConfig extends APITestConfigSQLite { SQLiteTestConfig({ required bool generateTables, required bool checkTables, - required bool memory, + required super.memory, }) : super({ 'db': { 'sqlite': { @@ -26,7 +26,7 @@ class SQLiteTestConfig extends APITestConfigSQLite { 'checkTables': checkTables, }, }, - }, memory: memory); + }); } Future main() async { From 955134adbfaac8a84de8900232277436a888c95a Mon Sep 17 00:00:00 2001 From: "Graciliano M. P." Date: Wed, 12 Aug 2026 06:21:31 -0300 Subject: [PATCH 5/7] fix: drop the parameter placeholders left unused by `IS NULL` Rewriting `field == ?` to `field IS NULL` leaves the parameter resolved but no longer mentioned by the statement. PostgreSQL rejects a statement carrying variables it does not use ("Contains superfluous variables"), so the entry has to be removed once the condition is encoded. Prunes against the encoded condition output, which is the only place placeholders are ever written, so a key still used by another operator (`field > ?` with a null bound) keeps its binding. Co-Authored-By: Claude Opus 5 (1M context) --- lib/src/bones_api_condition_encoder.dart | 41 ++++++++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/lib/src/bones_api_condition_encoder.dart b/lib/src/bones_api_condition_encoder.dart index 81f9984..c040a0c 100644 --- a/lib/src/bones_api_condition_encoder.dart +++ b/lib/src/bones_api_condition_encoder.dart @@ -1198,10 +1198,51 @@ abstract class ConditionEncoder { s.write(groupCloser); } + pruneUnusedParametersPlaceholders(context); + return context; }); } + /// Drops the placeholders that the encoded output never references. + /// + /// A null compared with `==`/`!=` is written as `IS NULL`/`IS NOT NULL` + /// rather than as the placeholder, which leaves its parameter resolved but + /// unmentioned by the statement. PostgreSQL rejects a statement carrying + /// variables it does not use, so the entry has to go. + void pruneUnusedParametersPlaceholders(EncodingContext context) { + var parametersPlaceholders = context.parametersPlaceholders; + if (parametersPlaceholders.isEmpty) return; + + var output = context.outputString; + + parametersPlaceholders.removeWhere( + (key, _) => !_isPlaceholderInOutput(output, parameterPlaceholder(key)), + ); + } + + static bool _isPlaceholderInOutput(String output, String placeholder) { + for (var i = output.indexOf(placeholder); i >= 0;) { + var end = i + placeholder.length; + + // A longer placeholder that merely starts with this one is a different + // parameter: `@level` vs. `@level_0`, the indexed form used for lists. + if (end >= output.length || !_isPlaceholderChar(output.codeUnitAt(end))) { + return true; + } + + i = output.indexOf(placeholder, i + 1); + } + + return false; + } + + static bool _isPlaceholderChar(int c) => + (c >= 0x30 && c <= 0x39) || // 0-9 + (c >= 0x41 && c <= 0x5a) || // A-Z + (c >= 0x61 && c <= 0x7a) || // a-z + c == 0x5f; // _ + FutureOr encodeCondition( Condition c, EncodingContext context, From 73945a860f7c75a63baf43b173df7c8fd1f85462 Mon Sep 17 00:00:00 2001 From: "Graciliano M. P." Date: Wed, 12 Aug 2026 06:23:49 -0300 Subject: [PATCH 6/7] docs: note the placeholder pruning in the 1.15.1 entry Co-Authored-By: Claude Opus 5 (1M context) --- CHANGELOG.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index aa50875..e03e26e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -21,6 +21,11 @@ PostgreSQL and MySQL alike — and any condition compared against a null parameter, including compound ones whose other terms matched. + Rewriting the comparison also leaves the parameter unmentioned by the + statement, so it is now dropped once the condition is encoded: PostgreSQL + rejects a statement carrying variables it does not use. A placeholder still + referenced by another operator (`field > ?` bound to null) keeps its binding. + Covered now by the shared adapter test suite, so all three adapters exercise it. From c84c3d71447de3c28734d5150067076c2e716266 Mon Sep 17 00:00:00 2001 From: "Graciliano M. P." Date: Wed, 12 Aug 2026 06:37:42 -0300 Subject: [PATCH 7/7] deps: reflection_factory ^2.9.0, for the Dart 3.13 formatter MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit reflection_factory 2.8.1 pins `dart_style` to the formatter bundled with Dart 3.12. On Dart 3.13 the generated `*.reflection.g.dart` therefore no longer matches this package's own `dart format`, and the two CI checks become mutually exclusive: committing the generator output fails `dart format --set-exit-if-changed`, and committing the formatted output fails `test/ensure_build_test.dart`, because `build_runner` rewrites it back. That is the `ensure_build` failure on this branch — pre-existing and unrelated to the null-condition fix; it blocks any PR built on 3.13. reflection_factory 2.9.0 (gmpassos/reflection_factory#52) tracks the formatter the SDK ships. Verified against it via a path override: the only change to the generated files is the builder version stamp, the formatting committed here is already correct, and `dart format`, `dart analyze` and `ensure_build` all pass together. `environment.sdk` deliberately stays at `>=3.10.0`: Dart 3.13 rejects `final` on parameters, which this package uses, and a package's language version comes from its own pubspec — only the toolchain needs to be 3.13. Co-Authored-By: Claude Opus 5 (1M context) --- CHANGELOG.md | 7 +++++++ pubspec.yaml | 2 +- test/bones_api_test.reflection.g.dart | 4 ++-- test/bones_api_test_entities.reflection.g.dart | 4 ++-- test/bones_api_test_entities_orders.reflection.g.dart | 4 ++-- test/bones_api_test_modules.reflection.g.dart | 4 ++-- test/bones_api_test_utils_test.reflection.g.dart | 4 ++-- 7 files changed, 18 insertions(+), 11 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e03e26e..69d0314 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -29,6 +29,13 @@ Covered now by the shared adapter test suite, so all three adapters exercise it. +- `reflection_factory`: `^2.8.1` → `^2.9.0`. + - 2.8.1 pinned `dart_style` to the formatter bundled with Dart 3.12, so on + Dart 3.13 the generated `*.reflection.g.dart` no longer matched this + package's own `dart format`, making `dart format --set-exit-if-changed` and + `test/ensure_build_test.dart` mutually exclusive. 2.9.0 tracks the + formatter the SDK ships. + ## 1.15.0 - Faster request dispatch. A logged route call is **~2.9x** faster diff --git a/pubspec.yaml b/pubspec.yaml index acde0df..5f73741 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -12,7 +12,7 @@ executables: dependencies: async_extension: ^1.2.22 async_events: ^1.3.0 - reflection_factory: ^2.8.1 + reflection_factory: ^2.9.0 statistics: ^1.2.1 swiss_knife: ^3.3.14 data_serializer: ^1.2.1 diff --git a/test/bones_api_test.reflection.g.dart b/test/bones_api_test.reflection.g.dart index 7d73409..5004849 100644 --- a/test/bones_api_test.reflection.g.dart +++ b/test/bones_api_test.reflection.g.dart @@ -1,6 +1,6 @@ // // GENERATED CODE - DO NOT MODIFY BY HAND! -// BUILDER: reflection_factory/2.8.1 +// BUILDER: reflection_factory/2.9.0 // BUILD COMMAND: dart run build_runner build // @@ -22,7 +22,7 @@ typedef __TI = TypeInfo; typedef __PR = ParameterReflection; mixin __ReflectionMixin { - static final Version _version = Version.parse('2.8.1'); + static final Version _version = Version.parse('2.9.0'); Version get reflectionFactoryVersion => _version; diff --git a/test/bones_api_test_entities.reflection.g.dart b/test/bones_api_test_entities.reflection.g.dart index 46f483a..2507057 100644 --- a/test/bones_api_test_entities.reflection.g.dart +++ b/test/bones_api_test_entities.reflection.g.dart @@ -1,6 +1,6 @@ // // GENERATED CODE - DO NOT MODIFY BY HAND! -// BUILDER: reflection_factory/2.8.1 +// BUILDER: reflection_factory/2.9.0 // BUILD COMMAND: dart run build_runner build // @@ -22,7 +22,7 @@ typedef __TI = TypeInfo; typedef __PR = ParameterReflection; mixin __ReflectionMixin { - static final Version _version = Version.parse('2.8.1'); + static final Version _version = Version.parse('2.9.0'); Version get reflectionFactoryVersion => _version; diff --git a/test/bones_api_test_entities_orders.reflection.g.dart b/test/bones_api_test_entities_orders.reflection.g.dart index 7f36076..3121a4c 100644 --- a/test/bones_api_test_entities_orders.reflection.g.dart +++ b/test/bones_api_test_entities_orders.reflection.g.dart @@ -1,6 +1,6 @@ // // GENERATED CODE - DO NOT MODIFY BY HAND! -// BUILDER: reflection_factory/2.8.1 +// BUILDER: reflection_factory/2.9.0 // BUILD COMMAND: dart run build_runner build // @@ -22,7 +22,7 @@ typedef __TI = TypeInfo; typedef __PR = ParameterReflection; mixin __ReflectionMixin { - static final Version _version = Version.parse('2.8.1'); + static final Version _version = Version.parse('2.9.0'); Version get reflectionFactoryVersion => _version; diff --git a/test/bones_api_test_modules.reflection.g.dart b/test/bones_api_test_modules.reflection.g.dart index f8c5dcd..6470a24 100644 --- a/test/bones_api_test_modules.reflection.g.dart +++ b/test/bones_api_test_modules.reflection.g.dart @@ -1,6 +1,6 @@ // // GENERATED CODE - DO NOT MODIFY BY HAND! -// BUILDER: reflection_factory/2.8.1 +// BUILDER: reflection_factory/2.9.0 // BUILD COMMAND: dart run build_runner build // @@ -22,7 +22,7 @@ typedef __TI = TypeInfo; typedef __PR = ParameterReflection; mixin __ReflectionMixin { - static final Version _version = Version.parse('2.8.1'); + static final Version _version = Version.parse('2.9.0'); Version get reflectionFactoryVersion => _version; diff --git a/test/bones_api_test_utils_test.reflection.g.dart b/test/bones_api_test_utils_test.reflection.g.dart index 0caa334..8ace306 100644 --- a/test/bones_api_test_utils_test.reflection.g.dart +++ b/test/bones_api_test_utils_test.reflection.g.dart @@ -1,6 +1,6 @@ // // GENERATED CODE - DO NOT MODIFY BY HAND! -// BUILDER: reflection_factory/2.8.1 +// BUILDER: reflection_factory/2.9.0 // BUILD COMMAND: dart run build_runner build // @@ -22,7 +22,7 @@ typedef __TI = TypeInfo; typedef __PR = ParameterReflection; mixin __ReflectionMixin { - static final Version _version = Version.parse('2.8.1'); + static final Version _version = Version.parse('2.9.0'); Version get reflectionFactoryVersion => _version;