Skip to content

Commit 4c19870

Browse files
committed
fix(fieldsConverter): Now reuse generated types for recursive schemas
eg. User.friends = [User] now works correctly closes: #20
1 parent 2807ae1 commit 4c19870

File tree

5 files changed

+73
-59
lines changed

5 files changed

+73
-59
lines changed

.eslintrc

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,14 @@
55
"no-underscore-dangle": 0,
66
"no-unused-expressions": 0,
77
"arrow-body-style": 0,
8-
"import/no-extraneous-dependencies": ["error", {"devDependencies": true}]
8+
"import/no-extraneous-dependencies": ["error", {"devDependencies": true}],
9+
"comma-dangle": ["error", {
10+
"arrays": "always-multiline",
11+
"objects": "always-multiline",
12+
"imports": "always-multiline",
13+
"exports": "always-multiline",
14+
"functions": "ignore",
15+
}]
916
},
1017
"env": {
1118
"mocha": true

package.json

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -49,16 +49,16 @@
4949
"chai-as-promised": "6.0.0",
5050
"chai-spies": "0.7.1",
5151
"cz-conventional-changelog": "1.2.0",
52-
"eslint": "^3.14.0",
52+
"eslint": "^3.14.1",
5353
"eslint-config-airbnb-base": "^11.0.1",
5454
"eslint-plugin-flowtype": "^2.30.0",
5555
"eslint-plugin-import": "^2.2.0",
5656
"flow-bin": "^0.38.0",
57-
"graphql": "^0.9.0",
58-
"graphql-compose": "^1.10.0",
59-
"graphql-compose-connection": "^2.1.2",
57+
"graphql": "^0.9.1",
58+
"graphql-compose": "^1.12.1",
59+
"graphql-compose-connection": "^2.1.3",
6060
"mocha": "^3.2.0",
61-
"mongoose": "^4.7.8",
61+
"mongoose": "^4.8.4",
6262
"nyc": "^10.1.2",
6363
"rimraf": "2.5.4",
6464
"sane": "^1.5.0",

src/__tests__/composeWithMongoose-test.js

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,16 @@
11
/* eslint-disable no-unused-expressions */
22

33
import { expect } from 'chai';
4-
import { UserModel } from '../__mocks__/userModel.js';
5-
import { composeWithMongoose } from '../composeWithMongoose';
4+
import mongoose from 'mongoose';
65
import { TypeComposer, InputTypeComposer } from 'graphql-compose';
6+
import { UserModel } from '../__mocks__/userModel';
7+
import { composeWithMongoose } from '../composeWithMongoose';
78
import typeStorage from '../typeStorage';
89

910
describe('composeWithMongoose ->', () => {
1011
beforeEach(() => {
1112
typeStorage.clear();
13+
UserModel.schema._gqcTypeComposer = undefined;
1214
});
1315

1416
describe('mongooseModelToTypeComposer()', () => {
@@ -21,6 +23,8 @@ describe('composeWithMongoose ->', () => {
2123
it('should set type name from model or opts.name', () => {
2224
expect(composeWithMongoose(UserModel).getTypeName())
2325
.equal(UserModel.modelName);
26+
27+
UserModel.schema._gqcTypeComposer = undefined;
2428
expect(composeWithMongoose(UserModel, { name: 'Ok' }).getTypeName())
2529
.equal('Ok');
2630
});
@@ -169,5 +173,18 @@ describe('composeWithMongoose ->', () => {
169173
const inputConposer = new InputTypeComposer(filterArgInFindOne.type);
170174
expect(inputConposer.isRequired('age')).to.be.true;
171175
});
176+
177+
it('should use cached type to avoid maximum call stack size exceeded', () => {
178+
const PersonSchema = new mongoose.Schema({
179+
name: String,
180+
});
181+
PersonSchema.add({
182+
spouse: PersonSchema,
183+
friends: [PersonSchema],
184+
});
185+
const PersonModel = mongoose.model('Person', PersonSchema);
186+
const tc = composeWithMongoose(PersonModel);
187+
expect(tc.getFields()).to.contain.keys(['_id', 'name', 'spouse', 'friends']);
188+
});
172189
});
173190
});

src/fieldsConverter.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -148,6 +148,7 @@ export function convertModelToGraphQL(
148148
})
149149
)
150150
);
151+
model.schema._gqcTypeComposer = typeComposer; // eslint-disable-line
151152

152153
const mongooseFields = getFieldsFromModel(model, typeName);
153154
const graphqlFields = {};

yarn.lock

Lines changed: 40 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -656,14 +656,7 @@ babel-register@^6.22.0:
656656
mkdirp "^0.5.1"
657657
source-map-support "^0.4.2"
658658

