@magek/core 0.0.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 (195) hide show
  1. package/dist/authorizer.d.ts +7 -0
  2. package/dist/authorizer.js +35 -0
  3. package/dist/command-dispatcher.d.ts +8 -0
  4. package/dist/command-dispatcher.js +55 -0
  5. package/dist/core-concepts/data-migration/entities/data-migration-entity.d.ts +12 -0
  6. package/dist/core-concepts/data-migration/entities/data-migration-entity.js +37 -0
  7. package/dist/core-concepts/data-migration/events/data-migration-finished.d.ts +7 -0
  8. package/dist/core-concepts/data-migration/events/data-migration-finished.js +13 -0
  9. package/dist/core-concepts/data-migration/events/data-migration-started.d.ts +7 -0
  10. package/dist/core-concepts/data-migration/events/data-migration-started.js +13 -0
  11. package/dist/core-concepts/data-migration/events/entity-migrated.d.ts +9 -0
  12. package/dist/core-concepts/data-migration/events/entity-migrated.js +15 -0
  13. package/dist/core-concepts/touch-entity/events/entity-touched.d.ts +7 -0
  14. package/dist/core-concepts/touch-entity/events/entity-touched.js +13 -0
  15. package/dist/data-migrations.d.ts +8 -0
  16. package/dist/data-migrations.js +73 -0
  17. package/dist/decorators/command.d.ts +19 -0
  18. package/dist/decorators/command.js +47 -0
  19. package/dist/decorators/data-migration.d.ts +9 -0
  20. package/dist/decorators/data-migration.js +25 -0
  21. package/dist/decorators/entity.d.ts +32 -0
  22. package/dist/decorators/entity.js +100 -0
  23. package/dist/decorators/event-handler.d.ts +3 -0
  24. package/dist/decorators/event-handler.js +18 -0
  25. package/dist/decorators/event.d.ts +8 -0
  26. package/dist/decorators/event.js +22 -0
  27. package/dist/decorators/field-metadata-reader.d.ts +6 -0
  28. package/dist/decorators/field-metadata-reader.js +221 -0
  29. package/dist/decorators/global-error-handler.d.ts +2 -0
  30. package/dist/decorators/global-error-handler.js +15 -0
  31. package/dist/decorators/global-event-handler.d.ts +3 -0
  32. package/dist/decorators/global-event-handler.js +9 -0
  33. package/dist/decorators/health-sensor.d.ts +14 -0
  34. package/dist/decorators/health-sensor.js +38 -0
  35. package/dist/decorators/index.d.ts +16 -0
  36. package/dist/decorators/index.js +19 -0
  37. package/dist/decorators/metadata.d.ts +13 -0
  38. package/dist/decorators/metadata.js +55 -0
  39. package/dist/decorators/non-exposed.d.ts +2 -0
  40. package/dist/decorators/non-exposed.js +24 -0
  41. package/dist/decorators/notification.d.ts +35 -0
  42. package/dist/decorators/notification.js +94 -0
  43. package/dist/decorators/projects.d.ts +32 -0
  44. package/dist/decorators/projects.js +87 -0
  45. package/dist/decorators/query.d.ts +2 -0
  46. package/dist/decorators/query.js +25 -0
  47. package/dist/decorators/read-model.d.ts +39 -0
  48. package/dist/decorators/read-model.js +129 -0
  49. package/dist/decorators/role.d.ts +6 -0
  50. package/dist/decorators/role.js +15 -0
  51. package/dist/decorators/scheduled-command.d.ts +9 -0
  52. package/dist/decorators/scheduled-command.js +25 -0
  53. package/dist/decorators/schema-migration.d.ts +36 -0
  54. package/dist/decorators/schema-migration.js +146 -0
  55. package/dist/decorators/sequenced-by.d.ts +28 -0
  56. package/dist/decorators/sequenced-by.js +79 -0
  57. package/dist/decorators/stage3-utils.d.ts +6 -0
  58. package/dist/decorators/stage3-utils.js +25 -0
  59. package/dist/delete-event-dispatcher.d.ts +4 -0
  60. package/dist/delete-event-dispatcher.js +23 -0
  61. package/dist/event-dispatcher.d.ts +9 -0
  62. package/dist/event-dispatcher.js +37 -0
  63. package/dist/event-processor.d.ts +15 -0
  64. package/dist/event-processor.js +125 -0
  65. package/dist/event-search.d.ts +2 -0
  66. package/dist/event-search.js +26 -0
  67. package/dist/event-stream-consumer.d.ts +7 -0
  68. package/dist/event-stream-consumer.js +36 -0
  69. package/dist/event-stream-producer.d.ts +7 -0
  70. package/dist/event-stream-producer.js +30 -0
  71. package/dist/events-reader.d.ts +11 -0
  72. package/dist/events-reader.js +63 -0
  73. package/dist/global-error-dispatcher.d.ts +16 -0
  74. package/dist/global-error-dispatcher.js +109 -0
  75. package/dist/graphql-dispatcher.d.ts +16 -0
  76. package/dist/graphql-dispatcher.js +195 -0
  77. package/dist/importer.d.ts +14 -0
  78. package/dist/importer.js +49 -0
  79. package/dist/index.d.ts +60 -0
  80. package/dist/index.js +100 -0
  81. package/dist/injectable/index.d.ts +21 -0
  82. package/dist/injectable/index.js +2 -0
  83. package/dist/instrumentation/decorator/trace.d.ts +13 -0
  84. package/dist/instrumentation/decorator/trace.js +116 -0
  85. package/dist/instrumentation/index.d.ts +2 -0
  86. package/dist/instrumentation/index.js +5 -0
  87. package/dist/instrumentation/trace-notifier.d.ts +3 -0
  88. package/dist/instrumentation/trace-notifier.js +26 -0
  89. package/dist/magek.d.ts +42 -0
  90. package/dist/magek.js +158 -0
  91. package/dist/query-dispatcher.d.ts +8 -0
  92. package/dist/query-dispatcher.js +47 -0
  93. package/dist/read-model-schema-migrator.d.ts +14 -0
  94. package/dist/read-model-schema-migrator.js +80 -0
  95. package/dist/read-models-reader.d.ts +31 -0
  96. package/dist/read-models-reader.js +196 -0
  97. package/dist/register-handler.d.ts +11 -0
  98. package/dist/register-handler.js +95 -0
  99. package/dist/rocket-dispatcher.d.ts +6 -0
  100. package/dist/rocket-dispatcher.js +21 -0
  101. package/dist/scheduled-command-dispatcher.d.ts +12 -0
  102. package/dist/scheduled-command-dispatcher.js +54 -0
  103. package/dist/schema-migrator.d.ts +12 -0
  104. package/dist/schema-migrator.js +71 -0
  105. package/dist/sensor/health/health-indicators/database-events-health-indicator.d.ts +5 -0
  106. package/dist/sensor/health/health-indicators/database-events-health-indicator.js +26 -0
  107. package/dist/sensor/health/health-indicators/database-health-indicator.d.ts +5 -0
  108. package/dist/sensor/health/health-indicators/database-health-indicator.js +29 -0
  109. package/dist/sensor/health/health-indicators/database-read-models-health-indicator.d.ts +5 -0
  110. package/dist/sensor/health/health-indicators/database-read-models-health-indicator.js +26 -0
  111. package/dist/sensor/health/health-indicators/default-health-indicators.d.ts +5 -0
  112. package/dist/sensor/health/health-indicators/default-health-indicators.js +39 -0
  113. package/dist/sensor/health/health-indicators/function-health-indicator.d.ts +5 -0
  114. package/dist/sensor/health/health-indicators/function-health-indicator.js +30 -0
  115. package/dist/sensor/health/health-indicators/health-indicator.d.ts +5 -0
  116. package/dist/sensor/health/health-indicators/health-indicator.js +30 -0
  117. package/dist/sensor/health/health-indicators/index.d.ts +3 -0
  118. package/dist/sensor/health/health-indicators/index.js +6 -0
  119. package/dist/sensor/health/health-indicators/os-info.d.ts +14 -0
  120. package/dist/sensor/health/health-indicators/os-info.js +38 -0
  121. package/dist/sensor/health/health-indicators/rockets-health-indicator.d.ts +5 -0
  122. package/dist/sensor/health/health-indicators/rockets-health-indicator.js +57 -0
  123. package/dist/sensor/health/health-indicators/version.d.ts +2 -0
  124. package/dist/sensor/health/health-indicators/version.js +24 -0
  125. package/dist/sensor/health/health-service.d.ts +22 -0
  126. package/dist/sensor/health/health-service.js +117 -0
  127. package/dist/sensor/health/health-utils.d.ts +7 -0
  128. package/dist/sensor/health/health-utils.js +53 -0
  129. package/dist/sensor/health/index.d.ts +3 -0
  130. package/dist/sensor/health/index.js +6 -0
  131. package/dist/sensor/index.d.ts +1 -0
  132. package/dist/sensor/index.js +4 -0
  133. package/dist/services/event-store.d.ts +27 -0
  134. package/dist/services/event-store.js +260 -0
  135. package/dist/services/filter-helpers.d.ts +3 -0
  136. package/dist/services/filter-helpers.js +19 -0
  137. package/dist/services/graphql/common.d.ts +26 -0
  138. package/dist/services/graphql/common.js +53 -0
  139. package/dist/services/graphql/graphql-generator.d.ts +46 -0
  140. package/dist/services/graphql/graphql-generator.js +269 -0
  141. package/dist/services/graphql/graphql-mutation-generator.d.ts +12 -0
  142. package/dist/services/graphql/graphql-mutation-generator.js +25 -0
  143. package/dist/services/graphql/graphql-query-generator.d.ts +22 -0
  144. package/dist/services/graphql/graphql-query-generator.js +39 -0
  145. package/dist/services/graphql/graphql-subcriptions-generator.d.ts +17 -0
  146. package/dist/services/graphql/graphql-subcriptions-generator.js +60 -0
  147. package/dist/services/graphql/graphql-type-informer.d.ts +23 -0
  148. package/dist/services/graphql/graphql-type-informer.js +160 -0
  149. package/dist/services/graphql/query-generators/graphql-query-by-keys-generator.d.ts +14 -0
  150. package/dist/services/graphql/query-generators/graphql-query-by-keys-generator.js +48 -0
  151. package/dist/services/graphql/query-generators/graphql-query-events-generator.d.ts +11 -0
  152. package/dist/services/graphql/query-generators/graphql-query-events-generator.js +68 -0
  153. package/dist/services/graphql/query-generators/graphql-query-filters-generator.d.ts +14 -0
  154. package/dist/services/graphql/query-generators/graphql-query-filters-generator.js +31 -0
  155. package/dist/services/graphql/query-generators/graphql-query-generator.d.ts +12 -0
  156. package/dist/services/graphql/query-generators/graphql-query-generator.js +17 -0
  157. package/dist/services/graphql/query-generators/graphql-query-listed-generator.d.ts +16 -0
  158. package/dist/services/graphql/query-generators/graphql-query-listed-generator.js +65 -0
  159. package/dist/services/graphql/query-helpers/graphql-handled-fields-generator.d.ts +15 -0
  160. package/dist/services/graphql/query-helpers/graphql-handled-fields-generator.js +65 -0
  161. package/dist/services/graphql/query-helpers/graphql-query-filter-arguments-builder.d.ts +13 -0
  162. package/dist/services/graphql/query-helpers/graphql-query-filter-arguments-builder.js +169 -0
  163. package/dist/services/graphql/query-helpers/graphql-query-filter-fields-builder.d.ts +11 -0
  164. package/dist/services/graphql/query-helpers/graphql-query-filter-fields-builder.js +28 -0
  165. package/dist/services/graphql/query-helpers/graphql-query-sort-builder.d.ts +12 -0
  166. package/dist/services/graphql/query-helpers/graphql-query-sort-builder.js +61 -0
  167. package/dist/services/graphql/websocket-protocol/graphql-websocket-protocol.d.ts +20 -0
  168. package/dist/services/graphql/websocket-protocol/graphql-websocket-protocol.js +127 -0
  169. package/dist/services/pub-sub/noop-read-model-pub-sub.d.ts +5 -0
  170. package/dist/services/pub-sub/noop-read-model-pub-sub.js +10 -0
  171. package/dist/services/pub-sub/read-model-pub-sub.d.ts +9 -0
  172. package/dist/services/pub-sub/read-model-pub-sub.js +112 -0
  173. package/dist/services/raw-events-parser.d.ts +5 -0
  174. package/dist/services/raw-events-parser.js +44 -0
  175. package/dist/services/read-model-searcher.d.ts +2 -0
  176. package/dist/services/read-model-searcher.js +11 -0
  177. package/dist/services/read-model-store.d.ts +41 -0
  178. package/dist/services/read-model-store.js +295 -0
  179. package/dist/services/token-verifiers/index.d.ts +4 -0
  180. package/dist/services/token-verifiers/index.js +7 -0
  181. package/dist/services/token-verifiers/jwks-uri-token-verifier.d.ts +21 -0
  182. package/dist/services/token-verifiers/jwks-uri-token-verifier.js +23 -0
  183. package/dist/services/token-verifiers/public-key-token-verifier.d.ts +13 -0
  184. package/dist/services/token-verifiers/public-key-token-verifier.js +19 -0
  185. package/dist/services/token-verifiers/role-based-token-verifier.d.ts +8 -0
  186. package/dist/services/token-verifiers/role-based-token-verifier.js +35 -0
  187. package/dist/services/token-verifiers/utilities.d.ts +31 -0
  188. package/dist/services/token-verifiers/utilities.js +70 -0
  189. package/dist/subscribers-notifier.d.ts +14 -0
  190. package/dist/subscribers-notifier.js +109 -0
  191. package/dist/token-verifier.d.ts +11 -0
  192. package/dist/token-verifier.js +46 -0
  193. package/dist/touch-entity-handler.d.ts +4 -0
  194. package/dist/touch-entity-handler.js +16 -0
  195. package/package.json +71 -0
