From f1c199fd1e7660d642a7d8144a35d471492ebcad Mon Sep 17 00:00:00 2001 From: timonrieger Date: Mon, 18 May 2026 14:08:46 +0200 Subject: [PATCH] bump to v7.22.0 and update patching --- open-api/bin/generate-dart-sdk.sh | 7 +- open-api/openapitools.json | 2 +- .../time_bucket_asset_response_dto.dart.patch | 9 + .../native/native_class.mustache.patch | 200 ++++++++++++++---- ...ative_class_nullable_items_in_arrays.patch | 13 -- 5 files changed, 174 insertions(+), 57 deletions(-) create mode 100644 open-api/patch/time_bucket_asset_response_dto.dart.patch delete mode 100644 open-api/templates/mobile/serialization/native/native_class_nullable_items_in_arrays.patch diff --git a/open-api/bin/generate-dart-sdk.sh b/open-api/bin/generate-dart-sdk.sh index e81d28096f..793c1f8df3 100755 --- a/open-api/bin/generate-dart-sdk.sh +++ b/open-api/bin/generate-dart-sdk.sh @@ -1,28 +1,29 @@ #!/usr/bin/env bash -OPENAPI_GENERATOR_VERSION=v7.12.0 +OPENAPI_GENERATOR_VERSION=v7.22.0 set -euo pipefail # usage: ./bin/generate-dart-sdk.sh rm -rf ../mobile/openapi + cd ./templates/mobile/serialization/native wget -O native_class.mustache https://raw.githubusercontent.com/OpenAPITools/openapi-generator/$OPENAPI_GENERATOR_VERSION/modules/openapi-generator/src/main/resources/dart2/serialization/native/native_class.mustache patch --no-backup-if-mismatch -u native_class.mustache ratio; + + /// Array of stack information as [stackId, assetCount] tuples (null for non-stacked assets) +- Optional>?> stack; ++ Optional?>?> stack; + + /// Array of BlurHash strings for generating asset previews (base64 encoded) + List thumbhash; diff --git a/open-api/templates/mobile/serialization/native/native_class.mustache.patch b/open-api/templates/mobile/serialization/native/native_class.mustache.patch index 8eeefdad97..6ab7a5228f 100644 --- a/open-api/templates/mobile/serialization/native/native_class.mustache.patch +++ b/open-api/templates/mobile/serialization/native/native_class.mustache.patch @@ -1,60 +1,180 @@ ---- native_class.mustache 2025-07-01 08:29:23.968133163 +0800 -+++ native_class_temp.mustache 2025-07-01 08:29:44.225850583 +0800 -@@ -91,14 +91,14 @@ - {{/isDateTime}} - {{#isNullable}} - } else { -- json[r'{{{baseName}}}'] = null; -+ // json[r'{{{baseName}}}'] = null; - } - {{/isNullable}} - {{^isNullable}} - {{^required}} - {{^defaultValue}} - } else { -- json[r'{{{baseName}}}'] = null; -+ // json[r'{{{baseName}}}'] = null; - } - {{/defaultValue}} - {{/required}} -@@ -111,20 +111,10 @@ +--- native_class.mustache 2026-06-03 12:23:39 ++++ native_class.mustache 2026-06-03 12:21:49 +@@ -154,24 +154,10 @@ /// [value] if it's a [Map], null otherwise. // ignore: prefer_constructors_over_static_methods static {{{classname}}}? fromJson(dynamic value) { + upgradeDto(value, "{{{classname}}}"); if (value is Map) { final json = value.cast(); - + - // Ensure that the map contains the required keys. - // Note 1: the values aren't checked for validity beyond being non-null. - // Note 2: this code is stripped in release mode! - assert(() { -- requiredKeys.forEach((key) { -- assert(json.containsKey(key), 'Required key "{{{classname}}}[$key]" is missing from JSON.'); -- assert(json[key] != null, 'Required key "{{{classname}}}[$key]" has a null value in JSON.'); -- }); +- {{#vars}} +- {{#required}} +- assert(json.containsKey(r'{{{baseName}}}'), 'Required key "{{{classname}}}[{{{baseName}}}]" is missing from JSON.'); +- {{^isNullable}} +- assert(json[r'{{{baseName}}}'] != null, 'Required key "{{{classname}}}[{{{baseName}}}]" has a null value in JSON.'); +- {{/isNullable}} +- {{/required}} +- {{/vars}} - return true; - }()); - return {{{classname}}}( {{#vars}} {{#isDateTime}} -@@ -215,6 +205,10 @@ +@@ -195,48 +181,98 @@ + {{#complexType}} + {{#isArray}} + {{#items.isArray}} ++ {{#vendorExtensions.x-is-optional}} ++ {{{name}}}: json.containsKey(r'{{{baseName}}}') ? Optional.present(json[r'{{{baseName}}}'] is List ++ ? (json[r'{{{baseName}}}'] as List).map((e) => ++ {{#items.complexType}} ++ e == null ? {{#items.isNullable}}null{{/items.isNullable}}{{^items.isNullable}}const <{{items.complexType}}>[]{{/items.isNullable}} : {{items.complexType}}.listFromJson(e){{#uniqueItems}}.toSet(){{/uniqueItems}} ++ {{/items.complexType}} ++ {{^items.complexType}} ++ e == null ? {{#items.isNullable}}null{{/items.isNullable}}{{^items.isNullable}}const <{{items.items.dataType}}{{#items.items.isNullable}}?{{/items.items.isNullable}}>[]{{/items.isNullable}} : (e as List).map((value) => value as {{items.items.dataType}}{{#items.items.isNullable}}?{{/items.items.isNullable}}).toList(growable: false) ++ {{/items.complexType}} ++ ).toList() ++ : {{#isNullable}}null{{/isNullable}}{{^isNullable}}const []{{/isNullable}}) : const Optional.absent(), ++ {{/vendorExtensions.x-is-optional}} ++ {{^vendorExtensions.x-is-optional}} + {{{name}}}: json[r'{{{baseName}}}'] is List + ? (json[r'{{{baseName}}}'] as List).map((e) => + {{#items.complexType}} +- {{items.complexType}}.listFromJson(json[r'{{{baseName}}}']){{#uniqueItems}}.toSet(){{/uniqueItems}} ++ e == null ? {{#items.isNullable}}null{{/items.isNullable}}{{^items.isNullable}}const <{{items.complexType}}>[]{{/items.isNullable}} : {{items.complexType}}.listFromJson(e){{#uniqueItems}}.toSet(){{/uniqueItems}} + {{/items.complexType}} + {{^items.complexType}} +- e == null ? {{#items.isNullable}}null{{/items.isNullable}}{{^items.isNullable}}const <{{items.items.dataType}}>[]{{/items.isNullable}} : (e as List).cast<{{items.items.dataType}}>() ++ e == null ? {{#items.isNullable}}null{{/items.isNullable}}{{^items.isNullable}}const <{{items.items.dataType}}{{#items.items.isNullable}}?{{/items.items.isNullable}}>[]{{/items.isNullable}} : (e as List).map((value) => value as {{items.items.dataType}}{{#items.items.isNullable}}?{{/items.items.isNullable}}).toList(growable: false) + {{/items.complexType}} + ).toList() + : {{#isNullable}}null{{/isNullable}}{{^isNullable}}const []{{/isNullable}}, ++ {{/vendorExtensions.x-is-optional}} + {{/items.isArray}} + {{^items.isArray}} ++ {{#vendorExtensions.x-is-optional}} ++ {{{name}}}: json.containsKey(r'{{{baseName}}}') ? Optional.present({{{complexType}}}.listFromJson(json[r'{{{baseName}}}']){{#uniqueItems}}.toSet(){{/uniqueItems}}) : const Optional.absent(), ++ {{/vendorExtensions.x-is-optional}} ++ {{^vendorExtensions.x-is-optional}} + {{{name}}}: {{{complexType}}}.listFromJson(json[r'{{{baseName}}}']){{#uniqueItems}}.toSet(){{/uniqueItems}}, ++ {{/vendorExtensions.x-is-optional}} + {{/items.isArray}} + {{/isArray}} + {{^isArray}} + {{#isMap}} + {{#items.isArray}} ++ {{#vendorExtensions.x-is-optional}} ++ {{{name}}}: json.containsKey(r'{{{baseName}}}') ? Optional.present(json[r'{{{baseName}}}'] == null ? null ++ {{#items.complexType}} ++ : {{items.complexType}}.mapListFromJson(json[r'{{{baseName}}}'])) : const Optional.absent(), ++ {{/items.complexType}} ++ {{^items.complexType}} ++ : (json[r'{{{baseName}}}'] as Map).map((k, v) => MapEntry(k, v == null ? {{#items.isNullable}}null{{/items.isNullable}}{{^items.isNullable}}const <{{items.items.dataType}}{{#items.items.isNullable}}?{{/items.items.isNullable}}>[]{{/items.isNullable}} : (v as List).map((value) => value as {{items.items.dataType}}{{#items.items.isNullable}}?{{/items.items.isNullable}}).toList(growable: false)))) : const Optional.absent(), ++ {{/items.complexType}} ++ {{/vendorExtensions.x-is-optional}} ++ {{^vendorExtensions.x-is-optional}} + {{{name}}}: json[r'{{{baseName}}}'] == null + ? {{#defaultValue}}{{{.}}}{{/defaultValue}}{{^defaultValue}}null{{/defaultValue}} +- {{#items.complexType}} ++ {{#items.complexType}} + : {{items.complexType}}.mapListFromJson(json[r'{{{baseName}}}']), +- {{/items.complexType}} +- {{^items.complexType}} +- : (json[r'{{{baseName}}}'] as Map).map((k, v) => MapEntry(k, v == null ? {{#items.isNullable}}null{{/items.isNullable}}{{^items.isNullable}}const <{{items.items.dataType}}>[]{{/items.isNullable}} : (v as List).cast<{{items.items.dataType}}>())), +- {{/items.complexType}} ++ {{/items.complexType}} ++ {{^items.complexType}} ++ : (json[r'{{{baseName}}}'] as Map).map((k, v) => MapEntry(k, v == null ? {{#items.isNullable}}null{{/items.isNullable}}{{^items.isNullable}}const <{{items.items.dataType}}{{#items.items.isNullable}}?{{/items.items.isNullable}}>[]{{/items.isNullable}} : (v as List).map((value) => value as {{items.items.dataType}}{{#items.items.isNullable}}?{{/items.items.isNullable}}).toList(growable: false))), ++ {{/items.complexType}} ++ {{/vendorExtensions.x-is-optional}} + {{/items.isArray}} + {{^items.isArray}} + {{#items.isMap}} + {{#items.complexType}} ++ {{#vendorExtensions.x-is-optional}} ++ {{{name}}}: json.containsKey(r'{{{baseName}}}') ? Optional.present({{items.complexType}}.mapFromJson(json[r'{{{baseName}}}'])) : const Optional.absent(), ++ {{/vendorExtensions.x-is-optional}} ++ {{^vendorExtensions.x-is-optional}} + {{{name}}}: {{items.complexType}}.mapFromJson(json[r'{{{baseName}}}']), ++ {{/vendorExtensions.x-is-optional}} + {{/items.complexType}} + {{^items.complexType}} ++ {{#vendorExtensions.x-is-optional}} ++ {{{name}}}: json.containsKey(r'{{{baseName}}}') ? Optional.present(mapCastOfType(json, r'{{{baseName}}}')) : const Optional.absent(), ++ {{/vendorExtensions.x-is-optional}} ++ {{^vendorExtensions.x-is-optional}} + {{{name}}}: mapCastOfType(json, r'{{{baseName}}}'){{#required}}{{^isNullable}}!{{/isNullable}}{{/required}}{{^required}}{{#defaultValue}} ?? {{{.}}}{{/defaultValue}}{{/required}}, ++ {{/vendorExtensions.x-is-optional}} + {{/items.complexType}} + {{/items.isMap}} + {{^items.isMap}} + {{#items.complexType}} ++ {{#vendorExtensions.x-is-optional}} ++ {{{name}}}: json.containsKey(r'{{{baseName}}}') ? Optional.present({{{items.complexType}}}.mapFromJson(json[r'{{{baseName}}}'])) : const Optional.absent(), ++ {{/vendorExtensions.x-is-optional}} ++ {{^vendorExtensions.x-is-optional}} + {{{name}}}: {{{items.complexType}}}.mapFromJson(json[r'{{{baseName}}}']), ++ {{/vendorExtensions.x-is-optional}} + {{/items.complexType}} + {{^items.complexType}} ++ {{#vendorExtensions.x-is-optional}} ++ {{{name}}}: json.containsKey(r'{{{baseName}}}') ? Optional.present(mapCastOfType(json, r'{{{baseName}}}')) : const Optional.absent(), ++ {{/vendorExtensions.x-is-optional}} ++ {{^vendorExtensions.x-is-optional}} + {{{name}}}: mapCastOfType(json, r'{{{baseName}}}'){{#required}}{{^isNullable}}!{{/isNullable}}{{/required}}{{^required}}{{#defaultValue}} ?? {{{.}}}{{/defaultValue}}{{/required}}, ++ {{/vendorExtensions.x-is-optional}} + {{/items.complexType}} + {{/items.isMap}} + {{/items.isArray}} +@@ -259,23 +295,45 @@ + {{^complexType}} + {{#isArray}} + {{#isEnum}} ++ {{#vendorExtensions.x-is-optional}} ++ {{{name}}}: json.containsKey(r'{{{baseName}}}') ? Optional.present({{{items.datatypeWithEnum}}}.listFromJson(json[r'{{{baseName}}}']){{#uniqueItems}}.toSet(){{/uniqueItems}}) : const Optional.absent(), ++ {{/vendorExtensions.x-is-optional}} ++ {{^vendorExtensions.x-is-optional}} + {{{name}}}: {{{items.datatypeWithEnum}}}.listFromJson(json[r'{{{baseName}}}']){{#uniqueItems}}.toSet(){{/uniqueItems}}, ++ {{/vendorExtensions.x-is-optional}} + {{/isEnum}} + {{^isEnum}} ++ {{#vendorExtensions.x-is-optional}} ++ {{{name}}}: json.containsKey(r'{{{baseName}}}') ? Optional.present(json[r'{{{baseName}}}'] is Iterable ++ ? (json[r'{{{baseName}}}'] as Iterable).cast<{{{items.datatype}}}>().{{#uniqueItems}}toSet(){{/uniqueItems}}{{^uniqueItems}}toList(growable: false){{/uniqueItems}} ++ : {{#defaultValue}}{{{.}}}{{/defaultValue}}{{^defaultValue}}null{{/defaultValue}}) : const Optional.absent(), ++ {{/vendorExtensions.x-is-optional}} ++ {{^vendorExtensions.x-is-optional}} + {{{name}}}: json[r'{{{baseName}}}'] is Iterable + ? (json[r'{{{baseName}}}'] as Iterable).cast<{{{items.datatype}}}>().{{#uniqueItems}}toSet(){{/uniqueItems}}{{^uniqueItems}}toList(growable: false){{/uniqueItems}} + : {{#defaultValue}}{{{.}}}{{/defaultValue}}{{^defaultValue}}null{{/defaultValue}}, ++ {{/vendorExtensions.x-is-optional}} + {{/isEnum}} + {{/isArray}} + {{^isArray}} + {{#isMap}} ++ {{#vendorExtensions.x-is-optional}} ++ {{{name}}}: json.containsKey(r'{{{baseName}}}') ? Optional.present(mapCastOfType(json, r'{{{baseName}}}')) : const Optional.absent(), ++ {{/vendorExtensions.x-is-optional}} ++ {{^vendorExtensions.x-is-optional}} + {{{name}}}: mapCastOfType(json, r'{{{baseName}}}'){{#required}}{{^isNullable}}!{{/isNullable}}{{/required}}{{^required}}{{#defaultValue}} ?? {{{.}}}{{/defaultValue}}{{/required}}, ++ {{/vendorExtensions.x-is-optional}} + {{/isMap}} + {{^isMap}} + {{#isNumber}} ++ {{#vendorExtensions.x-is-optional}} ++ {{{name}}}: json.containsKey(r'{{{baseName}}}') ? Optional.present(json[r'{{{baseName}}}'] == null ? null : num.parse('${json[r'{{{baseName}}}']}')) : const Optional.absent(), ++ {{/vendorExtensions.x-is-optional}} ++ {{^vendorExtensions.x-is-optional}} + {{{name}}}: {{#isNullable}}json[r'{{{baseName}}}'] == null ? {{#defaultValue}}{{{.}}}{{/defaultValue}}{{^defaultValue}}null{{/defaultValue}} : {{/isNullable}}{{{datatypeWithEnum}}}.parse('${json[r'{{{baseName}}}']}'), ++ {{/vendorExtensions.x-is-optional}} {{/isNumber}} -+ {{#isDouble}} -+ {{{name}}}: (mapValueOfType(json, r'{{{baseName}}}'){{#required}}{{^isNullable}}!{{/isNullable}}{{/required}}{{^required}}{{#defaultValue}} ?? {{{.}}}{{/defaultValue}}{{/required}}){{#isNullable}}?{{/isNullable}}.toDouble(), -+ {{/isDouble}} -+ {{^isDouble}} {{^isNumber}} - {{^isEnum}} - {{{name}}}: mapValueOfType<{{{datatypeWithEnum}}}>(json, r'{{{baseName}}}'){{#required}}{{^isNullable}}!{{/isNullable}}{{/required}}{{^required}}{{#defaultValue}} ?? {{{.}}}{{/defaultValue}}{{/required}}, -@@ -223,6 +217,7 @@ - {{{name}}}: {{{enumName}}}.fromJson(json[r'{{{baseName}}}']){{#required}}{{^isNullable}}!{{/isNullable}}{{/required}}{{^required}}{{#defaultValue}} ?? {{{.}}}{{/defaultValue}}{{/required}}, - {{/isEnum}} - {{/isNumber}} -+ {{/isDouble}} - {{/isMap}} - {{/isArray}} - {{/complexType}} + {{#vendorExtensions.x-original-is-integer}} diff --git a/open-api/templates/mobile/serialization/native/native_class_nullable_items_in_arrays.patch b/open-api/templates/mobile/serialization/native/native_class_nullable_items_in_arrays.patch deleted file mode 100644 index a59e300913..0000000000 --- a/open-api/templates/mobile/serialization/native/native_class_nullable_items_in_arrays.patch +++ /dev/null @@ -1,13 +0,0 @@ -diff --git a/open-api/templates/mobile/serialization/native/native_class.mustache b/open-api/templates/mobile/serialization/native/native_class.mustache -index 9a7b1439b..9f40d5b0b 100644 ---- a/open-api/templates/mobile/serialization/native/native_class.mustache -+++ b/open-api/templates/mobile/serialization/native/native_class.mustache -@@ -32,7 +32,7 @@ class {{{classname}}} { - {{/required}} - {{/isNullable}} - {{/isEnum}} -- {{{datatypeWithEnum}}}{{#isNullable}}?{{/isNullable}}{{^isNullable}}{{^required}}{{^defaultValue}}?{{/defaultValue}}{{/required}}{{/isNullable}} {{{name}}}; -+ {{#isArray}}{{#uniqueItems}}Set{{/uniqueItems}}{{^uniqueItems}}List{{/uniqueItems}}<{{{items.dataType}}}{{#items.isNullable}}?{{/items.isNullable}}>{{/isArray}}{{^isArray}}{{{datatypeWithEnum}}}{{/isArray}}{{#isNullable}}?{{/isNullable}}{{^isNullable}}{{^required}}{{^defaultValue}}?{{/defaultValue}}{{/required}}{{/isNullable}} {{{name}}}; - - {{/vars}} - @override