Skip to content

Commit 7240348

Browse files
authored
Support graphql-jit (#2465)
1 parent 243c0c7 commit 7240348

File tree

5 files changed

+264
-4
lines changed

5 files changed

+264
-4
lines changed

.changeset/tidy-masks-reply.md

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'graphql-modules': minor
3+
---
4+
5+
Support graphql-jit

package.json

+1
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636
"@graphql-tools/merge": "9.0.0",
3737
"@graphql-yoga/node": "3.9.1",
3838
"@types/benchmark": "2.1.4",
39+
"graphql-jit": "0.8.4",
3940
"@types/express": "4.17.20",
4041
"@types/jest": "27.5.2",
4142
"@types/node": "18.18.7",

packages/graphql-modules/src/module/resolvers.ts

+5-1
Original file line numberDiff line numberDiff line change
@@ -142,7 +142,11 @@ function wrapResolver({
142142
) => {
143143
const ctx = {
144144
root,
145-
context: context.ɵgetModuleContext(config.id, context),
145+
context: isReferenceResolver
146+
? context.ɵgetModuleContext(config.id, context)
147+
: // We mark the context object as possibly undefined,
148+
// because graphql-jit for some reason doesn't pass it for isTypeOf or resolveType methods
149+
context?.ɵgetModuleContext(config.id, context),
146150
info,
147151
};
148152

packages/graphql-modules/tests/execution-context.spec.ts

+164
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import {
1111
CONTEXT,
1212
Inject,
1313
} from '../src';
14+
import { compileQuery, isCompiledQuery } from 'graphql-jit';
1415

1516
const posts = ['Foo', 'Bar'];
1617

@@ -634,3 +635,166 @@ test('accessing a singleton provider with execution context in another singleton
634635
});
635636
}
636637
});
638+
639+
test('accessing a singleton provider with execution context in another singleton provider (parallel requests and graphql-jit)', async () => {
640+
const spies = {
641+
foo: jest.fn(),
642+
bar: jest.fn(),
643+
baz: jest.fn(),
644+
};
645+
646+
const Name = new InjectionToken<Promise<string>>('name');
647+
648+
@Injectable({
649+
scope: Scope.Singleton,
650+
})
651+
class Foo {
652+
@ExecutionContext()
653+
public context!: ExecutionContext;
654+
655+
constructor() {
656+
spies.foo();
657+
}
658+
659+
async getName() {
660+
return this.context.injector.get(Name);
661+
}
662+
}
663+
664+
@Injectable({
665+
scope: Scope.Singleton,
666+
})
667+
class Bar {
668+
constructor(private foo: Foo) {
669+
spies.bar();
670+
}
671+
672+
async getName() {
673+
return this.foo.getName();
674+
}
675+
}
676+
677+
@Injectable({
678+
scope: Scope.Operation,
679+
})
680+
class Baz {
681+
constructor(
682+
@Inject(Name)
683+
private name: Promise<string>
684+
) {
685+
spies.baz();
686+
}
687+
688+
async getName() {
689+
return this.name;
690+
}
691+
}
692+
693+
const mod = createModule({
694+
id: 'mod',
695+
providers: [Foo, Bar, Baz],
696+
typeDefs: gql`
697+
type Query {
698+
name: Name
699+
}
700+
701+
type Name {
702+
getName: String
703+
getDependencyName: String
704+
getNameFromContext: String
705+
}
706+
`,
707+
resolvers: {
708+
Query: {
709+
name: () => ({}),
710+
},
711+
Name: {
712+
// make sure that __isTypeOf works with JIT
713+
__isTypeOf: () => true,
714+
getName: async (_a: {}, _b: {}, { injector }: GraphQLModules.Context) =>
715+
injector.get(Foo).getName(),
716+
getDependencyName: async (
717+
_a: {},
718+
_b: {},
719+
{ injector }: GraphQLModules.Context
720+
) => injector.get(Bar).getName(),
721+
getNameFromContext: async (
722+
_a: {},
723+
_b: {},
724+
{ injector }: GraphQLModules.Context
725+
) => injector.get(Baz).getName(),
726+
},
727+
},
728+
});
729+
730+
const app = createApplication({
731+
modules: [mod],
732+
providers: [
733+
{
734+
provide: Name,
735+
scope: Scope.Operation,
736+
useFactory(ctx) {
737+
return new Promise((resolve) => {
738+
setTimeout(() => {
739+
resolve(`request-${ctx.requestId}`);
740+
}, Math.random() * 200);
741+
});
742+
},
743+
deps: [CONTEXT],
744+
},
745+
],
746+
});
747+
748+
const requests = new Array({ length: 5 }).map((_, i) => i);
749+
750+
const query = gql`
751+
{
752+
name {
753+
getName
754+
getDependencyName
755+
getNameFromContext
756+
}
757+
}
758+
`;
759+
const compiledQuery = compileQuery(app.schema, query, undefined);
760+
761+
if (!isCompiledQuery(compiledQuery)) {
762+
throw new Error('Failed to to compile a query');
763+
}
764+
765+
const results = await Promise.all(
766+
requests.map(async (i) => {
767+
const controller = app.createOperationController({
768+
context: {
769+
requestId: i,
770+
},
771+
autoDestroy: false,
772+
});
773+
return Promise.resolve(
774+
compiledQuery.query(
775+
{}, // root
776+
controller.context, // context
777+
{} // variables
778+
)
779+
).finally(() => {
780+
controller.destroy();
781+
});
782+
})
783+
);
784+
785+
expect(spies.bar).toHaveBeenCalledTimes(results.length);
786+
expect(spies.foo).toHaveBeenCalledTimes(results.length);
787+
788+
for (let i = 0; i < results.length; i++) {
789+
const result = results[i];
790+
const expectedName = `request-${i}`;
791+
expect(result.errors).not.toBeDefined();
792+
expect(result.data).toEqual({
793+
name: {
794+
getName: expectedName,
795+
getDependencyName: expectedName,
796+
getNameFromContext: expectedName,
797+
},
798+
});
799+
}
800+
});