659-
660-
version "6.11.6"
661-
resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.11.6.tgz#6db707fef2d49c49bfa3cb64efdb436b518b8222"
662-
dependencies:
663-
core-js "^2.4.0"
664-
regenerator-runtime "^0.9.5"
665-
666-
babel-runtime@^6.18.0, babel-runtime@^6.20.0, babel-runtime@^6.22.0:
659+
babel-runtime@^6.18.0, babel-runtime@^6.22.0:
667660
version "6.22.0"
668661
resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.22.0.tgz#1cf8b4ac67c77a4ddb0db2ae1f74de52ac4ca611"
669662
dependencies:
@@ -1244,9 +1237,9 @@ eslint-plugin-import@^2.2.0:
12441237
minimatch "^3.0.3"
12451238
pkg-up "^1.0.0"
12461239

1247-
eslint@^3.14.0:
1248-
version "3.14.0"
1249-
resolved "https://registry.yarnpkg.com/eslint/-/eslint-3.14.0.tgz#2c617e5f782fda5cbee5bc8be7ef5053af8e63a3"
1240+
eslint@^3.14.1:
1241+
version "3.14.1"
1242+
resolved "https://registry.yarnpkg.com/eslint/-/eslint-3.14.1.tgz#8a62175f2255109494747a1b25128d97b8eb3d97"
12501243
dependencies:
12511244
babel-code-frame "^6.16.0"
12521245
chalk "^1.1.3"
@@ -1653,22 +1646,22 @@ graceful-fs@^4.1.2, graceful-fs@^4.1.4, graceful-fs@^4.1.6:
16531646
version "1.0.1"
16541647
resolved "https://registry.yarnpkg.com/graceful-readlink/-/graceful-readlink-1.0.1.tgz#4cafad76bc62f02fa039b2f94e9a3dd3a391a725"
16551648

1656-
graphql-compose-connection@^2.1.2:
1657-
version "2.1.2"
1658-
resolved "https://registry.yarnpkg.com/graphql-compose-connection/-/graphql-compose-connection-2.1.2.tgz#dbe8cd2b51755a454d640171883e096daa9d5068"
1649+
graphql-compose-connection@^2.1.3:
1650+
version "2.1.3"
1651+
resolved "https://registry.yarnpkg.com/graphql-compose-connection/-/graphql-compose-connection-2.1.3.tgz#f9b9e6532e4049a4d2c2d7bf69b67c4d3128eaae"
16591652
dependencies:
1660-
babel-runtime "6.11.6"
1653+
babel-runtime "^6.22.0"
16611654

1662-
graphql-compose@^1.10.0:
1663-
version "1.10.0"
1664-
resolved "https://registry.yarnpkg.com/graphql-compose/-/graphql-compose-1.10.0.tgz#61b5050b29043c3e714576e85e8fa330b40a769e"
1655+
graphql-compose@^1.12.1:
1656+
version "1.12.1"
1657+
resolved "https://registry.yarnpkg.com/graphql-compose/-/graphql-compose-1.12.1.tgz#af194460b945591afaf70034527daf5e6e854dbc"
16651658
dependencies:
1666-
babel-runtime "^6.20.0"
1659+
babel-runtime "^6.22.0"
16671660
object-path "^0.11.3"
16681661

1669-
graphql@^0.9.0:
1670-
version "0.9.0"
1671-
resolved "https://registry.yarnpkg.com/graphql/-/graphql-0.9.0.tgz#ff9748a86ae81d4ecd2f2ba27fe5ac7a77734b1d"
1662+
graphql@^0.9.1:
1663+
version "0.9.1"
1664+
resolved "https://registry.yarnpkg.com/graphql/-/graphql-0.9.1.tgz#f4d154cbec054d4a5d3b1be95f23435c09aa86c8"
16721665
dependencies:
16731666
iterall "1.0.3"
16741667

@@ -2070,9 +2063,9 @@ jsprim@^1.2.2:
20702063
json-schema "0.2.3"
20712064
verror "1.3.6"
20722065

2073-
2074-
version "1.2.0"
2075-
resolved "https://registry.yarnpkg.com/kareem/-/kareem-1.2.0.tgz#59851e833feb1ce6cf60000e0c23acf75c8a3547"
2066+
2067+
version "1.2.1"
2068+
resolved "https://registry.yarnpkg.com/kareem/-/kareem-1.2.1.tgz#acdb8c8119845834abbfa58ade1cf9dea63dc752"
20762069

20772070
kind-of@^3.0.2:
20782071
version "3.0.4"
@@ -2355,35 +2348,35 @@ mocha@^3.2.0:
23552348
mkdirp "0.5.1"
23562349
supports-color "3.1.2"
23572350

2358-
2359-
version "2.1.6"
2360-
resolved "https://registry.yarnpkg.com/mongodb-core/-/mongodb-core-2.1.6.tgz#9d179e7487767c58993bb7c8d6685d035c346a42"
2351+
2352+
version "2.1.8"
2353+
resolved "https://registry.yarnpkg.com/mongodb-core/-/mongodb-core-2.1.8.tgz#b33e0370d0a59d97b6cb1ec610527be9e95ca2c0"
23612354
dependencies:
23622355
bson "~1.0.4"
23632356
require_optional "~1.0.0"
23642357

