Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
80 changes: 41 additions & 39 deletions lib/renderTypeScript.js
Original file line number Diff line number Diff line change
@@ -1,61 +1,60 @@
const _ = require('lodash');
const _ = require("lodash");

// Private: Mappings from some Bolt built-in types to their TypeScript equivalents
const BOLT_BUILTIN_MAPPING = {
Any: 'any',
Boolean: 'boolean',
Number: 'number',
Null: 'void',
Object: 'Object',
String: 'string',
Any: "any",
Boolean: "boolean",
Number: "number",
Null: "void",
Object: "Object",
String: "string"
};

function convertBuiltin(builtin) {
return BOLT_BUILTIN_MAPPING[builtin] || builtin;
}


function ts(type) {
if (typeof type === 'string') {
if (typeof type === "string") {
return convertBuiltin(type);
}

let str = convertBuiltin(type.name);

if (type.params && type.params.length > 0) {
str += '<';
str += type.params.map(ts).join(', ');
str += '>';
str += "<";
str += type.params.map(ts).join(", ");
str += ">";
}
return str;
}

function tse(type) {
if (typeof type === 'string') {
if (typeof type === "string") {
return convertBuiltin(type);
}

let str = type.name;

if (type.params && type.params.length > 0) {
str += '<';
str += type.params.map(ts).join(', ');
str += '>';
str += "<";
str += type.params.map(ts).join(", ");
str += ">";
}
return str;
}

// Private:
function unionPropertyLine(name, types) {
const isNullable = _.some(types, type => type.name === 'Null');
const tsTypes = types.filter(type => type.name !== 'Null');
const isNullable = _.some(types, type => type.name === "Null");
const tsTypes = types.filter(type => type.name !== "Null");

let str = '';
let str = "";
str += name;
str += isNullable ? '?' : '';
str += ': ';
str += tsTypes.map(ts).join(' | ');
str += ';';
str += isNullable ? "?" : "";
str += ": ";
str += tsTypes.map(ts).join(" | ");
str += ";";
return str;
}

Expand All @@ -66,7 +65,7 @@ function mapPropertyLine(name, typeDefiniton) {

function genericPropertyLine(name, typeDef) {
switch (typeDef.name) {
case 'Map':
case "Map":
return mapPropertyLine(name, typeDef);
default:
return `${name}: ${ts(typeDef)};`;
Expand All @@ -78,11 +77,11 @@ function propertyLine(property) {
const typeDef = property.definition;

switch (typeDef.type) {
case 'type':
case "type":
return `${name}: ${convertBuiltin(typeDef.name)};`;
case 'union':
case "union":
return unionPropertyLine(name, typeDef.types);
case 'generic':
case "generic":
return genericPropertyLine(name, typeDef);
default:
throw new Error(`Unknown type ${typeDef.type}`);
Expand All @@ -97,37 +96,40 @@ function propertyLine(property) {
// Note this will return `extends Any` for any Bolt defintion without any
// defined parent or properties.
function interfaceExtension(type) {
if (type.parent !== 'Object') {
if (type.parent !== 'Any' || type.parent === 'Any' && type.properties !== []) {
if (type.parent !== "Object") {
if (
type.parent !== "Any" ||
(type.parent === "Any" && type.properties !== [])
) {
return ` extends ${tse(type.definition.derivedFrom)}`;
}
return '';
return "";
}
return '';
return "";
}

// type - TopLevelType
function interfaceOpen(type) {
let str = '';
str += 'interface ';
let str = "";
str += "export interface ";
str += tse(type);
str += interfaceExtension(type);
str += ' {';
str += " {";
return str;
}

// simpleBoltSchema - SimpleBoltSchema
function render(simpleBoltSchema) {
let str = '';
let str = "";
simpleBoltSchema.types.forEach(type => {
str += interfaceOpen(type);
str += '\n';
str += "\n";
type.properties.forEach(property => {
str += ' ';
str += " ";
str += propertyLine(property);
str += '\n';
str += "\n";
});
str += '}\n';
str += "}\n";
});
return str;
}
Expand Down
22 changes: 11 additions & 11 deletions samples/chat.ts
Original file line number Diff line number Diff line change
@@ -1,30 +1,30 @@
interface RoomInfo {
export interface RoomInfo {
name: NameString;
creator: UserID;
members: { [key: string]: Member; };
}
interface Post {
export interface Post {
from: UserID;
message: MessageString;
}
interface MessageString extends String {
export interface MessageString extends String {
}
interface Member {
export interface Member {
nickname: NameString;
isBanned: boolean;
}
interface NameString extends Any {
export interface NameString extends Any {
}
interface Timestamped<T> extends T {
export interface Timestamped<T> extends T {
created: Created;
}
interface Created extends Number {
export interface Created extends Number {
}
interface Modified extends Number {
export interface Modified extends Number {
}
interface PushID extends String {
export interface PushID extends String {
}
interface RoomID extends String {
export interface RoomID extends String {
}
interface UserID extends String {
export interface UserID extends String {
}
4 changes: 2 additions & 2 deletions samples/children-by-nesting.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
interface Child {
export interface Child {
age: number;
}
interface Parent {
export interface Parent {
children: { [key: string]: Child; };
}
4 changes: 2 additions & 2 deletions samples/children.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
interface Child {
export interface Child {
age: number;
}
interface Parent extends Any {
export interface Parent extends Any {
}
10 changes: 5 additions & 5 deletions samples/generics.ts
Original file line number Diff line number Diff line change
@@ -1,16 +1,16 @@
interface App {
export interface App {
users: { [key: string]: User; };
products: { [key: string]: Product; };
}
interface User {
export interface User {
name: string;
age: number;
}
interface Product {
export interface Product {
id: ProductID;
cost: number;
}
interface ProductID extends String {
export interface ProductID extends String {
}
interface PushID extends String {
export interface PushID extends String {
}
6 changes: 3 additions & 3 deletions samples/map-scalar.ts
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
interface Test {
export interface Test {
s1: ShortString;
s2: AliasString;
m1: { [key: string]: number; };
m2: { [key: string]: number; };
}
interface AliasString extends ShortString {
export interface AliasString extends ShortString {
}
interface ShortString extends String {
export interface ShortString extends String {
}
6 changes: 3 additions & 3 deletions samples/serialized.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
interface Product {
export interface Product {
name: string;
cost: number;
}
interface Serialized<T> extends T {
export interface Serialized<T> extends T {
counter: Counter;
}
interface Counter extends Number {
export interface Counter extends Number {
}
10 changes: 5 additions & 5 deletions samples/type-extension.ts
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
interface PositiveInteger extends Number {
export interface PositiveInteger extends Number {
}
interface UnixTimestamp extends PositiveInteger {
export interface UnixTimestamp extends PositiveInteger {
}
interface NonEmptyString extends String {
export interface NonEmptyString extends String {
}
interface URL extends String {
export interface URL extends String {
}
interface Test {
export interface Test {
time: UnixTimestamp;
name: NonEmptyString;
url: URL;
Expand Down
10 changes: 5 additions & 5 deletions samples/user-security.ts
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
interface Nickname extends String {
export interface Nickname extends String {
}
interface UserID extends String {
export interface UserID extends String {
}
interface MessageString extends String {
export interface MessageString extends String {
}
interface Timestamp extends Number {
export interface Timestamp extends Number {
}
interface Message {
export interface Message {
user: UserID;
message: MessageString;
timestamp: Timestamp;
Expand Down
Loading