yarn.lock

+89-3
Original file line numberDiff line numberDiff line change
@@ -1605,6 +1605,11 @@
16051605
resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.52.0.tgz#78fe5f117840f69dc4a353adf9b9cd926353378c"
16061606
integrity sha512-mjZVbpaeMZludF2fsWLD0Z9gCref1Tk4i9+wddjRvpUNqqcndPkBD09N/Mapey0b3jaXbLm2kICwFv2E64QinA==
16071607

1608+
"@fastify/deepmerge@^1.0.0":
1609+
version "1.3.0"
1610+
resolved "https://registry.yarnpkg.com/@fastify/deepmerge/-/deepmerge-1.3.0.tgz#8116858108f0c7d9fd460d05a7d637a13fe3239a"
1611+
integrity sha512-J8TOSBq3SoZbDhM9+R/u77hP93gz/rajSA+K2kGyijPpORPWUXHUpTaleoj+92As0S9uPRP7Oi8IqMf0u+ro6A==
1612+
16081613
16091614
version "2.3.0"
16101615
resolved "https://registry.yarnpkg.com/@giscus/react/-/react-2.3.0.tgz#1c13f2f96bb67684d4f5288dc1ed3155ff307ce4"
@@ -1755,7 +1760,7 @@
17551760
tslib "^2.4.0"
17561761
value-or-promise "^1.0.12"
17571762

1758-
"@graphql-typed-document-node/[email protected]", "@graphql-typed-document-node/core@^3.1.0", "@graphql-typed-document-node/core@^3.1.1":
1763+
"@graphql-typed-document-node/[email protected]", "@graphql-typed-document-node/core@^3.1.0", "@graphql-typed-document-node/core@^3.1.1", "@graphql-typed-document-node/core@^3.2.0":
17591764
version "3.2.0"
17601765
resolved "https://registry.yarnpkg.com/@graphql-typed-document-node/core/-/core-3.2.0.tgz#5f3d96ec6b2354ad6d8a28bf216a1d97b5426861"
17611766
integrity sha512-mB9oAsNCm9aM3/SOv4YtBMqZbYj10R7dkq8byBqxGY/ncFwhf2oQzMV+LCRlWoDSEBJ3COiR1yeDvMtsoOsuFQ==
@@ -3339,6 +3344,13 @@ agentkeepalive@^4.1.4:
33393344
dependencies:
33403345
humanize-ms "^1.2.1"
33413346

3347+
ajv-formats@^2.1.1:
3348+
version "2.1.1"
3349+
resolved "https://registry.yarnpkg.com/ajv-formats/-/ajv-formats-2.1.1.tgz#6e669400659eb74973bbf2e33327180a0996b520"
3350+
integrity sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==
3351+
dependencies:
3352+
ajv "^8.0.0"
3353+
33423354
ajv-keywords@^3.5.2:
33433355
version "3.5.2"
33443356
resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d"
@@ -3354,6 +3366,16 @@ ajv@^6.12.4:
33543366
json-schema-traverse "^0.4.1"
33553367
uri-js "^4.2.2"
33563368