2365-
2366-
version "2.2.21"
2367-
resolved "https://registry.yarnpkg.com/mongodb/-/mongodb-2.2.21.tgz#f7ee56489600e0ac8024c062c0857ac04ddb5f48"
2358+
2359+
version "2.2.24"
2360+
resolved "https://registry.yarnpkg.com/mongodb/-/mongodb-2.2.24.tgz#80f40d6ec5bdec0ddecf0f9ce0144e794c46449a"
23682361
dependencies:
23692362
es6-promise "3.2.1"
2370-
mongodb-core "2.1.6"
2363+
mongodb-core "2.1.8"
23712364
readable-stream "2.1.5"
23722365

2373-
mongoose@^4.7.8:
2374-
version "4.7.8"
2375-
resolved "https://registry.yarnpkg.com/mongoose/-/mongoose-4.7.8.tgz#9e92de54fcb2e62cc41a543f5f810b0dd7c5ff3d"
2366+
mongoose@^4.8.4:
2367+
version "4.8.4"
2368+
resolved "https://registry.yarnpkg.com/mongoose/-/mongoose-4.8.4.tgz#091ca76f404355120a0b497bad6cc2b7d21c83ae"
23762369
dependencies:
23772370
async "2.1.4"
23782371
bson "~1.0.4"
23792372
hooks-fixed "1.2.0"
2380-
kareem "1.2.0"
2381-
mongodb "2.2.21"
2373+
kareem "1.2.1"
2374+
mongodb "2.2.24"
23822375
mpath "0.2.1"
23832376
mpromise "0.5.5"
2384-
mquery "2.0.0"
2377+
mquery "2.2.3"
23852378
ms "0.7.2"
2386-
muri "1.2.0"
2379+
muri "1.2.1"
23872380
regexp-clone "0.0.1"
23882381
sliced "1.0.1"
23892382

@@ -2395,9 +2388,9 @@ [email protected]:
23952388
version "0.5.5"
23962389
resolved "https://registry.yarnpkg.com/mpromise/-/mpromise-0.5.5.tgz#f5b24259d763acc2257b0a0c8c6d866fd51732e6"
23972390

2398-
mquery@2.0.0:
2399-
version "2.0.0"
2400-
resolved "https://registry.yarnpkg.com/mquery/-/mquery-2.0.0.tgz#b5abc850b90dffc3e10ae49b4b6e7a479752df22"
2391+
mquery@2.2.3:
2392+
version "2.2.3"
2393+
resolved "https://registry.yarnpkg.com/mquery/-/mquery-2.2.3.tgz#a4703b64fb6734fce51d784a4df095cabf1a8f57"
24012394
dependencies:
24022395
bluebird "2.10.2"
24032396
debug "2.2.0"
@@ -2412,9 +2405,9 @@ [email protected]:
24122405
version "0.7.2"
24132406
resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.2.tgz#ae25cf2512b3885a1d95d7f037868d8431124765"
24142407

2415-
2416-
version "1.2.0"
2417-
resolved "https://registry.yarnpkg.com/muri/-/muri-1.2.0.tgz#b86383c902920b09ebe62af0e75c94de5f33cd3d"
2408+
2409+
version "1.2.1"
2410+
resolved "https://registry.yarnpkg.com/muri/-/muri-1.2.1.tgz#ec7ea5ce6ca6a523eb1ab35bacda5fa816c9aa3c"
24182411

24192412
24202413
version "0.0.5"
@@ -2819,7 +2812,7 @@ read-pkg@^1.0.0:
28192812
normalize-package-data "^2.3.2"
28202813
path-type "^1.0.0"
28212814

2822-
[email protected], "readable-stream@^2.0.0 || ^1.1.13", readable-stream@^2.0.2, readable-stream@~2.1.4:
2815+
[email protected], readable-stream@~2.1.4:
28232816
version "2.1.5"
28242817
resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.1.5.tgz#66fa8b720e1438b364681f2ad1a63c618448c9d0"
28252818
dependencies:
@@ -2831,7 +2824,7 @@ [email protected], "readable-stream@^2.0.0 || ^1.1.13", readable-stream@^2.0
28312824
string_decoder "~0.10.x"
28322825
util-deprecate "~1.0.1"
28332826

2834-
readable-stream@~2.0.0, readable-stream@~2.0.5:
2827+
"readable-stream@^2.0.0 || ^1.1.13", readable-stream@^2.0.2, readable-stream@~2.0.0, readable-stream@~2.0.5:
28352828
version "2.0.6"
28362829
resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.0.6.tgz#8f90341e68a53ccc928788dacfcd11b36eb9b78e"
28372830
dependencies:
@@ -2880,10 +2873,6 @@ regenerator-runtime@^0.10.0:
28802873
version "0.10.1"
28812874
resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.10.1.tgz#257f41961ce44558b18f7814af48c17559f9faeb"
28822875

2883-
regenerator-runtime@^0.9.5:
2884-
version "0.9.5"
2885-
resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.9.5.tgz#403d6d40a4bdff9c330dd9392dcbb2d9a8bba1fc"
2886-
28872876
28882877
version "0.9.8"
28892878
resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.9.8.tgz#0f88bb2bc03932ddb7b6b7312e68078f01026d6c"

0 commit comments

Comments
 (0)