From 1ab858d65831135af8945038482c19132e069adb Mon Sep 17 00:00:00 2001 From: Tobe O Date: Fri, 30 Mar 2018 14:53:38 -0400 Subject: [PATCH] Decode plain DateTime, also better TypeScript serialization --- angel_serialize_generator/CHANGELOG.md | 4 ++++ angel_serialize_generator/lib/serialize.dart | 5 +++-- angel_serialize_generator/lib/typescript.dart | 11 +++++++++-- angel_serialize_generator/pubspec.yaml | 2 +- .../test/models/author.d.ts | 5 +---- .../test/models/author.serializer.g.dart | 16 ++++++++++++---- angel_serialize_generator/test/models/book.d.ts | 2 +- .../test/models/book.serializer.g.dart | 8 ++++++-- 8 files changed, 37 insertions(+), 16 deletions(-) diff --git a/angel_serialize_generator/CHANGELOG.md b/angel_serialize_generator/CHANGELOG.md index 60359d43..cbbecf38 100644 --- a/angel_serialize_generator/CHANGELOG.md +++ b/angel_serialize_generator/CHANGELOG.md @@ -1,3 +1,7 @@ +# 2.0.5 +* Deserialization now supports un-serialized `DateTime`. +* Better support for regular typed Lists and Maps in TypeScript. + # 2.0.4 * Fields in TypeScript definitions are now nullable by default. diff --git a/angel_serialize_generator/lib/serialize.dart b/angel_serialize_generator/lib/serialize.dart index 73f4a2a0..a5e8f21e 100644 --- a/angel_serialize_generator/lib/serialize.dart +++ b/angel_serialize_generator/lib/serialize.dart @@ -139,8 +139,9 @@ class SerializerGenerator extends GeneratorForAnnotation { // Deserialize dates if (dateTimeTypeChecker.isAssignableFromType(field.type)) - deserializedRepresentation = - "map['$alias'] != null ? DateTime.parse(map['$alias']) : null"; + deserializedRepresentation = "map['$alias'] != null ? " + "(map['$alias'] is DateTime ? map['$alias'] : DateTime.parse(map['$alias']))" + " : null"; // Serialize model classes via `XSerializer.toMap` else if (isModelClass(field.type)) { diff --git a/angel_serialize_generator/lib/typescript.dart b/angel_serialize_generator/lib/typescript.dart index d598ec64..b173e65e 100644 --- a/angel_serialize_generator/lib/typescript.dart +++ b/angel_serialize_generator/lib/typescript.dart @@ -32,7 +32,8 @@ class TypeScriptDefinitionBuilder implements Builder { var arg = await compileToTypeScriptType( fieldName, type.typeArguments[0], ext, buildStep); typeScriptType = '$arg[]'; - } else if (isMapToModelType(type)) { + } else if (const TypeChecker.fromRuntime(List).isAssignableFromType(type) && + type.typeArguments.length == 2) { var key = await compileToTypeScriptType( fieldName, type.typeArguments[0], ext, buildStep); var value = await compileToTypeScriptType( @@ -58,7 +59,13 @@ class TypeScriptDefinitionBuilder implements Builder { ..outdent() ..writeln('}')); } else if (const TypeChecker.fromRuntime(List).isAssignableFromType(type)) { - typeScriptType = 'any[]'; + if (type.typeArguments.length == 0) + typeScriptType = 'any[]'; + else { + var arg = await compileToTypeScriptType( + fieldName, type.typeArguments[0], ext, buildStep); + typeScriptType = '$arg[]'; + } } else if (isModelClass(type)) { var ctx = await buildContext( type.element, diff --git a/angel_serialize_generator/pubspec.yaml b/angel_serialize_generator/pubspec.yaml index a5bc5223..59d6a034 100644 --- a/angel_serialize_generator/pubspec.yaml +++ b/angel_serialize_generator/pubspec.yaml @@ -1,5 +1,5 @@ name: angel_serialize_generator -version: 2.0.4 +version: 2.0.5 description: Model serialization generators, designed for use with Angel. Combine with angel_serialize for flexible modeling. author: Tobe O homepage: https://github.com/angel-dart/serialize diff --git a/angel_serialize_generator/test/models/author.d.ts b/angel_serialize_generator/test/models/author.d.ts index 118cacaf..653333b3 100644 --- a/angel_serialize_generator/test/models/author.d.ts +++ b/angel_serialize_generator/test/models/author.d.ts @@ -1,10 +1,7 @@ // GENERATED CODE - DO NOT MODIFY BY HAND interface Library { id?: string; - collection?: BookCollection; + collection?: any; created_at?: any; updated_at?: any; } -interface BookCollection { - [key: string]: Book; -} diff --git a/angel_serialize_generator/test/models/author.serializer.g.dart b/angel_serialize_generator/test/models/author.serializer.g.dart index e3147621..c52af786 100644 --- a/angel_serialize_generator/test/models/author.serializer.g.dart +++ b/angel_serialize_generator/test/models/author.serializer.g.dart @@ -20,10 +20,14 @@ abstract class AuthorSerializer { : null, obscured: map['obscured'], createdAt: map['created_at'] != null - ? DateTime.parse(map['created_at']) + ? (map['created_at'] is DateTime + ? map['created_at'] + : DateTime.parse(map['created_at'])) : null, updatedAt: map['updated_at'] != null - ? DateTime.parse(map['updated_at']) + ? (map['updated_at'] is DateTime + ? map['updated_at'] + : DateTime.parse(map['updated_at'])) : null); } @@ -71,10 +75,14 @@ abstract class LibrarySerializer { }) : null, createdAt: map['created_at'] != null - ? DateTime.parse(map['created_at']) + ? (map['created_at'] is DateTime + ? map['created_at'] + : DateTime.parse(map['created_at'])) : null, updatedAt: map['updated_at'] != null - ? DateTime.parse(map['updated_at']) + ? (map['updated_at'] is DateTime + ? map['updated_at'] + : DateTime.parse(map['updated_at'])) : null); } diff --git a/angel_serialize_generator/test/models/book.d.ts b/angel_serialize_generator/test/models/book.d.ts index 65cd8065..4dcb3ac3 100644 --- a/angel_serialize_generator/test/models/book.d.ts +++ b/angel_serialize_generator/test/models/book.d.ts @@ -5,7 +5,7 @@ interface Book { title?: string; description?: string; page_count?: number; - not_models?: any[]; + not_models?: number[]; camelCase?: string; created_at?: any; updated_at?: any; diff --git a/angel_serialize_generator/test/models/book.serializer.g.dart b/angel_serialize_generator/test/models/book.serializer.g.dart index 96f29d74..9f6d00fc 100644 --- a/angel_serialize_generator/test/models/book.serializer.g.dart +++ b/angel_serialize_generator/test/models/book.serializer.g.dart @@ -17,10 +17,14 @@ abstract class BookSerializer { notModels: map['not_models'], camelCaseString: map['camelCase'], createdAt: map['created_at'] != null - ? DateTime.parse(map['created_at']) + ? (map['created_at'] is DateTime + ? map['created_at'] + : DateTime.parse(map['created_at'])) : null, updatedAt: map['updated_at'] != null - ? DateTime.parse(map['updated_at']) + ? (map['updated_at'] is DateTime + ? map['updated_at'] + : DateTime.parse(map['updated_at'])) : null); }