2.0.3, added typescript
This commit is contained in:
parent
7a93ebc833
commit
ea88a84e5d
14 changed files with 108 additions and 22 deletions
39
README.md
39
README.md
|
@ -13,6 +13,7 @@ the time you spend writing boilerplate serialization code for your models.
|
||||||
* [Serialization](#serializaition)
|
* [Serialization](#serializaition)
|
||||||
* [Nesting](#nesting)
|
* [Nesting](#nesting)
|
||||||
* [ID and Date Fields](#id-and-dates)
|
* [ID and Date Fields](#id-and-dates)
|
||||||
|
* [TypeScript Definition Generator](#typescript-definitions)
|
||||||
|
|
||||||
# Usage
|
# Usage
|
||||||
In your `pubspec.yaml`, you need to install the following dependencies:
|
In your `pubspec.yaml`, you need to install the following dependencies:
|
||||||
|
@ -209,3 +210,41 @@ You can also override `autoIdAndDateFields` per model:
|
||||||
@Serializable(autoIdAndDateFields: false)
|
@Serializable(autoIdAndDateFields: false)
|
||||||
abstract class _Skinny extends Model {}
|
abstract class _Skinny extends Model {}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
# TypeScript Definitions
|
||||||
|
It is quite common to build frontends with JavaScript and/or TypeScript,
|
||||||
|
so why not generate typings as well?
|
||||||
|
|
||||||
|
To accomplish this, add `Serializers.typescript` to your `@Serializable()` declaration:
|
||||||
|
|
||||||
|
```dart
|
||||||
|
@Serializable(serializers: const [Serializers.map, Serializers.json, Serializers.typescript])
|
||||||
|
class _Foo extends Model {}
|
||||||
|
```
|
||||||
|
|
||||||
|
The aforementioned `_Author` class will generate the following in `author.d.ts`:
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
interface Author {
|
||||||
|
id: string;
|
||||||
|
name: string;
|
||||||
|
age: number;
|
||||||
|
books: Book[];
|
||||||
|
newest_book: Book;
|
||||||
|
created_at: any;
|
||||||
|
updated_at: any;
|
||||||
|
}
|
||||||
|
interface Library {
|
||||||
|
id: string;
|
||||||
|
collection: BookCollection;
|
||||||
|
created_at: any;
|
||||||
|
updated_at: any;
|
||||||
|
}
|
||||||
|
interface BookCollection {
|
||||||
|
[key: string]: Book;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
Fields with an `@Exclude()` that specifies `canSerialize: false` will not be present in the
|
||||||
|
TypeScript definition. The rationale for this is that if a field (i.e. `password`) will
|
||||||
|
never be sent to the client, the client shouldn't even know the field exists.
|
|
@ -1,2 +1,2 @@
|
||||||
# Generated by pub on 2018-03-02 16:15:05.377739.
|
# Generated by pub on 2018-03-29 15:50:32.802835.
|
||||||
angel_serialize:lib/
|
angel_serialize:lib/
|
||||||
|
|
|
@ -1,2 +1,5 @@
|
||||||
|
# 2.0.1
|
||||||
|
* Added `Serializers.typescript`.
|
||||||
|
|
||||||
# 2.0.0
|
# 2.0.0
|
||||||
* Dart 2+ constraint
|
* Dart 2+ constraint
|
|
@ -33,13 +33,16 @@ const Serializable serializable = const Serializable();
|
||||||
/// The supported serialization types.
|
/// The supported serialization types.
|
||||||
abstract class Serializers {
|
abstract class Serializers {
|
||||||
/// All supported serialization types.
|
/// All supported serialization types.
|
||||||
static const List<int> all = const [map, json];
|
static const List<int> all = const [map, json, typescript];
|
||||||
|
|
||||||
/// Enable `fromMap` and `toMap` methods on the model class.
|
/// Enable `fromMap` and `toMap` methods on the model class.
|
||||||
static const int map = 0;
|
static const int map = 0;
|
||||||
|
|
||||||
/// Enable a `toJson` method on the model class.
|
/// Enable a `toJson` method on the model class.
|
||||||
static const int json = 1;
|
static const int json = 1;
|
||||||
|
|
||||||
|
/// Generate a TypeScript definition file (`.d.ts`) for use on the client-side.
|
||||||
|
static const int typescript = 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Specifies an alias for a field within its JSON representation.
|
/// Specifies an alias for a field within its JSON representation.
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
name: angel_serialize
|
name: angel_serialize
|
||||||
version: 2.0.0
|
version: 2.0.1
|
||||||
description: Static annotations powering Angel model serialization. Combine with angel_serialize_generator for flexible modeling.
|
description: Static annotations powering Angel model serialization. Combine with angel_serialize_generator for flexible modeling.
|
||||||
author: Tobe O <thosakwe@gmail.com>
|
author: Tobe O <thosakwe@gmail.com>
|
||||||
homepage: https://github.com/angel-dart/serialize
|
homepage: https://github.com/angel-dart/serialize
|
||||||
|
|
|
@ -1,3 +1,6 @@
|
||||||
|
# 2.0.3
|
||||||
|
* Added a `TypeScriptDefinitionBuilder`.
|
||||||
|
|
||||||
# 2.0.2
|
# 2.0.2
|
||||||
* Generates an `XFields` class with the serialized names of
|
* Generates an `XFields` class with the serialized names of
|
||||||
all fields in a model class `X`.
|
all fields in a model class `X`.
|
||||||
|
|
|
@ -5,27 +5,13 @@ builders:
|
||||||
builder_factories:
|
builder_factories:
|
||||||
- jsonModelBuilder
|
- jsonModelBuilder
|
||||||
- serializerBuilder
|
- serializerBuilder
|
||||||
|
- typescriptDefinitionBuilder
|
||||||
auto_apply: root_package
|
auto_apply: root_package
|
||||||
build_to: source
|
build_to: source
|
||||||
build_extensions:
|
build_extensions:
|
||||||
.dart:
|
.dart:
|
||||||
- ".g.dart"
|
- ".g.dart"
|
||||||
- ".serializer.g.dart"
|
- ".serializer.g.dart"
|
||||||
required_inputs:
|
|
||||||
- .dart
|
|
||||||
defaults:
|
|
||||||
generate_for:
|
|
||||||
- "lib/src/models/**.dart"
|
|
||||||
- "test/**.dart"
|
|
||||||
typescript_definition:
|
|
||||||
target: "angel_serialize_generator"
|
|
||||||
import: "package:angel_serialize_generator/angel_serialize_generator.dart"
|
|
||||||
builder_factories:
|
|
||||||
- typescriptDefinitionBuilder
|
|
||||||
auto_apply: root_package
|
|
||||||
build_to: source
|
|
||||||
build_extensions:
|
|
||||||
.dart:
|
|
||||||
- ".d.ts"
|
- ".d.ts"
|
||||||
required_inputs:
|
required_inputs:
|
||||||
- .dart
|
- .dart
|
||||||
|
@ -37,8 +23,12 @@ targets:
|
||||||
_book:
|
_book:
|
||||||
sources:
|
sources:
|
||||||
- "test/models/book.dart"
|
- "test/models/book.dart"
|
||||||
|
_typescript_definition:
|
||||||
|
sources:
|
||||||
|
- "lib/*.dart"
|
||||||
$default:
|
$default:
|
||||||
dependencies:
|
dependencies:
|
||||||
- ":_book"
|
- ":_book"
|
||||||
sources:
|
sources:
|
||||||
|
- "lib/*.dart"
|
||||||
- "test/models/author.dart"
|
- "test/models/author.dart"
|
||||||
|
|
|
@ -78,7 +78,14 @@ class TypeScriptDefinitionBuilder implements Builder {
|
||||||
@override
|
@override
|
||||||
Future build(BuildStep buildStep) async {
|
Future build(BuildStep buildStep) async {
|
||||||
var contexts = <BuildContext>[];
|
var contexts = <BuildContext>[];
|
||||||
var lib = new LibraryReader(await buildStep.inputLibrary);
|
LibraryReader lib;
|
||||||
|
|
||||||
|
try {
|
||||||
|
lib = new LibraryReader(await buildStep.inputLibrary);
|
||||||
|
} catch (_) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
var elements =
|
var elements =
|
||||||
lib.annotatedWith(const TypeChecker.fromRuntime(Serializable));
|
lib.annotatedWith(const TypeChecker.fromRuntime(Serializable));
|
||||||
|
|
||||||
|
@ -86,6 +93,17 @@ class TypeScriptDefinitionBuilder implements Builder {
|
||||||
if (element.element.kind != ElementKind.CLASS)
|
if (element.element.kind != ElementKind.CLASS)
|
||||||
throw 'Only classes can be annotated with a @Serializable() annotation.';
|
throw 'Only classes can be annotated with a @Serializable() annotation.';
|
||||||
|
|
||||||
|
var annotation = element.annotation;
|
||||||
|
|
||||||
|
var serializers = annotation.peek('serializers')?.listValue ?? [];
|
||||||
|
|
||||||
|
if (serializers.isEmpty) continue;
|
||||||
|
|
||||||
|
// Check if TypeScript serializer is supported
|
||||||
|
if (!serializers.any((s) => s.toIntValue() == Serializers.typescript)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
contexts.add(await buildContext(
|
contexts.add(await buildContext(
|
||||||
element.element,
|
element.element,
|
||||||
element.annotation,
|
element.annotation,
|
||||||
|
@ -102,6 +120,8 @@ class TypeScriptDefinitionBuilder implements Builder {
|
||||||
sourceUrl: buildStep.inputId.uri,
|
sourceUrl: buildStep.inputId.uri,
|
||||||
);
|
);
|
||||||
|
|
||||||
|
buf.writeln('// GENERATED CODE - DO NOT MODIFY BY HAND');
|
||||||
|
|
||||||
// declare module `foo` {
|
// declare module `foo` {
|
||||||
//buf
|
//buf
|
||||||
// ..writeln("declare module '${buildStep.inputId.package}' {")
|
// ..writeln("declare module '${buildStep.inputId.package}' {")
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
name: angel_serialize_generator
|
name: angel_serialize_generator
|
||||||
version: 2.0.2
|
version: 2.0.3
|
||||||
description: Model serialization generators, designed for use with Angel. Combine with angel_serialize for flexible modeling.
|
description: Model serialization generators, designed for use with Angel. Combine with angel_serialize for flexible modeling.
|
||||||
author: Tobe O <thosakwe@gmail.com>
|
author: Tobe O <thosakwe@gmail.com>
|
||||||
homepage: https://github.com/angel-dart/serialize
|
homepage: https://github.com/angel-dart/serialize
|
||||||
|
|
10
angel_serialize_generator/test/models/author.d.ts
vendored
Normal file
10
angel_serialize_generator/test/models/author.d.ts
vendored
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
// GENERATED CODE - DO NOT MODIFY BY HAND
|
||||||
|
interface Library {
|
||||||
|
id: string;
|
||||||
|
collection: BookCollection;
|
||||||
|
created_at: any;
|
||||||
|
updated_at: any;
|
||||||
|
}
|
||||||
|
interface BookCollection {
|
||||||
|
[key: string]: Book;
|
||||||
|
}
|
|
@ -3,7 +3,9 @@ library angel_serialize.test.models.author;
|
||||||
import 'package:angel_framework/common.dart';
|
import 'package:angel_framework/common.dart';
|
||||||
import 'package:angel_serialize/angel_serialize.dart';
|
import 'package:angel_serialize/angel_serialize.dart';
|
||||||
import 'book.dart';
|
import 'book.dart';
|
||||||
|
|
||||||
part 'author.g.dart';
|
part 'author.g.dart';
|
||||||
|
|
||||||
part 'author.serializer.g.dart';
|
part 'author.serializer.g.dart';
|
||||||
|
|
||||||
@serializable
|
@serializable
|
||||||
|
@ -20,7 +22,7 @@ abstract class _Author extends Model {
|
||||||
String obscured;
|
String obscured;
|
||||||
}
|
}
|
||||||
|
|
||||||
@serializable
|
@Serializable(serializers: Serializers.all)
|
||||||
abstract class _Library extends Model {
|
abstract class _Library extends Model {
|
||||||
Map<String, Book> collection;
|
Map<String, Book> collection;
|
||||||
}
|
}
|
||||||
|
|
12
angel_serialize_generator/test/models/book.d.ts
vendored
Normal file
12
angel_serialize_generator/test/models/book.d.ts
vendored
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
// GENERATED CODE - DO NOT MODIFY BY HAND
|
||||||
|
interface Book {
|
||||||
|
id: string;
|
||||||
|
author: string;
|
||||||
|
title: string;
|
||||||
|
description: string;
|
||||||
|
page_count: number;
|
||||||
|
not_models: any[];
|
||||||
|
camelCase: string;
|
||||||
|
created_at: any;
|
||||||
|
updated_at: any;
|
||||||
|
}
|
|
@ -5,7 +5,7 @@ import 'package:angel_serialize/angel_serialize.dart';
|
||||||
part 'book.g.dart';
|
part 'book.g.dart';
|
||||||
part 'book.serializer.g.dart';
|
part 'book.serializer.g.dart';
|
||||||
|
|
||||||
@serializable
|
@Serializable(serializers: Serializers.all)
|
||||||
abstract class _Book extends Model {
|
abstract class _Book extends Model {
|
||||||
String author, title, description;
|
String author, title, description;
|
||||||
int pageCount;
|
int pageCount;
|
||||||
|
|
|
@ -29,6 +29,10 @@ final List<BuilderApplication> applications = [
|
||||||
),
|
),
|
||||||
generateFor: all,
|
generateFor: all,
|
||||||
),
|
),
|
||||||
|
applyToRoot(
|
||||||
|
const TypeScriptDefinitionBuilder(),
|
||||||
|
generateFor: all,
|
||||||
|
),
|
||||||
];
|
];
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
Loading…
Reference in a new issue