3369+
ajv@^8.0.0, ajv@^8.10.0:
3370+
version "8.12.0"
3371+
resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.12.0.tgz#d1a0527323e22f53562c567c00991577dfbe19d1"
3372+
integrity sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==
3373+
dependencies:
3374+
fast-deep-equal "^3.1.1"
3375+
json-schema-traverse "^1.0.0"
3376+
require-from-string "^2.0.2"
3377+
uri-js "^4.2.2"
3378+
33573379
[email protected], algoliasearch@^4.14.3:
33583380
version "4.19.1"
33593381
resolved "https://registry.yarnpkg.com/algoliasearch/-/algoliasearch-4.19.1.tgz#18111fb422eaf841737adb92d5ab12133d244218"
@@ -6210,6 +6232,19 @@ [email protected], fast-json-stable-stringify@^2.0.0, fast-json-sta
62106232
resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633"
62116233
integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==
62126234

6235+
fast-json-stringify@^5.7.0:
6236+
version "5.9.0"
6237+
resolved "https://registry.yarnpkg.com/fast-json-stringify/-/fast-json-stringify-5.9.0.tgz#fdf029f72e2548a55aca87ed8b238364a8619f59"
6238+
integrity sha512-hXu5mchOrV7r1wzY2na0VEJZbb2gUAv5Mrlnq1QvdhZHt8k3pYnwZ6YEVbasbvPc1Ki+FyeTRJW8yDN9jN40yQ==
6239+
dependencies:
6240+
"@fastify/deepmerge" "^1.0.0"
6241+
ajv "^8.10.0"
6242+
ajv-formats "^2.1.1"
6243+
fast-deep-equal "^3.1.3"
6244+
fast-uri "^2.1.0"
6245+
json-schema-ref-resolver "^1.0.1"
6246+
rfdc "^1.2.0"
6247+
62136248
fast-levenshtein@^2.0.6, fast-levenshtein@~2.0.6:
62146249
version "2.0.6"
62156250
resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917"
@@ -6222,6 +6257,11 @@ fast-querystring@^1.1.1:
62226257
dependencies:
62236258
fast-decode-uri-component "^1.0.1"
62246259

6260+
fast-uri@^2.1.0:
6261+
version "2.3.0"
6262+
resolved "https://registry.yarnpkg.com/fast-uri/-/fast-uri-2.3.0.tgz#bdae493942483d299e7285dcb4627767d42e2793"
6263+
integrity sha512-eel5UKGn369gGEWOqBShmFJWfq/xSJvsgDzgLYC845GneayWvXBf0lJCBn5qTABfewy1ZDPoaR5OZCP+kssfuw==
6264+
62256265
fast-url-parser@^1.1.3:
62266266
version "1.1.3"
62276267
resolved "https://registry.yarnpkg.com/fast-url-parser/-/fast-url-parser-1.1.3.tgz#f4af3ea9f34d8a271cf58ad2b3759f431f0b318d"
@@ -6472,6 +6512,13 @@ fuzzy@^0.1.3:
64726512
resolved "https://registry.yarnpkg.com/fuzzy/-/fuzzy-0.1.3.tgz#4c76ec2ff0ac1a36a9dccf9a00df8623078d4ed8"
64736513
integrity sha512-/gZffu4ykarLrCiP3Ygsa86UAo1E5vEVlvTrpkKywXSbP9Xhln3oSp9QSV57gEq3JFFpGJ4GZ+5zdEp3FcUh4w==
64746514

6515+
generate-function@^2.3.1:
6516+
version "2.3.1"
6517+
resolved "https://registry.yarnpkg.com/generate-function/-/generate-function-2.3.1.tgz#f069617690c10c868e73b8465746764f97c3479f"
6518+
integrity sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==
6519+
dependencies:
6520+
is-property "^1.0.2"
6521+
64756522
gensync@^1.0.0-beta.2:
64766523
version "1.0.0-beta.2"
64776524
resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0"
@@ -6676,6 +6723,18 @@ graphemer@^1.4.0:
66766723
resolved "https://registry.yarnpkg.com/graphemer/-/graphemer-1.4.0.tgz#fb2f1d55e0e3a1849aeffc90c4fa0dd53a0e66c6"
66776724
integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==
66786725

