Compare commits

...

3 Commits

4 changed files with 43 additions and 10 deletions

View File

@ -166,8 +166,8 @@ function extractCommonjsNamedExternals<+T: Node>(nodes: T[], path: string): Exte
function processExportNamedDeclaration(ctx: Context, node: ExportNamedDeclaration) {
if (isDeclaration(node.declaration)) {
node.declaration.leadingComments = node.leadingComments;
const reference = processDeclaration(ctx, node.declaration);
ctx.provide(reference, reference);
}

View File

@ -4,7 +4,7 @@ import wu from 'wu';
// @see flow#5376.
import type {
ArrayTypeAnnotation, ClassDeclaration, ClassProperty, Comment, FlowTypeAnnotation,
Node, ArrayTypeAnnotation, ClassDeclaration, ClassProperty, Comment, FlowTypeAnnotation,
GenericTypeAnnotation, InterfaceDeclaration, IntersectionTypeAnnotation, TypeAlias,
UnionTypeAnnotation, NullableTypeAnnotation, ObjectTypeIndexer, ObjectTypeProperty,
StringLiteralTypeAnnotation, ObjectTypeAnnotation, AnyTypeAnnotation, MixedTypeAnnotation,
@ -32,15 +32,27 @@ import {invariant} from '../utils';
function processTypeAlias(ctx: Context, node: TypeAlias | DeclareTypeAlias) {
const {name} = node.id;
// Forward declaration for the recursive types
ctx.define(name, t.createAny());
if (name != 'integer') {
// Forward declaration for the recursive types
ctx.define(name, t.createAny());
const type = makeType(ctx, node.right);
const type = makeType(ctx, node.right);
addComment(node, type);
// TODO: support function aliases.
invariant(type);
// TODO: support function aliases.
invariant(type);
ctx.define(name, type);
ctx.define(name, type);
}
}
function addComment(node: Node, type: Type) {
if (node.leadingComments) {
const cmt = node.leadingComments.map(c => c.value).join('\n').trim();
if (cmt) {
type.comment = cmt;
}
}
}
// TODO: type params.
@ -50,6 +62,7 @@ function processInterfaceDeclaration(
) {
const {name} = node.id;
const type = makeType(ctx, node.body);
addComment(node, type);
invariant(type);
@ -213,6 +226,7 @@ function makeField(ctx: Context, node: ObjectTypeProperty | ClassProperty): ?Fie
invariant(value);
type = makeType(ctx, value);
addComment(node, type);
}
if (!type) {
@ -236,12 +250,14 @@ function makeField(ctx: Context, node: ObjectTypeProperty | ClassProperty): ?Fie
function makeMap(ctx: Context, node: ObjectTypeIndexer): ?MapType {
const keys = makeType(ctx, node.key);
const values = makeType(ctx, node.value);
addComment(node, values);
return keys && values ? t.createMap(keys, values) : null;
}
function makeArray(ctx: Context, node: ArrayTypeAnnotation): ?ArrayType {
const items = makeType(ctx, node.elementType);
addComment(node, items);
return items != null ? t.createArray(items) : null;
}
@ -282,6 +298,9 @@ function makeIntersection(ctx: Context, node: IntersectionTypeAnnotation): ?Type
function makeReference(ctx: Context, node: GenericTypeAnnotation): ?Type {
const {name} = node.id;
if (name == 'integer') {
return t.createNumber('i64');
}
const params = node.typeParameters
&& wu(node.typeParameters.params).map(n => makeType(ctx, n)).toArray();

View File

@ -12,6 +12,7 @@ export type Schema = boolean | {
id?: string,
$ref?: string,
$schema?: string,
$comment?: string,
title?: string,
description?: string,
default?: mixed,
@ -45,6 +46,18 @@ export type Schema = boolean | {
};
function convert(fund: Fund, type: ?Type): Schema {
let schema = convertType(fund, type);
if (type && type.comment) {
if (schema === true) {
schema = { $comment: type.comment };
} else {
schema.$comment = type.comment;
}
}
return schema;
}
function convertType(fund: Fund, type: ?Type): Schema {
if (!type) {
return {
type: 'null',
@ -90,13 +103,13 @@ function convert(fund: Fund, type: ?Type): Schema {
};
case 'union':
const enumerate = wu(type.variants)
.filter(variant => variant.kind === 'literal')
.filter(variant => variant.kind === 'literal' && variant.value !== null)
.map(literal => (literal: $FlowFixMe).value)
.tap(value => invariant(value !== undefined))
.toArray();
const schemas = wu(type.variants)
.filter(variant => variant.kind !== 'literal')
.filter(variant => variant.kind !== 'literal' || variant.value === null)
.map(variant => convert(fund, variant))
.toArray();

View File

@ -21,6 +21,7 @@ export type TypeId = string[];
export type BaseType = {
id?: TypeId,
comment?: string,
};
export type RecordType = BaseType & {