@hazeljs/graphql 0.2.0-alpha.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (63) hide show
  1. package/LICENSE +192 -0
  2. package/README.md +124 -0
  3. package/dist/client/decorators.d.ts +44 -0
  4. package/dist/client/decorators.d.ts.map +1 -0
  5. package/dist/client/decorators.js +72 -0
  6. package/dist/client/decorators.test.d.ts +2 -0
  7. package/dist/client/decorators.test.d.ts.map +1 -0
  8. package/dist/client/decorators.test.js +102 -0
  9. package/dist/client/graphql.client.d.ts +25 -0
  10. package/dist/client/graphql.client.d.ts.map +1 -0
  11. package/dist/client/graphql.client.js +47 -0
  12. package/dist/client/graphql.client.test.d.ts +2 -0
  13. package/dist/client/graphql.client.test.d.ts.map +1 -0
  14. package/dist/client/graphql.client.test.js +79 -0
  15. package/dist/decorators/field.decorator.d.ts +23 -0
  16. package/dist/decorators/field.decorator.d.ts.map +1 -0
  17. package/dist/decorators/field.decorator.js +37 -0
  18. package/dist/decorators/field.decorator.test.d.ts +2 -0
  19. package/dist/decorators/field.decorator.test.d.ts.map +1 -0
  20. package/dist/decorators/field.decorator.test.js +67 -0
  21. package/dist/decorators/object-type.decorator.d.ts +21 -0
  22. package/dist/decorators/object-type.decorator.d.ts.map +1 -0
  23. package/dist/decorators/object-type.decorator.js +34 -0
  24. package/dist/decorators/object-type.decorator.test.d.ts +2 -0
  25. package/dist/decorators/object-type.decorator.test.d.ts.map +1 -0
  26. package/dist/decorators/object-type.decorator.test.js +45 -0
  27. package/dist/decorators/query-mutation.decorator.d.ts +25 -0
  28. package/dist/decorators/query-mutation.decorator.d.ts.map +1 -0
  29. package/dist/decorators/query-mutation.decorator.js +62 -0
  30. package/dist/decorators/query-mutation.decorator.test.d.ts +2 -0
  31. package/dist/decorators/query-mutation.decorator.test.d.ts.map +1 -0
  32. package/dist/decorators/query-mutation.decorator.test.js +176 -0
  33. package/dist/decorators/resolver.decorator.d.ts +25 -0
  34. package/dist/decorators/resolver.decorator.d.ts.map +1 -0
  35. package/dist/decorators/resolver.decorator.js +35 -0
  36. package/dist/decorators/resolver.decorator.test.d.ts +2 -0
  37. package/dist/decorators/resolver.decorator.test.d.ts.map +1 -0
  38. package/dist/decorators/resolver.decorator.test.js +36 -0
  39. package/dist/graphql.module.d.ts +31 -0
  40. package/dist/graphql.module.d.ts.map +1 -0
  41. package/dist/graphql.module.js +63 -0
  42. package/dist/graphql.module.test.d.ts +2 -0
  43. package/dist/graphql.module.test.d.ts.map +1 -0
  44. package/dist/graphql.module.test.js +85 -0
  45. package/dist/graphql.server.d.ts +34 -0
  46. package/dist/graphql.server.d.ts.map +1 -0
  47. package/dist/graphql.server.js +74 -0
  48. package/dist/graphql.server.test.d.ts +2 -0
  49. package/dist/graphql.server.test.d.ts.map +1 -0
  50. package/dist/graphql.server.test.js +79 -0
  51. package/dist/graphql.types.d.ts +36 -0
  52. package/dist/graphql.types.d.ts.map +1 -0
  53. package/dist/graphql.types.js +5 -0
  54. package/dist/index.d.ts +16 -0
  55. package/dist/index.d.ts.map +1 -0
  56. package/dist/index.js +39 -0
  57. package/dist/schema-builder.d.ts +9 -0
  58. package/dist/schema-builder.d.ts.map +1 -0
  59. package/dist/schema-builder.js +142 -0
  60. package/dist/schema-builder.test.d.ts +2 -0
  61. package/dist/schema-builder.test.d.ts.map +1 -0
  62. package/dist/schema-builder.test.js +182 -0
  63. package/package.json +56 -0