6726+
6727+
version "0.8.4"
6728+
resolved "https://registry.yarnpkg.com/graphql-jit/-/graphql-jit-0.8.4.tgz#53c2e43b90ec98ea0942f4062516de910fbff709"
6729+
integrity sha512-4KRrJ1ROy3Usgbl3eAoUMfdfZCRjkcw9cCGT7QwTUIHm9dPGaSaldxzGUttyjErU0rsYEb6WWyb6mMh5r6lEoQ==
6730+
dependencies:
6731+
"@graphql-typed-document-node/core" "^3.2.0"
6732+
fast-json-stringify "^5.7.0"
6733+
generate-function "^2.3.1"
6734+
lodash.memoize "^4.1.2"
6735+
lodash.merge "4.6.2"
6736+
lodash.mergewith "4.6.2"
6737+
66796738
66806739
version "2.0.0"
66816740
resolved "https://registry.yarnpkg.com/graphql-subscriptions/-/graphql-subscriptions-2.0.0.tgz#11ec181d475852d8aec879183e8e1eb94f2eb79a"
@@ -7464,6 +7523,11 @@ is-potential-custom-element-name@^1.0.1:
74647523
resolved "https://registry.yarnpkg.com/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz#171ed6f19e3ac554394edf78caa05784a45bebb5"
74657524
integrity sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==
74667525

7526+
is-property@^1.0.2:
7527+
version "1.0.2"
7528+
resolved "https://registry.yarnpkg.com/is-property/-/is-property-1.0.2.tgz#57fe1c4e48474edd65b09911f26b1cd4095dda84"
7529+
integrity sha512-Ks/IoX00TtClbGQr4TWXemAnktAQvYB7HzcCxDGqEZU6oCmb2INHuOoKxbtR+HFkmYWBKv/dOZtGRiAjDhj92g==
7530+
74677531
is-redirect@^1.0.0:
74687532
version "1.0.0"
74697533
resolved "https://registry.yarnpkg.com/is-redirect/-/is-redirect-1.0.0.tgz#1d03dded53bd8db0f30c26e4f95d36fc7c87dc24"
@@ -8184,11 +8248,23 @@ json-parse-even-better-errors@^2.3.0:
81848248
resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d"
81858249
integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==
81868250

8251+
json-schema-ref-resolver@^1.0.1:
8252+
version "1.0.1"
8253+
resolved "https://registry.yarnpkg.com/json-schema-ref-resolver/-/json-schema-ref-resolver-1.0.1.tgz#6586f483b76254784fc1d2120f717bdc9f0a99bf"
8254+
integrity sha512-EJAj1pgHc1hxF6vo2Z3s69fMjO1INq6eGHXZ8Z6wCQeldCuwxGK9Sxf4/cScGn3FZubCVUehfWtcDM/PLteCQw==
8255+
dependencies:
8256+
fast-deep-equal "^3.1.3"
8257+
81878258
json-schema-traverse@^0.4.1:
81888259
version "0.4.1"
81898260
resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660"
81908261
integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==
81918262

8263+
json-schema-traverse@^1.0.0:
8264+
version "1.0.0"
8265+
resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2"
8266+
integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==
8267+
81928268
json-stable-stringify-without-jsonify@^1.0.1:
81938269
version "1.0.1"
81948270
resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651"
@@ -8453,11 +8529,16 @@ [email protected], lodash.memoize@^4.1.2:
84538529
resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe"
84548530
integrity sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==
84558531

8456-
lodash.merge@^4.6.2:
8532+
lodash.merge@4.6.2, lodash.merge@^4.6.2:
84578533
version "4.6.2"
84588534
resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a"
84598535
integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==
84608536

8537+
8538+
version "4.6.2"
8539+
resolved "https://registry.yarnpkg.com/lodash.mergewith/-/lodash.mergewith-4.6.2.tgz#617121f89ac55f59047c7aec1ccd6654c6590f55"
8540+
integrity sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==
8541+
84618542
lodash.sortby@^4.7.0:
84628543
version "4.7.0"
84638544
resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438"
@@ -11165,6 +11246,11 @@ require-directory@^2.1.1:
1116511246
resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42"
1116611247
integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==
1116711248

11249+
require-from-string@^2.0.2:
11250+
version "2.0.2"
11251+
resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909"
11252+
integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==
11253+
1116811254
require-main-filename@^2.0.0:
1116911255
version "2.0.0"
1117011256
resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b"
@@ -11251,7 +11337,7 @@ reusify@^1.0.4:
1125111337
resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76"
1125211338
integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==
1125311339

11254-
rfdc@^1.3.0:
11340+
rfdc@^1.2.0, rfdc@^1.3.0:
1125511341
version "1.3.0"
1125611342
resolved "https://registry.yarnpkg.com/rfdc/-/rfdc-1.3.0.tgz#d0b7c441ab2720d05dc4cf26e01c89631d9da08b"
1125711343
integrity sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==

0 commit comments

Comments
 (0)