Skip to content

Commit d7f8c9d

Browse files
committed
Merge pull request #15 from Aweary/master
Add support for ARRAY and ENUM in TypeMapper
2 parents c31358a + a1b71fa commit d7f8c9d

File tree

3 files changed

+98
-23
lines changed

3 files changed

+98
-23
lines changed

src/typeMapper.js

Lines changed: 60 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,66 @@
1-
import { GraphQLInt, GraphQLString, GraphQLBoolean, GraphQLFloat } from 'graphql';
1+
import {
2+
GraphQLInt,
3+
GraphQLString,
4+
GraphQLBoolean,
5+
GraphQLFloat,
6+
GraphQLEnumType,
7+
GraphQLList
8+
} from 'graphql';
29

10+
/**
11+
* Checks the type of the sequelize data type and
12+
* returns the corresponding type in GraphQL
13+
* @param {Object} sequelizeType
14+
* @param {Object} sequelizeTypes
15+
* @return {Function} GraphQL type declaration
16+
*/
317
export function toGraphQL(sequelizeType, sequelizeTypes) {
4-
if (sequelizeType instanceof sequelizeTypes.BOOLEAN) {
5-
return GraphQLBoolean;
6-
} else if (sequelizeType instanceof sequelizeTypes.FLOAT) {
7-
return GraphQLFloat;
8-
} else if (sequelizeType instanceof sequelizeTypes.INTEGER) {
9-
return GraphQLInt;
10-
} else if (
11-
sequelizeType instanceof sequelizeTypes.STRING ||
12-
sequelizeType instanceof sequelizeTypes.TEXT ||
13-
sequelizeType instanceof sequelizeTypes.UUID ||
14-
sequelizeType instanceof sequelizeTypes.DATE
15-
) {
16-
return GraphQLString;
17-
} else if (sequelizeType instanceof sequelizeTypes.VIRTUAL) {
18-
if (sequelizeType.returnType) {
19-
return toGraphQL(sequelizeType.returnType, sequelizeTypes);
20-
}
2118

19+
const {
20+
BOOLEAN,
21+
ENUM,
22+
FLOAT,
23+
INTEGER,
24+
STRING,
25+
TEXT,
26+
UUID,
27+
DATE,
28+
ARRAY,
29+
VIRTUAL
30+
} = sequelizeTypes;
31+
32+
if (sequelizeType instanceof BOOLEAN) return GraphQLBoolean;
33+
if (sequelizeType instanceof FLOAT) return GraphQLFloat;
34+
if (sequelizeType instanceof INTEGER) return GraphQLInt;
35+
36+
if (sequelizeType instanceof STRING ||
37+
sequelizeType instanceof TEXT ||
38+
sequelizeType instanceof UUID ||
39+
sequelizeType instanceof DATE) {
2240
return GraphQLString;
23-
} else {
24-
throw new Error(`Unable to convert ${sequelizeType.key || sequelizeType.toSql()} to a GraphQL type`);
2541
}
42+
43+
if (sequelizeType instanceof ARRAY) {
44+
let elementType = toGraphQL(sequelizeType.type, sequelizeTypes);
45+
return new GraphQLList(elementType);
46+
}
47+
48+
if (sequelizeType instanceof ENUM) {
49+
return new GraphQLEnumType({
50+
values: sequelizeType.values.reduce((obj, value) => {
51+
obj[value] = {value};
52+
return obj;
53+
}, {})
54+
});
55+
}
56+
57+
if (sequelizeType instanceof VIRTUAL) {
58+
let returnType = sequelizeType.returnType
59+
? toGraphQL(sequelizeType.returnType, sequelizeTypes)
60+
: GraphQLString;
61+
return returnType;
62+
}
63+
64+
throw new Error(`Unable to convert ${sequelizeType.key || sequelizeType.toSql()} to a GraphQL type`);
65+
2666
}

test/attributeFields.test.js

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,9 @@ import {
1212
GraphQLInt,
1313
GraphQLFloat,
1414
GraphQLNonNull,
15-
GraphQLBoolean
15+
GraphQLBoolean,
16+
GraphQLEnumType,
17+
GraphQLList
1618
} from 'graphql';
1719

1820
describe('attributeFields', function () {
@@ -30,6 +32,12 @@ describe('attributeFields', function () {
3032
float: {
3133
type: Sequelize.FLOAT
3234
},
35+
enum: {
36+
type: Sequelize.ENUM('first', 'second')
37+
},
38+
list: {
39+
type: Sequelize.ARRAY(Sequelize.STRING)
40+
},
3341
virtualInteger: {
3442
type: new Sequelize.VIRTUAL(Sequelize.INTEGER)
3543
},
@@ -43,7 +51,7 @@ describe('attributeFields', function () {
4351
it('should return fields for a simple model', function () {
4452
var fields = attributeFields(Model);
4553

46-
expect(Object.keys(fields)).to.deep.equal(['id', 'email', 'firstName', 'lastName', 'float', 'virtualInteger', 'virtualBoolean']);
54+
expect(Object.keys(fields)).to.deep.equal(['id', 'email', 'firstName', 'lastName', 'float', 'enum', 'list', 'virtualInteger', 'virtualBoolean']);
4755

4856
expect(fields.id.type).to.be.an.instanceOf(GraphQLNonNull);
4957
expect(fields.id.type.ofType).to.equal(GraphQLInt);
@@ -55,6 +63,10 @@ describe('attributeFields', function () {
5563

5664
expect(fields.lastName.type).to.equal(GraphQLString);
5765

66+
expect(fields.enum.type).to.be.an.instanceOf(GraphQLEnumType);
67+
68+
expect(fields.list.type).to.be.an.instanceOf(GraphQLList);
69+
5870
expect(fields.float.type).to.equal(GraphQLFloat);
5971

6072
expect(fields.virtualInteger.type).to.equal(GraphQLInt);
@@ -64,7 +76,7 @@ describe('attributeFields', function () {
6476

6577
it('should be possible to exclude fields', function () {
6678
var fields = attributeFields(Model, {
67-
exclude: ['id', 'email', 'float', 'virtualInteger', 'virtualBoolean']
79+
exclude: ['id', 'email', 'float', 'enum', 'list', 'virtualInteger', 'virtualBoolean']
6880
});
6981

7082
expect(Object.keys(fields)).to.deep.equal(['firstName', 'lastName']);

test/typeMapper.test.js

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
import { expect } from 'chai';
2+
import typeMapper from '../src/typeMapper';
3+
4+
import {
5+
BOOLEAN,
6+
ENUM,
7+
FLOAT,
8+
INTEGER,
9+
STRING
10+
} from 'sequelize';
11+
12+
import {
13+
GraphQLString,
14+
GraphQLInt,
15+
GraphQLBoolean,
16+
GraphQLFloat,
17+
GraphQLEnumType,
18+
GraphQLList
19+
} from 'graphql';
20+
21+
describe('typeMapper', () => {
22+
// TODO write tests for typeMapper
23+
})

0 commit comments

Comments
 (0)