@@ -0,0 +1,35 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.RESOLVER_METADATA_KEY = void 0;
4
+ exports.Resolver = Resolver;
5
+ exports.getResolverMetadata = getResolverMetadata;
6
+ require("reflect-metadata");
7
+ exports.RESOLVER_METADATA_KEY = Symbol('graphql:resolver');
8
+ /**
9
+ * Marks a class as a GraphQL resolver (contains @Query and @Mutation handlers)
10
+ *
11
+ * @example
12
+ * ```typescript
13
+ * @Resolver()
14
+ * class UserResolver {
15
+ * @Query()
16
+ * user(@Arg('id') id: string) {
17
+ * return { id, name: 'John' };
18
+ * }
19
+ *
20
+ * @Mutation()
21
+ * createUser(@Arg('name') name: string) {
22
+ * return { id: '1', name };
23
+ * }
24
+ * }
25
+ * ```
26
+ */
27
+ function Resolver(name) {
28
+ return (target) => {
29
+ const meta = name ? { name } : {};
30
+ Reflect.defineMetadata(exports.RESOLVER_METADATA_KEY, meta, target);
31
+ };
32
+ }
33
+ function getResolverMetadata(target) {
34
+ return Reflect.getMetadata(exports.RESOLVER_METADATA_KEY, target);
35
+ }
@@ -0,0 +1,2 @@
1
+ import 'reflect-metadata';
2
+ //# sourceMappingURL=resolver.decorator.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolver.decorator.test.d.ts","sourceRoot":"","sources":["../../src/decorators/resolver.decorator.test.ts"],"names":[],"mappings":"AAAA,OAAO,kBAAkB,CAAC"}
@@ -0,0 +1,36 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ require("reflect-metadata");
10
+ const resolver_decorator_1 = require("./resolver.decorator");
11
+ describe('Resolver decorator', () => {
12
+ it('should add empty metadata when no name', () => {
13
+ let UserResolver = class UserResolver {
14
+ };
15
+ UserResolver = __decorate([
16
+ (0, resolver_decorator_1.Resolver)()
17
+ ], UserResolver);
18
+ const meta = (0, resolver_decorator_1.getResolverMetadata)(UserResolver);
19
+ expect(meta).toEqual({});
20
+ });
21
+ it('should add metadata with custom name', () => {
22
+ let UserResolver = class UserResolver {
23
+ };
24
+ UserResolver = __decorate([
25
+ (0, resolver_decorator_1.Resolver)('User')
26
+ ], UserResolver);
27
+ const meta = (0, resolver_decorator_1.getResolverMetadata)(UserResolver);
28
+ expect(meta).toEqual({ name: 'User' });
29
+ });
30
+ it('should return undefined for class without decorator', () => {
31
+ class Plain {
32
+ }
33
+ const meta = (0, resolver_decorator_1.getResolverMetadata)(Plain);
34
+ expect(meta).toBeUndefined();
35
+ });
36
+ });
@@ -0,0 +1,31 @@
1
+ import { GraphQLServer } from './graphql.server';
2
+ import type { GraphQLModuleConfig } from './graphql.types';
3
+ import type { Type } from '@hazeljs/core';
4
+ /**
5
+ * GraphQL module for HazelJS
6
+ * Decorator-based schema with @Resolver, @Query, @Mutation, @ObjectType, @Field
7
+ *
8
+ * @example
9
+ * ```typescript
10
+ * @HazelModule({
11
+ * imports: [
12
+ * GraphQLModule.forRoot({
13
+ * path: '/graphql',
14
+ * resolvers: [UserResolver, PostResolver],
15
+ * })
16
+ * ],
17
+ * })
18
+ * export class AppModule {}
19
+ * ```
20
+ */
21
+ export declare class GraphQLModule {
22
+ static forRoot(options: GraphQLModuleConfig & {
23
+ resolvers: Type<object>[];
24
+ }): {
25
+ module: typeof GraphQLModule;
26
+ providers: unknown[];
27
+ exports: Array<typeof GraphQLServer>;
28
+ global: boolean;
29
+ };
30
+ }
31
+ //# sourceMappingURL=graphql.module.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graphql.module.d.ts","sourceRoot":"","sources":["../src/graphql.module.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAC3D,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAQ1C;;;;;;;;;;;;;;;;GAgBG;AACH,qBAAa,aAAa;IACxB,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,mBAAmB,GAAG;QAAE,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,CAAA;KAAE,GAAG;QAC5E,MAAM,EAAE,OAAO,aAAa,CAAC;QAC7B,SAAS,EAAE,OAAO,EAAE,CAAC;QACrB,OAAO,EAAE,KAAK,CAAC,OAAO,aAAa,CAAC,CAAC;QACrC,MAAM,EAAE,OAAO,CAAC;KACjB;CAuBF"}
@@ -0,0 +1,63 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.GraphQLModule = void 0;
13
+ const core_1 = require("@hazeljs/core");
14
+ const graphql_server_1 = require("./graphql.server");
15
+ /** Eagerly resolves GraphQLServer so the early handler gets registered */
16
+ let GraphQLBootstrap = class GraphQLBootstrap {
17
+ constructor(_server) { }
18
+ };
19
+ GraphQLBootstrap = __decorate([
20
+ (0, core_1.Injectable)(),
21
+ __metadata("design:paramtypes", [graphql_server_1.GraphQLServer])
22
+ ], GraphQLBootstrap);
23
+ /**
24
+ * GraphQL module for HazelJS
25
+ * Decorator-based schema with @Resolver, @Query, @Mutation, @ObjectType, @Field
26
+ *
27
+ * @example
28
+ * ```typescript
29
+ * @HazelModule({
30
+ * imports: [
31
+ * GraphQLModule.forRoot({
32
+ * path: '/graphql',
33
+ * resolvers: [UserResolver, PostResolver],
34
+ * })
35
+ * ],
36
+ * })
37
+ * export class AppModule {}
38
+ * ```
39
+ */
40
+ class GraphQLModule {
41
+ static forRoot(options) {
42
+ const { resolvers, ...config } = options;
43
+ const graphqlProvider = {
44
+ provide: graphql_server_1.GraphQLServer,
45
+ useFactory: () => {
46
+ const container = core_1.Container.getInstance();
47
+ const hazelApp = container.resolve(core_1.HazelApp);
48
+ const server = new graphql_server_1.GraphQLServer(resolvers, container);
49
+ server.configure(config);
50
+ hazelApp.addEarlyHandler(server.getPath(), server.getHandler());
51
+ return server;
52
+ },
53
+ inject: [],
54
+ };
55
+ return {
56
+ module: GraphQLModule,
57
+ providers: [graphqlProvider, GraphQLBootstrap],
58
+ exports: [graphql_server_1.GraphQLServer],
59
+ global: true,
60
+ };
61
+ }
62
+ }
63
+ exports.GraphQLModule = GraphQLModule;
@@ -0,0 +1,2 @@
1
+ import 'reflect-metadata';
2
+ //# sourceMappingURL=graphql.module.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graphql.module.test.d.ts","sourceRoot":"","sources":["../src/graphql.module.test.ts"],"names":[],"mappings":"AAAA,OAAO,kBAAkB,CAAC"}
@@ -0,0 +1,85 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ require("reflect-metadata");
13
+ const core_1 = require("@hazeljs/core");
14
+ const core_2 = require("@hazeljs/core");
15
+ const graphql_module_1 = require("./graphql.module");
16
+ const graphql_server_1 = require("./graphql.server");
17
+ const query_mutation_decorator_1 = require("./decorators/query-mutation.decorator");
18
+ const resolver_decorator_1 = require("./decorators/resolver.decorator");
19
+ const core_3 = require("@hazeljs/core");
20
+ let TestResolver = class TestResolver {
21
+ hello() {
22
+ return 'world';
23
+ }
24
+ };
25
+ __decorate([
26
+ (0, query_mutation_decorator_1.Query)(),
27
+ __metadata("design:type", Function),
28
+ __metadata("design:paramtypes", []),
29
+ __metadata("design:returntype", void 0)
30
+ ], TestResolver.prototype, "hello", null);
31
+ TestResolver = __decorate([
32
+ (0, resolver_decorator_1.Resolver)()
33
+ ], TestResolver);
34
+ let TestModule = class TestModule {
35
+ };
36
+ TestModule = __decorate([
37
+ (0, core_3.HazelModule)({
38
+ imports: [
39
+ graphql_module_1.GraphQLModule.forRoot({
40
+ path: '/graphql',
41
+ resolvers: [TestResolver],
42
+ }),
43
+ ],
44
+ })
45
+ ], TestModule);
46
+ describe('GraphQLModule', () => {
47
+ let container;
48
+ const originalGetInstance = core_1.Container.getInstance;
49
+ beforeEach(() => {
50
+ container = core_1.Container.createTestInstance();
51
+ core_1.Container.getInstance = jest.fn(() => container);
52
+ });
53
+ afterEach(() => {
54
+ core_1.Container.getInstance = originalGetInstance;
55
+ });
56
+ describe('forRoot', () => {
57
+ it('should return module config with providers and exports', () => {
58
+ expect(TestModule).toBeDefined();
59
+ const config = graphql_module_1.GraphQLModule.forRoot({
60
+ path: '/graphql',
61
+ resolvers: [TestResolver],
62
+ });
63
+ expect(config.module).toBe(graphql_module_1.GraphQLModule);
64
+ expect(config.providers).toHaveLength(2);
65
+ expect(config.providers[0]).toMatchObject({ provide: graphql_server_1.GraphQLServer });
66
+ expect(config.providers[0].useFactory).toBeDefined();
67
+ expect(config.exports).toContain(graphql_server_1.GraphQLServer);
68
+ expect(config.global).toBe(true);
69
+ });
70
+ it('should create GraphQLServer via factory', () => {
71
+ const mockApp = { addEarlyHandler: jest.fn() };
72
+ container.register(core_2.HazelApp, mockApp);
73
+ container.register(TestResolver, new TestResolver());
74
+ const config = graphql_module_1.GraphQLModule.forRoot({
75
+ path: '/api/gql',
76
+ resolvers: [TestResolver],
77
+ });
78
+ const factory = config.providers[0].useFactory;
79
+ const server = factory();
80
+ expect(server).toBeInstanceOf(graphql_server_1.GraphQLServer);
81
+ expect(server.getPath()).toBe('/api/gql');
82
+ expect(mockApp.addEarlyHandler).toHaveBeenCalledWith('/api/gql', expect.any(Function));
83
+ });
84
+ });
85
+ });
@@ -0,0 +1,34 @@
1
+ import type { IncomingMessage, ServerResponse } from 'http';
2
+ import { GraphQLSchema } from 'graphql';
3
+ import { Container } from '@hazeljs/core';
4
+ import type { GraphQLModuleConfig } from './graphql.types';
5
+ /**
6
+ * GraphQL Server - builds schema from decorators and serves via graphql-http
7
+ */
8
+ export declare class GraphQLServer {
9
+ private readonly resolvers;
10
+ private readonly container;
11
+ private schema;
12
+ private handler;
13
+ private path;
14
+ private config;
15
+ constructor(resolvers: (new (...args: unknown[]) => object)[], container: Container);
16
+ configure(config: GraphQLModuleConfig): void;
17
+ /**
18
+ * Build schema and create the HTTP handler
19
+ */
20
+ build(): void;
21
+ /**
22
+ * Get the path where GraphQL is served
23
+ */
24
+ getPath(): string;
25
+ /**
26
+ * Handle incoming GraphQL request (call this for req.url matching path)
27
+ */
28
+ getHandler(): (req: IncomingMessage, res: ServerResponse) => void;
29
+ /**
30
+ * Get the built schema
31
+ */
32
+ getSchema(): GraphQLSchema | null;
33
+ }
34
+ //# sourceMappingURL=graphql.server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graphql.server.d.ts","sourceRoot":"","sources":["../src/graphql.server.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,MAAM,CAAC;AAC5D,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACxC,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAG1C,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAE3D;;GAEG;AACH,qBACa,aAAa;IAOtB,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,SAAS;IAP5B,OAAO,CAAC,MAAM,CAA8B;IAC5C,OAAO,CAAC,OAAO,CAAsE;IACrF,OAAO,CAAC,IAAI,CAAc;IAC1B,OAAO,CAAC,MAAM,CAA2B;gBAGtB,SAAS,EAAE,CAAC,KAAK,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,MAAM,CAAC,EAAE,EACjD,SAAS,EAAE,SAAS;IAGvC,SAAS,CAAC,MAAM,EAAE,mBAAmB,GAAG,IAAI;IAM5C;;OAEG;IACH,KAAK,IAAI,IAAI;IASb;;OAEG;IACH,OAAO,IAAI,MAAM;IAIjB;;OAEG;IACH,UAAU,IAAI,CAAC,GAAG,EAAE,eAAe,EAAE,GAAG,EAAE,cAAc,KAAK,IAAI;IAKjE;;OAEG;IACH,SAAS,IAAI,aAAa,GAAG,IAAI;CAGlC"}
@@ -0,0 +1,74 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ var __importDefault = (this && this.__importDefault) || function (mod) {
12
+ return (mod && mod.__esModule) ? mod : { "default": mod };
13
+ };
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.GraphQLServer = void 0;
16
+ const core_1 = require("@hazeljs/core");
17
+ const http_1 = require("graphql-http/lib/use/http");
18
+ const core_2 = require("@hazeljs/core");
19
+ const core_3 = __importDefault(require("@hazeljs/core"));
20
+ const schema_builder_1 = require("./schema-builder");
21
+ /**
22
+ * GraphQL Server - builds schema from decorators and serves via graphql-http
23
+ */
24
+ let GraphQLServer = class GraphQLServer {
25
+ constructor(resolvers, container) {
26
+ this.resolvers = resolvers;
27
+ this.container = container;
28
+ this.schema = null;
29
+ this.handler = null;
30
+ this.path = '/graphql';
31
+ this.config = {};
32
+ }
33
+ configure(config) {
34
+ this.config = config;
35
+ this.path = config.path ?? '/graphql';
36
+ core_3.default.info('GraphQL server configured', { path: this.path });
37
+ }
38
+ /**
39
+ * Build schema and create the HTTP handler
40
+ */
41
+ build() {
42
+ const builder = new schema_builder_1.SchemaBuilder();
43
+ this.schema = builder.buildSchema(this.resolvers, this.container);
44
+ this.handler = (0, http_1.createHandler)({
45
+ schema: this.schema,
46
+ });
47
+ core_3.default.info('GraphQL schema built from resolvers');
48
+ }
49
+ /**
50
+ * Get the path where GraphQL is served
51
+ */
52
+ getPath() {
53
+ return this.path;
54
+ }
55
+ /**
56
+ * Handle incoming GraphQL request (call this for req.url matching path)
57
+ */
58
+ getHandler() {
59
+ if (!this.handler)
60
+ this.build();
61
+ return this.handler;
62
+ }
63
+ /**
64
+ * Get the built schema
65
+ */
66
+ getSchema() {
67
+ return this.schema;
68
+ }
69
+ };
70
+ exports.GraphQLServer = GraphQLServer;
71
+ exports.GraphQLServer = GraphQLServer = __decorate([
72
+ (0, core_1.Injectable)(),
73
+ __metadata("design:paramtypes", [Array, core_2.Container])
74
+ ], GraphQLServer);
@@ -0,0 +1,2 @@
1
+ import 'reflect-metadata';
2
+ //# sourceMappingURL=graphql.server.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graphql.server.test.d.ts","sourceRoot":"","sources":["../src/graphql.server.test.ts"],"names":[],"mappings":"AAAA,OAAO,kBAAkB,CAAC"}
@@ -0,0 +1,79 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ require("reflect-metadata");
13
+ const core_1 = require("@hazeljs/core");
14
+ const core_2 = require("@hazeljs/core");
15
+ const graphql_server_1 = require("./graphql.server");
16
+ const query_mutation_decorator_1 = require("./decorators/query-mutation.decorator");
17
+ const resolver_decorator_1 = require("./decorators/resolver.decorator");
18
+ jest.mock('graphql-http/lib/use/http', () => ({
19
+ createHandler: jest.fn().mockReturnValue(jest.fn()),
20
+ }));
21
+ let TestResolver = class TestResolver {
22
+ hello() {
23
+ return 'world';
24
+ }
25
+ };
26
+ __decorate([
27
+ (0, query_mutation_decorator_1.Query)(),
28
+ __metadata("design:type", Function),
29
+ __metadata("design:paramtypes", []),
30
+ __metadata("design:returntype", void 0)
31
+ ], TestResolver.prototype, "hello", null);
32
+ TestResolver = __decorate([
33
+ (0, core_2.Injectable)(),
34
+ (0, resolver_decorator_1.Resolver)()
35
+ ], TestResolver);
36
+ describe('GraphQLServer', () => {
37
+ let container;
38
+ beforeEach(() => {
39
+ container = core_1.Container.createTestInstance();
40
+ container.register(TestResolver, new TestResolver());
41
+ });
42
+ describe('configure', () => {
43
+ it('should set default path to /graphql', () => {
44
+ const server = new graphql_server_1.GraphQLServer([TestResolver], container);
45
+ expect(server.getPath()).toBe('/graphql');
46
+ });
47
+ it('should set custom path', () => {
48
+ const server = new graphql_server_1.GraphQLServer([TestResolver], container);
49
+ server.configure({ path: '/api/gql' });
50
+ expect(server.getPath()).toBe('/api/gql');
51
+ });
52
+ });
53
+ describe('getHandler', () => {
54
+ it('should build and return handler on first call', () => {
55
+ const server = new graphql_server_1.GraphQLServer([TestResolver], container);
56
+ const handler = server.getHandler();
57
+ expect(handler).toBeDefined();
58
+ expect(typeof handler).toBe('function');
59
+ });
60
+ it('should return same handler on subsequent calls', () => {
61
+ const server = new graphql_server_1.GraphQLServer([TestResolver], container);
62
+ const h1 = server.getHandler();
63
+ const h2 = server.getHandler();
64
+ expect(h1).toBe(h2);
65
+ });
66
+ });
67
+ describe('getSchema', () => {
68
+ it('should return null before build', () => {
69
+ const server = new graphql_server_1.GraphQLServer([TestResolver], container);
70
+ expect(server.getSchema()).toBeNull();
71
+ });
72
+ it('should return schema after getHandler', () => {
73
+ const server = new graphql_server_1.GraphQLServer([TestResolver], container);
74
+ server.getHandler();
75
+ expect(server.getSchema()).toBeDefined();
76
+ expect(server.getSchema()?.getQueryType()).toBeDefined();
77
+ });
78
+ });
79
+ });
@@ -0,0 +1,36 @@
1
+ /**
2
+ * Types for @hazeljs/graphql
3
+ */
4
+ export interface GraphQLModuleConfig {
5
+ path?: string;
6
+ playground?: boolean;
7
+ introspection?: boolean;
8
+ }
9
+ export interface ObjectTypeMetadata {
10
+ name: string;
11
+ description?: string;
12
+ }
13
+ export interface FieldMetadata {
14
+ name: string;
15
+ type: unknown;
16
+ description?: string;
17
+ nullable?: boolean;
18
+ }
19
+ export interface ResolverMetadata {
20
+ name?: string;
21
+ }
22
+ export interface QueryMetadata {
23
+ name?: string;
24
+ description?: string;
25
+ }
26
+ export interface MutationMetadata {
27
+ name?: string;
28
+ description?: string;
29
+ }
30
+ export interface ArgMetadata {
31
+ name: string;
32
+ type: unknown;
33
+ description?: string;
34
+ nullable?: boolean;
35
+ }
36
+ //# sourceMappingURL=graphql.types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graphql.types.d.ts","sourceRoot":"","sources":["../src/graphql.types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,mBAAmB;IAClC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,OAAO,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,OAAO,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB"}
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+ /**
3
+ * Types for @hazeljs/graphql
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,16 @@
1
+ /**
2
+ * @hazeljs/graphql - GraphQL server and client for HazelJS
3
+ *
4
+ * Server: decorator-based schema with @Resolver, @Query, @Mutation, @ObjectType, @Field
5
+ * Client: typed GraphQLClient for queries and mutations
6
+ */
7
+ export { GraphQLModule } from './graphql.module';
8
+ export { GraphQLServer } from './graphql.server';
9
+ export { ObjectType, getObjectTypeMetadata } from './decorators/object-type.decorator';
10
+ export { Field, getFieldMetadata } from './decorators/field.decorator';
11
+ export { Resolver, getResolverMetadata } from './decorators/resolver.decorator';
12
+ export { Query, Mutation, Arg, getQueryMetadata, getMutationMetadata, getArgMetadata, } from './decorators/query-mutation.decorator';
13
+ export { GraphQLClient } from './client/graphql.client';
14
+ export { GraphQLQuery, GraphQLMutation, GraphQLClientClass, getGraphQLClientConfig, } from './client/decorators';
15
+ export type { GraphQLModuleConfig, ObjectTypeMetadata, FieldMetadata, ResolverMetadata, QueryMetadata, MutationMetadata, ArgMetadata, } from './graphql.types';
16
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAGjD,OAAO,EAAE,UAAU,EAAE,qBAAqB,EAAE,MAAM,oCAAoC,CAAC;AACvF,OAAO,EAAE,KAAK,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AACvE,OAAO,EAAE,QAAQ,EAAE,mBAAmB,EAAE,MAAM,iCAAiC,CAAC;AAChF,OAAO,EACL,KAAK,EACL,QAAQ,EACR,GAAG,EACH,gBAAgB,EAChB,mBAAmB,EACnB,cAAc,GACf,MAAM,uCAAuC,CAAC;AAG/C,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AACxD,OAAO,EACL,YAAY,EACZ,eAAe,EACf,kBAAkB,EAClB,sBAAsB,GACvB,MAAM,qBAAqB,CAAC;AAG7B,YAAY,EACV,mBAAmB,EACnB,kBAAkB,EAClB,aAAa,EACb,gBAAgB,EAChB,aAAa,EACb,gBAAgB,EAChB,WAAW,GACZ,MAAM,iBAAiB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,39 @@
1
+ "use strict";
2
+ /**
3
+ * @hazeljs/graphql - GraphQL server and client for HazelJS
4
+ *
5
+ * Server: decorator-based schema with @Resolver, @Query, @Mutation, @ObjectType, @Field
6
+ * Client: typed GraphQLClient for queries and mutations
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.getGraphQLClientConfig = exports.GraphQLClientClass = exports.GraphQLMutation = exports.GraphQLQuery = exports.GraphQLClient = exports.getArgMetadata = exports.getMutationMetadata = exports.getQueryMetadata = exports.Arg = exports.Mutation = exports.Query = exports.getResolverMetadata = exports.Resolver = exports.getFieldMetadata = exports.Field = exports.getObjectTypeMetadata = exports.ObjectType = exports.GraphQLServer = exports.GraphQLModule = void 0;
10
+ // Module & Server
11
+ var graphql_module_1 = require("./graphql.module");
12
+ Object.defineProperty(exports, "GraphQLModule", { enumerable: true, get: function () { return graphql_module_1.GraphQLModule; } });
13
+ var graphql_server_1 = require("./graphql.server");
14
+ Object.defineProperty(exports, "GraphQLServer", { enumerable: true, get: function () { return graphql_server_1.GraphQLServer; } });
15
+ // Server decorators
16
+ var object_type_decorator_1 = require("./decorators/object-type.decorator");
17
+ Object.defineProperty(exports, "ObjectType", { enumerable: true, get: function () { return object_type_decorator_1.ObjectType; } });
18
+ Object.defineProperty(exports, "getObjectTypeMetadata", { enumerable: true, get: function () { return object_type_decorator_1.getObjectTypeMetadata; } });
19
+ var field_decorator_1 = require("./decorators/field.decorator");
20
+ Object.defineProperty(exports, "Field", { enumerable: true, get: function () { return field_decorator_1.Field; } });
21
+ Object.defineProperty(exports, "getFieldMetadata", { enumerable: true, get: function () { return field_decorator_1.getFieldMetadata; } });
22
+ var resolver_decorator_1 = require("./decorators/resolver.decorator");
23
+ Object.defineProperty(exports, "Resolver", { enumerable: true, get: function () { return resolver_decorator_1.Resolver; } });
24
+ Object.defineProperty(exports, "getResolverMetadata", { enumerable: true, get: function () { return resolver_decorator_1.getResolverMetadata; } });
25
+ var query_mutation_decorator_1 = require("./decorators/query-mutation.decorator");
26
+ Object.defineProperty(exports, "Query", { enumerable: true, get: function () { return query_mutation_decorator_1.Query; } });
27
+ Object.defineProperty(exports, "Mutation", { enumerable: true, get: function () { return query_mutation_decorator_1.Mutation; } });
28
+ Object.defineProperty(exports, "Arg", { enumerable: true, get: function () { return query_mutation_decorator_1.Arg; } });
29
+ Object.defineProperty(exports, "getQueryMetadata", { enumerable: true, get: function () { return query_mutation_decorator_1.getQueryMetadata; } });
30
+ Object.defineProperty(exports, "getMutationMetadata", { enumerable: true, get: function () { return query_mutation_decorator_1.getMutationMetadata; } });
31
+ Object.defineProperty(exports, "getArgMetadata", { enumerable: true, get: function () { return query_mutation_decorator_1.getArgMetadata; } });
32
+ // Client
33
+ var graphql_client_1 = require("./client/graphql.client");
34
+ Object.defineProperty(exports, "GraphQLClient", { enumerable: true, get: function () { return graphql_client_1.GraphQLClient; } });
35
+ var decorators_1 = require("./client/decorators");
36
+ Object.defineProperty(exports, "GraphQLQuery", { enumerable: true, get: function () { return decorators_1.GraphQLQuery; } });
37
+ Object.defineProperty(exports, "GraphQLMutation", { enumerable: true, get: function () { return decorators_1.GraphQLMutation; } });
38
+ Object.defineProperty(exports, "GraphQLClientClass", { enumerable: true, get: function () { return decorators_1.GraphQLClientClass; } });
39
+ Object.defineProperty(exports, "getGraphQLClientConfig", { enumerable: true, get: function () { return decorators_1.getGraphQLClientConfig; } });
@@ -0,0 +1,9 @@
1
+ import { GraphQLSchema } from 'graphql';
2
+ import { Container } from '@hazeljs/core';
3
+ export declare class SchemaBuilder {
4
+ private objectTypeCache;
5
+ buildSchema(resolvers: (new (...args: unknown[]) => object)[], container: Container): GraphQLSchema;
6
+ private inferType;
7
+ private buildObjectType;
8
+ }
9
+ //# sourceMappingURL=schema-builder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema-builder.d.ts","sourceRoot":"","sources":["../src/schema-builder.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,aAAa,EAUd,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAsB1C,qBAAa,aAAa;IACxB,OAAO,CAAC,eAAe,CAAwC;IAE/D,WAAW,CACT,SAAS,EAAE,CAAC,KAAK,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,MAAM,CAAC,EAAE,EACjD,SAAS,EAAE,SAAS,GACnB,aAAa;IAwFhB,OAAO,CAAC,SAAS;IA6BjB,OAAO,CAAC,eAAe;CAuBxB"}