@@ -0,0 +1,48 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.GraphqlQueryByKeysGenerator = void 0;
4
+ const graphql_1 = require("graphql");
5
+ class GraphqlQueryByKeysGenerator {
6
+ constructor(config, readModels, typeInformer, byIDResolverBuilder) {
7
+ this.config = config;
8
+ this.readModels = readModels;
9
+ this.typeInformer = typeInformer;
10
+ this.byIDResolverBuilder = byIDResolverBuilder;
11
+ }
12
+ generateByKeysQueries() {
13
+ const queries = {};
14
+ for (const readModel of this.readModels) {
15
+ const readModelName = readModel.name;
16
+ const sequenceKeyName = this.config.readModelSequenceKeys[readModelName];
17
+ if (sequenceKeyName) {
18
+ queries[readModelName] = this.generateByIdAndSequenceKeyQuery(readModel, sequenceKeyName);
19
+ }
20
+ else {
21
+ queries[readModelName] = this.generateByIdQuery(readModel);
22
+ }
23
+ }
24
+ return queries;
25
+ }
26
+ generateByIdQuery(readModel) {
27
+ const graphQLType = this.typeInformer.generateGraphQLTypeForClass(readModel, this.config.nonExposedGraphQLMetadataKey[readModel.name]);
28
+ return {
29
+ type: graphQLType,
30
+ args: {
31
+ id: { type: new graphql_1.GraphQLNonNull(graphql_1.GraphQLID) },
32
+ },
33
+ resolve: this.byIDResolverBuilder(readModel),
34
+ };
35
+ }
36
+ generateByIdAndSequenceKeyQuery(readModel, sequenceKeyName) {
37
+ const graphQLType = this.typeInformer.generateGraphQLTypeForClass(readModel, this.config.nonExposedGraphQLMetadataKey[readModel.name]);
38
+ return {
39
+ type: new graphql_1.GraphQLList(graphQLType),
40
+ args: {
41
+ id: { type: new graphql_1.GraphQLNonNull(graphql_1.GraphQLID) },
42
+ [sequenceKeyName]: { type: graphql_1.GraphQLID },
43
+ },
44
+ resolve: this.byIDResolverBuilder(readModel),
45
+ };
46
+ }
47
+ }
48
+ exports.GraphqlQueryByKeysGenerator = GraphqlQueryByKeysGenerator;
@@ -0,0 +1,11 @@
1
+ import { GraphQLFieldConfigMap, GraphQLFieldResolver } from 'graphql';
2
+ import { GraphQLResolverContext, ResolverBuilder } from '../common';
3
+ import { MagekConfig } from '@magek/common';
4
+ export declare class GraphqlQueryEventsGenerator {
5
+ private readonly config;
6
+ protected readonly byIDResolverBuilder: ResolverBuilder;
7
+ private readonly eventsResolver;
8
+ constructor(config: MagekConfig, byIDResolverBuilder: ResolverBuilder, eventsResolver: GraphQLFieldResolver<unknown, GraphQLResolverContext, any>);
9
+ generateEventQueries(): GraphQLFieldConfigMap<unknown, GraphQLResolverContext>;
10
+ private static buildEventQueryResponse;
11
+ }
@@ -0,0 +1,68 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.GraphqlQueryEventsGenerator = void 0;
4
+ const graphql_1 = require("graphql");
5
+ const common_1 = require("../common");
6
+ const graphql_scalars_1 = require("graphql-scalars");
7
+ class GraphqlQueryEventsGenerator {
8
+ constructor(config, byIDResolverBuilder, eventsResolver) {
9
+ this.config = config;
10
+ this.byIDResolverBuilder = byIDResolverBuilder;
11
+ this.eventsResolver = eventsResolver;
12
+ }
13
+ generateEventQueries() {
14
+ const eventQueryResponse = GraphqlQueryEventsGenerator.buildEventQueryResponse();
15
+ return {
16
+ eventsByEntity: {
17
+ type: eventQueryResponse,
18
+ args: {
19
+ entity: {
20
+ type: new graphql_1.GraphQLNonNull((0, common_1.buildGraphqlSimpleEnumFor)('EntityType', Object.keys(this.config.entities))),
21
+ },
22
+ entityID: { type: graphql_1.GraphQLID },
23
+ from: { type: graphql_1.GraphQLString },
24
+ to: { type: graphql_1.GraphQLString },
25
+ limit: { type: graphql_1.GraphQLInt },
26
+ },
27
+ resolve: this.eventsResolver,
28
+ },
29
+ eventsByType: {
30
+ type: eventQueryResponse,
31
+ args: {
32
+ type: {
33
+ type: new graphql_1.GraphQLNonNull((0, common_1.buildGraphqlSimpleEnumFor)('EventType', Object.keys(this.config.reducers))),
34
+ },
35
+ from: { type: graphql_1.GraphQLString },
36
+ to: { type: graphql_1.GraphQLString },
37
+ limit: { type: graphql_1.GraphQLInt },
38
+ },
39
+ resolve: this.eventsResolver,
40
+ },
41
+ };
42
+ }
43
+ static buildEventQueryResponse() {
44
+ return new graphql_1.GraphQLList(new graphql_1.GraphQLObjectType({
45
+ name: 'EventQueryResponse',
46
+ fields: {
47
+ type: { type: new graphql_1.GraphQLNonNull(graphql_1.GraphQLString) },
48
+ entity: { type: new graphql_1.GraphQLNonNull(graphql_1.GraphQLString) },
49
+ entityID: { type: new graphql_1.GraphQLNonNull(graphql_1.GraphQLID) },
50
+ requestID: { type: new graphql_1.GraphQLNonNull(graphql_1.GraphQLID) },
51
+ user: {
52
+ type: new graphql_1.GraphQLObjectType({
53
+ name: 'User',
54
+ fields: {
55
+ id: { type: graphql_1.GraphQLString },
56
+ username: { type: new graphql_1.GraphQLNonNull(graphql_1.GraphQLString) },
57
+ roles: { type: new graphql_1.GraphQLList(new graphql_1.GraphQLNonNull(graphql_1.GraphQLString)) },
58
+ },
59
+ }),
60
+ },
61
+ createdAt: { type: new graphql_1.GraphQLNonNull(graphql_1.GraphQLString) },
62
+ value: { type: new graphql_1.GraphQLNonNull(graphql_scalars_1.GraphQLJSON) },
63
+ deletedAt: { type: graphql_1.GraphQLString },
64
+ },
65
+ }));
66
+ }
67
+ }
68
+ exports.GraphqlQueryEventsGenerator = GraphqlQueryEventsGenerator;
@@ -0,0 +1,14 @@
1
+ import { GraphQLFieldConfigMap, GraphQLInputObjectType } from 'graphql';
2
+ import { GraphQLResolverContext, ResolverBuilder } from '../common';
3
+ import { GraphQLTypeInformer } from '../graphql-type-informer';
4
+ import { AnyClass, MagekConfig } from '@magek/common';
5
+ export declare class GraphqlQueryFiltersGenerator {
6
+ private readonly readModels;
7
+ private readonly typeInformer;
8
+ private readonly filterResolverBuilder;
9
+ protected generatedFiltersByTypeName: Record<string, GraphQLInputObjectType>;
10
+ private readonly config;
11
+ private graphqlQueryFilterFieldsBuilder;
12
+ constructor(readModels: AnyClass[], typeInformer: GraphQLTypeInformer, filterResolverBuilder: ResolverBuilder, generatedFiltersByTypeName: Record<string, GraphQLInputObjectType> | undefined, config: MagekConfig);
13
+ generateFilterQueries(): GraphQLFieldConfigMap<unknown, GraphQLResolverContext>;
14
+ }
@@ -0,0 +1,31 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.GraphqlQueryFiltersGenerator = void 0;
4
+ const graphql_1 = require("graphql");
5
+ const inflected = require("inflected");
6
+ const graphql_query_filter_fields_builder_1 = require("../query-helpers/graphql-query-filter-fields-builder");
7
+ class GraphqlQueryFiltersGenerator {
8
+ constructor(readModels, typeInformer, filterResolverBuilder, generatedFiltersByTypeName = {}, config) {
9
+ this.readModels = readModels;
10
+ this.typeInformer = typeInformer;
11
+ this.filterResolverBuilder = filterResolverBuilder;
12
+ this.generatedFiltersByTypeName = generatedFiltersByTypeName;
13
+ this.config = config;
14
+ this.graphqlQueryFilterFieldsBuilder = new graphql_query_filter_fields_builder_1.GraphqlQueryFilterFieldsBuilder(typeInformer, generatedFiltersByTypeName, config);
15
+ }
16
+ generateFilterQueries() {
17
+ const queries = {};
18
+ for (const readModel of this.readModels) {
19
+ const excludeProp = this.config.nonExposedGraphQLMetadataKey[readModel.name];
20
+ const graphQLType = this.typeInformer.generateGraphQLTypeForClass(readModel, excludeProp);
21
+ queries[inflected.pluralize(readModel.name)] = {
22
+ type: new graphql_1.GraphQLNonNull(new graphql_1.GraphQLList(new graphql_1.GraphQLNonNull(graphQLType))),
23
+ args: this.graphqlQueryFilterFieldsBuilder.generateFilterQueriesFields(readModel.name, readModel, excludeProp),
24
+ resolve: this.filterResolverBuilder(readModel),
25
+ deprecationReason: 'Method is deprecated. Use List* methods',
26
+ };
27
+ }
28
+ return queries;
29
+ }
30
+ }
31
+ exports.GraphqlQueryFiltersGenerator = GraphqlQueryFiltersGenerator;
@@ -0,0 +1,12 @@
1
+ import { GraphQLTypeInformer } from '../graphql-type-informer';
2
+ import { GraphQLResolverContext, ResolverBuilder, TargetTypesMap } from '../common';
3
+ import { GraphQLFieldConfigMap } from 'graphql';
4
+ import { MagekConfig } from '@magek/common';
5
+ export declare class GraphqlQueryGenerator {
6
+ private readonly targetTypes;
7
+ private readonly typeInformer;
8
+ private readonly queryResolveBuilder;
9
+ private readonly config;
10
+ constructor(targetTypes: TargetTypesMap, typeInformer: GraphQLTypeInformer, queryResolveBuilder: ResolverBuilder, config: MagekConfig);
11
+ generateQueries(): GraphQLFieldConfigMap<unknown, GraphQLResolverContext>;
12
+ }
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.GraphqlQueryGenerator = void 0;
4
+ const graphql_handled_fields_generator_1 = require("../query-helpers/graphql-handled-fields-generator");
5
+ class GraphqlQueryGenerator {
6
+ constructor(targetTypes, typeInformer, queryResolveBuilder, config) {
7
+ this.targetTypes = targetTypes;
8
+ this.typeInformer = typeInformer;
9
+ this.queryResolveBuilder = queryResolveBuilder;
10
+ this.config = config;
11
+ }
12
+ generateQueries() {
13
+ const graphqlGenerateHandledFields = new graphql_handled_fields_generator_1.GraphQLHandledFieldsGenerator(this.targetTypes, this.typeInformer, this.queryResolveBuilder, this.config);
14
+ return graphqlGenerateHandledFields.generateFields(false);
15
+ }
16
+ }
17
+ exports.GraphqlQueryGenerator = GraphqlQueryGenerator;
@@ -0,0 +1,16 @@
1
+ import { GraphQLFieldConfigMap, GraphQLInputObjectType } from 'graphql';
2
+ import { GraphQLResolverContext, ResolverBuilder } from '../common';
3
+ import { GraphQLTypeInformer } from '../graphql-type-informer';
4
+ import { AnyClass, MagekConfig } from '@magek/common';
5
+ export declare class GraphqlQueryListedGenerator {
6
+ private readonly readModels;
7
+ private readonly typeInformer;
8
+ private readonly filterResolverBuilder;
9
+ protected generatedFiltersByTypeName: Record<string, GraphQLInputObjectType>;
10
+ private readonly config;
11
+ private graphqlQueryFilterArgumentsBuilder;
12
+ private graphqlQuerySortBuilder;
13
+ constructor(readModels: AnyClass[], typeInformer: GraphQLTypeInformer, filterResolverBuilder: ResolverBuilder, generatedFiltersByTypeName: Record<string, GraphQLInputObjectType> | undefined, config: MagekConfig);
14
+ generateListedQueries(): GraphQLFieldConfigMap<unknown, GraphQLResolverContext>;
15
+ private generateListedQueriesFields;
16
+ }
@@ -0,0 +1,65 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.GraphqlQueryListedGenerator = void 0;
4
+ const graphql_1 = require("graphql");
5
+ const inflected = require("inflected");
6
+ const graphql_scalars_1 = require("graphql-scalars");
7
+ const graphql_query_sort_builder_1 = require("../query-helpers/graphql-query-sort-builder");
8
+ const graphql_query_filter_arguments_builder_1 = require("../query-helpers/graphql-query-filter-arguments-builder");
9
+ class GraphqlQueryListedGenerator {
10
+ constructor(readModels, typeInformer, filterResolverBuilder, generatedFiltersByTypeName = {}, config) {
11
+ this.readModels = readModels;
12
+ this.typeInformer = typeInformer;
13
+ this.filterResolverBuilder = filterResolverBuilder;
14
+ this.generatedFiltersByTypeName = generatedFiltersByTypeName;
15
+ this.config = config;
16
+ this.graphqlQueryFilterArgumentsBuilder = new graphql_query_filter_arguments_builder_1.GraphqlQueryFilterArgumentsBuilder(typeInformer, generatedFiltersByTypeName, config);
17
+ this.graphqlQuerySortBuilder = new graphql_query_sort_builder_1.GraphqlQuerySortBuilder(typeInformer, config);
18
+ }
19
+ generateListedQueries() {
20
+ const queries = {};
21
+ for (const readModel of this.readModels) {
22
+ const excludeProp = this.config.nonExposedGraphQLMetadataKey[readModel.name];
23
+ const graphQLType = this.typeInformer.generateGraphQLTypeForClass(readModel, excludeProp);
24
+ queries[`List${inflected.pluralize(readModel.name)}`] = {
25
+ type: new graphql_1.GraphQLNonNull(new graphql_1.GraphQLObjectType({
26
+ name: `${readModel.name}Connection`,
27
+ fields: {
28
+ items: { type: new graphql_1.GraphQLNonNull(new graphql_1.GraphQLList(new graphql_1.GraphQLNonNull(graphQLType))) },
29
+ count: { type: new graphql_1.GraphQLNonNull(graphql_1.GraphQLInt) },
30
+ cursor: { type: graphql_scalars_1.GraphQLJSON },
31
+ },
32
+ })),
33
+ args: this.generateListedQueriesFields(readModel.name, readModel, excludeProp),
34
+ resolve: this.filterResolverBuilder(readModel),
35
+ };
36
+ }
37
+ return queries;
38
+ }
39
+ generateListedQueriesFields(name, type, excludeProps) {
40
+ const filterArguments = this.graphqlQueryFilterArgumentsBuilder.generateFilterArguments(type, excludeProps);
41
+ const filter = new graphql_1.GraphQLInputObjectType({
42
+ name: `List${type.name}Filter`,
43
+ fields: () => ({
44
+ ...filterArguments,
45
+ and: { type: new graphql_1.GraphQLList(filter) },
46
+ or: { type: new graphql_1.GraphQLList(filter) },
47
+ not: { type: filter },
48
+ }),
49
+ });
50
+ const sortArguments = this.graphqlQuerySortBuilder.generateSortArguments(type, excludeProps);
51
+ const sort = new graphql_1.GraphQLInputObjectType({
52
+ name: `${name}SortBy`,
53
+ fields: () => ({
54
+ ...sortArguments,
55
+ }),
56
+ });
57
+ return {
58
+ filter: { type: filter },
59
+ limit: { type: graphql_1.GraphQLInt },
60
+ sortBy: { type: sort },
61
+ afterCursor: { type: graphql_scalars_1.GraphQLJSON },
62
+ };
63
+ }
64
+ }
65
+ exports.GraphqlQueryListedGenerator = GraphqlQueryListedGenerator;
@@ -0,0 +1,15 @@
1
+ import { GraphQLFieldConfigMap } from 'graphql';
2
+ import { ResolverBuilder, TargetTypesMap } from '../common';
3
+ import { GraphQLTypeInformer } from '../graphql-type-informer';
4
+ import { MagekConfig } from '@magek/common';
5
+ export declare class GraphQLHandledFieldsGenerator {
6
+ private readonly targetTypes;
7
+ private readonly typeInformer;
8
+ private readonly resolver;
9
+ private readonly config;
10
+ constructor(targetTypes: TargetTypesMap, typeInformer: GraphQLTypeInformer, resolver: ResolverBuilder, config: MagekConfig);
11
+ generateFields(allowVoidReturn?: boolean): GraphQLFieldConfigMap<any, any>;
12
+ private generateInputForType;
13
+ private static getHandleMethodMetadata;
14
+ private static getReturnMetadata;
15
+ }
@@ -0,0 +1,65 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.GraphQLHandledFieldsGenerator = void 0;
4
+ const graphql_1 = require("graphql");
5
+ class GraphQLHandledFieldsGenerator {
6
+ constructor(targetTypes, typeInformer, resolver, config) {
7
+ this.targetTypes = targetTypes;
8
+ this.typeInformer = typeInformer;
9
+ this.resolver = resolver;
10
+ this.config = config;
11
+ }
12
+ generateFields(allowVoidReturn = true) {
13
+ const fields = {};
14
+ for (const name in this.targetTypes) {
15
+ const metadata = this.targetTypes[name];
16
+ const handleMethodMetadata = GraphQLHandledFieldsGenerator.getHandleMethodMetadata(metadata);
17
+ const returnMetadata = GraphQLHandledFieldsGenerator.getReturnMetadata(handleMethodMetadata, allowVoidReturn);
18
+ const type = this.typeInformer.getOrCreateGraphQLType(returnMetadata, false);
19
+ fields[name] = {
20
+ type: type,
21
+ resolve: this.resolver(metadata.class),
22
+ };
23
+ const input = this.generateInputForType(metadata);
24
+ if (input) {
25
+ fields[name].args = { ...input };
26
+ }
27
+ }
28
+ return fields;
29
+ }
30
+ generateInputForType(metadata) {
31
+ if (metadata.properties.length === 0)
32
+ return undefined;
33
+ return {
34
+ input: {
35
+ type: new graphql_1.GraphQLNonNull(this.typeInformer.generateGraphQLTypeForClass(metadata.class, this.config.nonExposedGraphQLMetadataKey[metadata.class.name], true)),
36
+ },
37
+ };
38
+ }
39
+ static getHandleMethodMetadata(metadata) {
40
+ var _a;
41
+ let handleMethodMetadata = (_a = metadata.methods.find((m) => m.name === 'handle')) === null || _a === void 0 ? void 0 : _a.typeInfo;
42
+ if (handleMethodMetadata && handleMethodMetadata.typeName === 'Promise') {
43
+ // If async function, return type is wrapped in a Promise
44
+ handleMethodMetadata = handleMethodMetadata.parameters[0];
45
+ }
46
+ return handleMethodMetadata;
47
+ }
48
+ static getReturnMetadata(handleMethodMetadata, allowVoidReturn) {
49
+ if (!handleMethodMetadata || handleMethodMetadata.name === 'never') {
50
+ if (!allowVoidReturn) {
51
+ throw Error('Unexpected void return type for Query');
52
+ }
53
+ return {
54
+ name: 'Boolean',
55
+ typeGroup: 'Boolean',
56
+ typeName: 'Boolean',
57
+ isNullable: false,
58
+ isGetAccessor: false,
59
+ parameters: [],
60
+ };
61
+ }
62
+ return handleMethodMetadata;
63
+ }
64
+ }
65
+ exports.GraphQLHandledFieldsGenerator = GraphQLHandledFieldsGenerator;
@@ -0,0 +1,13 @@
1
+ import { GraphQLFieldConfigArgumentMap, GraphQLInputObjectType } from 'graphql';
2
+ import { AnyClass, MagekConfig } from '@magek/common';
3
+ import { GraphQLTypeInformer } from '../graphql-type-informer';
4
+ export declare class GraphqlQueryFilterArgumentsBuilder {
5
+ private readonly typeInformer;
6
+ protected generatedFiltersByTypeName: Record<string, GraphQLInputObjectType>;
7
+ private readonly config;
8
+ constructor(typeInformer: GraphQLTypeInformer, generatedFiltersByTypeName: Record<string, GraphQLInputObjectType> | undefined, config: MagekConfig);
9
+ generateFilterArguments(type: AnyClass, excludeProps: Array<string>): GraphQLFieldConfigArgumentMap;
10
+ private generateFilterFor;
11
+ private generateArrayFilterFor;
12
+ private generateFilterInputTypes;
13
+ }
@@ -0,0 +1,169 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.GraphqlQueryFilterArgumentsBuilder = void 0;
4
+ const graphql_1 = require("graphql");
5
+ const metadata_1 = require("../../../decorators/metadata");
6
+ const graphql_scalars_1 = require("graphql-scalars");
7
+ const common_1 = require("@magek/common");
8
+ const common_2 = require("../common");
9
+ class GraphqlQueryFilterArgumentsBuilder {
10
+ constructor(typeInformer, generatedFiltersByTypeName = {}, config) {
11
+ this.typeInformer = typeInformer;
12
+ this.generatedFiltersByTypeName = generatedFiltersByTypeName;
13
+ this.config = config;
14
+ }
15
+ generateFilterArguments(type, excludeProps) {
16
+ const metadata = (0, metadata_1.getClassMetadata)(type);
17
+ const args = {};
18
+ const finalFields = (0, common_2.nonExcludedFields)(metadata.fields, excludeProps);
19
+ finalFields
20
+ .filter((field) => !field.typeInfo.isGetAccessor)
21
+ .forEach((prop) => {
22
+ args[prop.name] = {
23
+ type: this.generateFilterFor(prop),
24
+ };
25
+ });
26
+ return args;
27
+ }
28
+ generateFilterFor(prop) {
29
+ let filterName = `${prop.typeInfo.name}PropertyFilter`;
30
+ filterName = filterName.replace(/[^_a-zA-Z]/g, '_');
31
+ filterName = filterName.charAt(0).toUpperCase() + filterName.substr(1);
32
+ if (this.generatedFiltersByTypeName[filterName])
33
+ return this.generatedFiltersByTypeName[filterName];
34
+ if (prop.typeInfo.typeGroup === 'Array')
35
+ return this.generateArrayFilterFor(prop);
36
+ let fields = {};
37
+ if (prop.typeInfo.name === 'UUID' || prop.typeInfo.name === 'Date') {
38
+ fields = this.generateFilterInputTypes(prop.typeInfo);
39
+ }
40
+ else if (prop.typeInfo.type && (prop.typeInfo.typeGroup === 'Class' || prop.typeInfo.typeGroup === 'Object')) {
41
+ if ((0, common_2.isExternalType)(prop.typeInfo))
42
+ return graphql_scalars_1.GraphQLJSON;
43
+ let nestedProperties = {};
44
+ const metadata = (0, metadata_1.getClassMetadata)(prop.typeInfo.type);
45
+ if (metadata.fields.length === 0)
46
+ return graphql_scalars_1.GraphQLJSON;
47
+ const excludeProps = this.config.nonExposedGraphQLMetadataKey[prop.name];
48
+ this.typeInformer.generateGraphQLTypeForClass(prop.typeInfo.type, excludeProps, true);
49
+ for (const prop of metadata.fields) {
50
+ const property = { [prop.name]: { type: this.generateFilterFor(prop) } };
51
+ nestedProperties = { ...nestedProperties, ...property };
52
+ }
53
+ fields = () => ({
54
+ ...nestedProperties,
55
+ and: { type: new graphql_1.GraphQLList(this.generatedFiltersByTypeName[filterName]) },
56
+ or: { type: new graphql_1.GraphQLList(this.generatedFiltersByTypeName[filterName]) },
57
+ not: { type: this.generatedFiltersByTypeName[filterName] },
58
+ isDefined: { type: graphql_1.GraphQLBoolean },
59
+ });
60
+ }
61
+ else if (prop.typeInfo.type && prop.typeInfo.type.name !== 'Object') {
62
+ fields = this.generateFilterInputTypes(prop.typeInfo);
63
+ }
64
+ else {
65
+ return graphql_scalars_1.GraphQLJSON;
66
+ }
67
+ this.generatedFiltersByTypeName[filterName] = new graphql_1.GraphQLInputObjectType({ name: filterName, fields });
68
+ return this.generatedFiltersByTypeName[filterName];
69
+ }
70
+ generateArrayFilterFor(property) {
71
+ let filterName = `${property.typeInfo.parameters[0].name}ArrayPropertyFilter`;
72
+ filterName = filterName.replace(/[^_a-zA-Z]/g, '_');
73
+ filterName = filterName.charAt(0).toUpperCase() + filterName.substr(1);
74
+ if (!this.generatedFiltersByTypeName[filterName]) {
75
+ const propFilters = {};
76
+ property.typeInfo.parameters.forEach((param) => {
77
+ let graphqlType;
78
+ switch (param.typeGroup) {
79
+ case 'Boolean':
80
+ graphqlType = graphql_1.GraphQLBoolean;
81
+ break;
82
+ case 'String':
83
+ graphqlType = graphql_1.GraphQLString;
84
+ break;
85
+ case 'Number':
86
+ graphqlType = graphql_1.GraphQLFloat;
87
+ break;
88
+ default:
89
+ graphqlType = param.type === common_1.UUID ? graphql_1.GraphQLID : graphql_scalars_1.GraphQLJSON;
90
+ break;
91
+ }
92
+ propFilters.includes = { type: graphqlType };
93
+ });
94
+ propFilters.isDefined = { type: graphql_1.GraphQLBoolean };
95
+ this.generatedFiltersByTypeName[filterName] = new graphql_1.GraphQLInputObjectType({
96
+ name: filterName,
97
+ fields: propFilters,
98
+ });
99
+ }
100
+ return this.generatedFiltersByTypeName[filterName];
101
+ }
102
+ generateFilterInputTypes(typeMetadata) {
103
+ const { name, typeGroup } = typeMetadata;
104
+ if (typeGroup === 'Boolean')
105
+ return {
106
+ eq: { type: graphql_1.GraphQLBoolean },
107
+ ne: { type: graphql_1.GraphQLBoolean },
108
+ isDefined: { type: graphql_1.GraphQLBoolean },
109
+ };
110
+ if (typeGroup === 'Number')
111
+ return {
112
+ eq: { type: graphql_1.GraphQLFloat },
113
+ ne: { type: graphql_1.GraphQLFloat },
114
+ lte: { type: graphql_1.GraphQLFloat },
115
+ lt: { type: graphql_1.GraphQLFloat },
116
+ gte: { type: graphql_1.GraphQLFloat },
117
+ gt: { type: graphql_1.GraphQLFloat },
118
+ in: { type: new graphql_1.GraphQLList(graphql_1.GraphQLFloat) },
119
+ isDefined: { type: graphql_1.GraphQLBoolean },
120
+ };
121
+ if (typeGroup === 'String')
122
+ return {
123
+ eq: { type: graphql_1.GraphQLString },
124
+ ne: { type: graphql_1.GraphQLString },
125
+ lte: { type: graphql_1.GraphQLString },
126
+ lt: { type: graphql_1.GraphQLString },
127
+ gte: { type: graphql_1.GraphQLString },
128
+ gt: { type: graphql_1.GraphQLString },
129
+ in: { type: new graphql_1.GraphQLList(graphql_1.GraphQLString) },
130
+ beginsWith: { type: graphql_1.GraphQLString },
131
+ contains: { type: graphql_1.GraphQLString },
132
+ regex: { type: graphql_1.GraphQLString },
133
+ iRegex: { type: graphql_1.GraphQLString },
134
+ isDefined: { type: graphql_1.GraphQLBoolean },
135
+ };
136
+ // use `name`, `typeGroup` === 'Class'
137
+ if (name === 'UUID')
138
+ return {
139
+ eq: { type: graphql_1.GraphQLID },
140
+ ne: { type: graphql_1.GraphQLID },
141
+ in: { type: new graphql_1.GraphQLList(graphql_1.GraphQLID) },
142
+ beginsWith: { type: graphql_1.GraphQLString },
143
+ contains: { type: graphql_1.GraphQLString },
144
+ isDefined: { type: graphql_1.GraphQLBoolean },
145
+ };
146
+ // use `name`, `typeGroup` === 'Interface'.
147
+ if (name === 'Date')
148
+ return {
149
+ eq: { type: common_2.DateScalar },
150
+ ne: { type: common_2.DateScalar },
151
+ lte: { type: common_2.DateScalar },
152
+ lt: { type: common_2.DateScalar },
153
+ gte: { type: common_2.DateScalar },
154
+ gt: { type: common_2.DateScalar },
155
+ in: { type: new graphql_1.GraphQLList(common_2.DateScalar) },
156
+ isDefined: { type: graphql_1.GraphQLBoolean },
157
+ };
158
+ if (typeGroup === 'Enum') {
159
+ const EnumType = this.typeInformer.getOrCreateGraphQLType(typeMetadata, true);
160
+ return {
161
+ eq: { type: EnumType },
162
+ ne: { type: EnumType },
163
+ isDefined: { type: graphql_1.GraphQLBoolean },
164
+ };
165
+ }
166
+ throw new Error(`Type ${name} is not supported in search filters`);
167
+ }
168
+ }
169
+ exports.GraphqlQueryFilterArgumentsBuilder = GraphqlQueryFilterArgumentsBuilder;
@@ -0,0 +1,11 @@
1
+ import { AnyClass, MagekConfig } from '@magek/common';
2
+ import { GraphQLFieldConfigArgumentMap, GraphQLInputObjectType } from 'graphql';
3
+ import { GraphQLTypeInformer } from '../graphql-type-informer';
4
+ export declare class GraphqlQueryFilterFieldsBuilder {
5
+ protected readonly typeInformer: GraphQLTypeInformer;
6
+ protected generatedFiltersByTypeName: Record<string, GraphQLInputObjectType>;
7
+ protected readonly config: MagekConfig;
8
+ private graphqlQueryFilterArgumentsBuilder;
9
+ constructor(typeInformer: GraphQLTypeInformer, generatedFiltersByTypeName: Record<string, GraphQLInputObjectType> | undefined, config: MagekConfig);
10
+ generateFilterQueriesFields(name: string, type: AnyClass, excludeProps: Array<string>): GraphQLFieldConfigArgumentMap;
11
+ }
@@ -0,0 +1,28 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.GraphqlQueryFilterFieldsBuilder = void 0;
4
+ const graphql_1 = require("graphql");
5
+ const graphql_query_filter_arguments_builder_1 = require("./graphql-query-filter-arguments-builder");
6
+ class GraphqlQueryFilterFieldsBuilder {
7
+ constructor(typeInformer, generatedFiltersByTypeName = {}, config) {
8
+ this.typeInformer = typeInformer;
9
+ this.generatedFiltersByTypeName = generatedFiltersByTypeName;
10
+ this.config = config;
11
+ this.graphqlQueryFilterArgumentsBuilder = new graphql_query_filter_arguments_builder_1.GraphqlQueryFilterArgumentsBuilder(typeInformer, generatedFiltersByTypeName, config);
12
+ }
13
+ generateFilterQueriesFields(name, type, excludeProps) {
14
+ const filterArguments = this.graphqlQueryFilterArgumentsBuilder.generateFilterArguments(type, excludeProps);
15
+ const filter = new graphql_1.GraphQLInputObjectType({
16
+ name: `${name}Filter`,
17
+ fields: () => ({
18
+ ...filterArguments,
19
+ and: { type: new graphql_1.GraphQLList(filter) },
20
+ or: { type: new graphql_1.GraphQLList(filter) },
21
+ not: { type: filter },
22
+ isDefined: { type: graphql_1.GraphQLBoolean },
23
+ }),
24
+ });
25
+ return { filter: { type: filter } };
26
+ }
27
+ }
28
+ exports.GraphqlQueryFilterFieldsBuilder = GraphqlQueryFilterFieldsBuilder;
@@ -0,0 +1,12 @@
1
+ import { GraphQLFieldConfigArgumentMap } from 'graphql';
2
+ import { GraphQLTypeInformer } from '../graphql-type-informer';
3
+ import { AnyClass, MagekConfig } from '@magek/common';
4
+ export declare class GraphqlQuerySortBuilder {
5
+ protected readonly typeInformer: GraphQLTypeInformer;
6
+ protected readonly config: MagekConfig;
7
+ private generatedSortByByTypeName;
8
+ private orderType;
9
+ constructor(typeInformer: GraphQLTypeInformer, config: MagekConfig);
10
+ generateSortArguments(type: AnyClass, excludeProps: Array<string>): GraphQLFieldConfigArgumentMap;
11
+ private generateSortFor;
12
+ }