@strapi/plugin-graphql 4.0.0-next.8 → 4.0.2

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 (122) hide show
  1. package/README.md +1 -1
  2. package/admin/src/index.js +0 -8
  3. package/package.json +43 -35
  4. package/server/bootstrap.js +148 -0
  5. package/server/config/default-config.js +13 -0
  6. package/server/config/index.js +7 -0
  7. package/server/format-graphql-error.js +50 -0
  8. package/server/services/builders/dynamic-zones.js +97 -0
  9. package/server/services/builders/entity-meta.js +7 -0
  10. package/server/services/builders/entity.js +43 -0
  11. package/server/services/builders/enums.js +24 -0
  12. package/server/services/builders/filters/content-type.js +93 -0
  13. package/server/services/builders/filters/index.js +7 -0
  14. package/server/services/builders/filters/operators/and.js +15 -0
  15. package/server/services/builders/filters/operators/between.js +15 -0
  16. package/server/services/builders/filters/operators/contains.js +13 -0
  17. package/server/services/builders/filters/operators/containsi.js +13 -0
  18. package/server/services/builders/filters/operators/ends-with.js +13 -0
  19. package/server/services/builders/filters/operators/eq.js +23 -0
  20. package/server/services/builders/filters/operators/gt.js +13 -0
  21. package/server/services/builders/filters/operators/gte.js +13 -0
  22. package/server/services/builders/filters/operators/in.js +15 -0
  23. package/server/services/builders/filters/operators/index.js +38 -0
  24. package/server/services/builders/filters/operators/lt.js +13 -0
  25. package/server/services/builders/filters/operators/lte.js +13 -0
  26. package/server/services/builders/filters/operators/ne.js +13 -0
  27. package/server/services/builders/filters/operators/not-contains.js +13 -0
  28. package/server/services/builders/filters/operators/not-containsi.js +13 -0
  29. package/server/services/builders/filters/operators/not-in.js +15 -0
  30. package/server/services/builders/filters/operators/not-null.js +13 -0
  31. package/server/services/builders/filters/operators/not.js +19 -0
  32. package/server/services/builders/filters/operators/null.js +13 -0
  33. package/server/services/builders/filters/operators/or.js +15 -0
  34. package/server/services/builders/filters/operators/starts-with.js +13 -0
  35. package/server/services/builders/generic-morph.js +41 -0
  36. package/server/services/builders/index.js +92 -0
  37. package/server/services/builders/input.js +121 -0
  38. package/server/services/builders/mutations/collection-type.js +191 -0
  39. package/server/services/builders/mutations/index.js +9 -0
  40. package/server/services/builders/mutations/single-type.js +141 -0
  41. package/server/services/builders/queries/collection-type.js +120 -0
  42. package/server/services/builders/queries/index.js +9 -0
  43. package/server/services/builders/queries/single-type.js +70 -0
  44. package/server/services/builders/relation-response-collection.js +35 -0
  45. package/server/services/builders/resolvers/association.js +85 -0
  46. package/server/services/builders/resolvers/component.js +18 -0
  47. package/server/services/builders/resolvers/dynamic-zone.js +9 -0
  48. package/server/services/builders/resolvers/index.js +18 -0
  49. package/server/services/builders/resolvers/mutation.js +33 -0
  50. package/server/services/builders/resolvers/query.js +19 -0
  51. package/server/services/builders/response-collection.js +43 -0
  52. package/server/services/builders/response.js +32 -0
  53. package/server/services/builders/type.js +364 -0
  54. package/server/services/builders/utils.js +134 -0
  55. package/server/services/constants.js +149 -0
  56. package/server/services/content-api/index.js +179 -0
  57. package/server/services/content-api/policy.js +60 -0
  58. package/server/services/content-api/register-functions/collection-type.js +72 -0
  59. package/server/services/content-api/register-functions/component.js +15 -0
  60. package/server/services/content-api/register-functions/content-type/dynamic-zones.js +36 -0
  61. package/server/services/content-api/register-functions/content-type/enums.js +33 -0
  62. package/server/services/content-api/register-functions/content-type/filters.js +15 -0
  63. package/server/services/content-api/register-functions/content-type/index.js +13 -0
  64. package/server/services/content-api/register-functions/content-type/inputs.js +21 -0
  65. package/server/services/content-api/register-functions/index.js +22 -0
  66. package/server/services/content-api/register-functions/internals.js +13 -0
  67. package/server/services/content-api/register-functions/polymorphic.js +69 -0
  68. package/server/services/content-api/register-functions/scalars.js +14 -0
  69. package/server/services/content-api/register-functions/single-type.js +72 -0
  70. package/server/services/content-api/wrap-resolvers.js +144 -0
  71. package/server/services/extension/extension.js +95 -0
  72. package/server/services/extension/index.js +5 -0
  73. package/server/services/extension/shadow-crud-manager.js +159 -0
  74. package/server/services/format/index.js +7 -0
  75. package/server/services/format/return-types.js +27 -0
  76. package/server/services/index.js +21 -0
  77. package/server/services/internals/args/index.js +11 -0
  78. package/server/services/internals/args/pagination.js +19 -0
  79. package/server/services/internals/args/publication-state.js +12 -0
  80. package/server/services/internals/args/sort.js +10 -0
  81. package/server/services/internals/helpers/get-enabled-scalars.js +15 -0
  82. package/server/services/internals/helpers/index.js +7 -0
  83. package/server/services/internals/index.js +13 -0
  84. package/server/services/internals/scalars/index.js +18 -0
  85. package/server/services/internals/scalars/time.js +36 -0
  86. package/server/services/internals/types/error.js +34 -0
  87. package/server/services/internals/types/filters.js +39 -0
  88. package/server/services/internals/types/index.js +29 -0
  89. package/server/services/internals/types/pagination.js +24 -0
  90. package/server/services/internals/types/publication-state.js +24 -0
  91. package/server/services/internals/types/response-collection-meta.js +39 -0
  92. package/server/services/type-registry.js +104 -0
  93. package/server/services/utils/attributes.js +84 -0
  94. package/server/services/utils/index.js +11 -0
  95. package/server/services/utils/mappers/entity-to-response-entity.js +12 -0
  96. package/server/services/utils/mappers/graphql-filters-to-strapi-query.js +109 -0
  97. package/server/services/utils/mappers/graphql-scalar-to-operators.js +17 -0
  98. package/server/services/utils/mappers/index.js +13 -0
  99. package/server/services/utils/mappers/strapi-scalar-to-graphql-scalar.js +25 -0
  100. package/server/services/utils/naming.js +287 -0
  101. package/strapi-admin.js +3 -0
  102. package/strapi-server.js +7 -9
  103. package/admin/src/assets/images/logo.svg +0 -38
  104. package/config/routes.json +0 -3
  105. package/config/schema.graphql +0 -1
  106. package/config/settings.json +0 -12
  107. package/controllers/GraphQL.js +0 -9
  108. package/hooks/graphql/defaults.json +0 -5
  109. package/hooks/graphql/index.js +0 -174
  110. package/hooks/graphql/load-config.js +0 -42
  111. package/services/build-aggregation.js +0 -565
  112. package/services/data-loaders.js +0 -55
  113. package/services/naming.js +0 -15
  114. package/services/resolvers-builder.js +0 -204
  115. package/services/schema-definitions.js +0 -131
  116. package/services/schema-generator.js +0 -178
  117. package/services/shadow-crud.js +0 -612
  118. package/services/type-builder.js +0 -311
  119. package/services/utils.js +0 -200
  120. package/types/dynamiczoneScalar.js +0 -40
  121. package/types/publication-state.js +0 -16
  122. package/types/time.js +0 -26
@@ -0,0 +1,149 @@
1
+ 'use strict';
2
+
3
+ const PAGINATION_TYPE_NAME = 'Pagination';
4
+ const PUBLICATION_STATE_TYPE_NAME = 'PublicationState';
5
+ const ERROR_TYPE_NAME = 'Error';
6
+
7
+ const RESPONSE_COLLECTION_META_TYPE_NAME = 'ResponseCollectionMeta';
8
+
9
+ const GRAPHQL_SCALARS = [
10
+ 'ID',
11
+ 'Boolean',
12
+ 'Int',
13
+ 'String',
14
+ 'Long',
15
+ 'Float',
16
+ 'JSON',
17
+ 'Date',
18
+ 'Time',
19
+ 'DateTime',
20
+ ];
21
+
22
+ const STRAPI_SCALARS = [
23
+ 'boolean',
24
+ 'integer',
25
+ 'string',
26
+ 'richtext',
27
+ 'enumeration',
28
+ 'biginteger',
29
+ 'float',
30
+ 'decimal',
31
+ 'json',
32
+ 'date',
33
+ 'time',
34
+ 'datetime',
35
+ 'timestamp',
36
+ 'uid',
37
+ 'email',
38
+ 'password',
39
+ 'text',
40
+ ];
41
+
42
+ const SCALARS_ASSOCIATIONS = {
43
+ uid: 'String',
44
+ email: 'String',
45
+ password: 'String',
46
+ text: 'String',
47
+ boolean: 'Boolean',
48
+ integer: 'Int',
49
+ string: 'String',
50
+ enumeration: 'String',
51
+ richtext: 'String',
52
+ biginteger: 'Long',
53
+ float: 'Float',
54
+ decimal: 'Float',
55
+ json: 'JSON',
56
+ date: 'Date',
57
+ time: 'Time',
58
+ datetime: 'DateTime',
59
+ timestamp: 'DateTime',
60
+ };
61
+
62
+ const GENERIC_MORPH_TYPENAME = 'GenericMorph';
63
+
64
+ const KINDS = {
65
+ type: 'type',
66
+ component: 'component',
67
+ dynamicZone: 'dynamic-zone',
68
+ enum: 'enum',
69
+ entity: 'entity',
70
+ entityResponse: 'entity-response',
71
+ entityResponseCollection: 'entity-response-collection',
72
+ relationResponseCollection: 'relation-response-collection',
73
+ query: 'query',
74
+ mutation: 'mutation',
75
+ input: 'input',
76
+ filtersInput: 'filters-input',
77
+ scalar: 'scalar',
78
+ morph: 'polymorphic',
79
+ internal: 'internal',
80
+ };
81
+
82
+ const allOperators = [
83
+ 'and',
84
+ 'or',
85
+ 'not',
86
+
87
+ 'eq',
88
+ 'ne',
89
+
90
+ 'startsWith',
91
+ 'endsWith',
92
+
93
+ 'contains',
94
+ 'notContains',
95
+
96
+ 'containsi',
97
+ 'notContainsi',
98
+
99
+ 'gt',
100
+ 'gte',
101
+
102
+ 'lt',
103
+ 'lte',
104
+
105
+ 'null',
106
+ 'notNull',
107
+
108
+ 'in',
109
+ 'notIn',
110
+
111
+ 'between',
112
+ ];
113
+
114
+ const GRAPHQL_SCALAR_OPERATORS = {
115
+ // ID
116
+ ID: allOperators,
117
+ // Booleans
118
+ Boolean: allOperators,
119
+ // Strings
120
+ String: allOperators,
121
+ // Numbers
122
+ Int: allOperators,
123
+ Long: allOperators,
124
+ Float: allOperators,
125
+ // Dates
126
+ Date: allOperators,
127
+ Time: allOperators,
128
+ DateTime: allOperators,
129
+ // Others
130
+ JSON: allOperators,
131
+ };
132
+
133
+ const ERROR_CODES = {
134
+ emptyDynamicZone: 'dynamiczone.empty',
135
+ };
136
+
137
+ module.exports = () => ({
138
+ PAGINATION_TYPE_NAME,
139
+ RESPONSE_COLLECTION_META_TYPE_NAME,
140
+ PUBLICATION_STATE_TYPE_NAME,
141
+ GRAPHQL_SCALARS,
142
+ STRAPI_SCALARS,
143
+ GENERIC_MORPH_TYPENAME,
144
+ KINDS,
145
+ GRAPHQL_SCALAR_OPERATORS,
146
+ SCALARS_ASSOCIATIONS,
147
+ ERROR_CODES,
148
+ ERROR_TYPE_NAME,
149
+ });
@@ -0,0 +1,179 @@
1
+ 'use strict';
2
+
3
+ const {
4
+ mergeSchemas,
5
+ makeExecutableSchema,
6
+ addResolversToSchema,
7
+ } = require('@graphql-tools/schema');
8
+ const { pruneSchema } = require('@graphql-tools/utils');
9
+ const { makeSchema } = require('nexus');
10
+ const { prop, startsWith } = require('lodash/fp');
11
+
12
+ const { wrapResolvers } = require('./wrap-resolvers');
13
+ const {
14
+ registerSingleType,
15
+ registerCollectionType,
16
+ registerComponent,
17
+ registerScalars,
18
+ registerInternals,
19
+ registerPolymorphicContentType,
20
+ contentType: {
21
+ registerEnumsDefinition,
22
+ registerInputsDefinition,
23
+ registerFiltersDefinition,
24
+ registerDynamicZonesDefinition,
25
+ },
26
+ } = require('./register-functions');
27
+
28
+ module.exports = ({ strapi }) => {
29
+ const { service: getGraphQLService } = strapi.plugin('graphql');
30
+ const { config } = strapi.plugin('graphql');
31
+
32
+ const { KINDS, GENERIC_MORPH_TYPENAME } = getGraphQLService('constants');
33
+ const extensionService = getGraphQLService('extension');
34
+
35
+ // Type Registry
36
+ let registry;
37
+ // Builders Instances
38
+ let builders;
39
+
40
+ const buildSchema = () => {
41
+ const isShadowCRUDEnabled = !!config('shadowCRUD');
42
+
43
+ // Create a new empty type registry
44
+ registry = getGraphQLService('type-registry').new();
45
+
46
+ // Reset the builders instances associated to the
47
+ // content-api, and link the new type registry
48
+ builders = getGraphQLService('builders').new('content-api', registry);
49
+
50
+ registerScalars({ registry, strapi });
51
+ registerInternals({ registry, strapi });
52
+
53
+ if (isShadowCRUDEnabled) {
54
+ shadowCRUD();
55
+ }
56
+
57
+ // Build a collection of schema based on the type registry (& temporary generated extension)
58
+ const schemas = buildSchemas({ registry });
59
+
60
+ // Merge every created schema into a single one
61
+ const mergedSchema = mergeSchemas({ schemas });
62
+
63
+ // Generate the extension configuration for the content API.
64
+ // This extension instance needs to be generated after the Nexus schema's
65
+ // generation, so that configurations created during types definitions
66
+ // can be registered before being used in the wrap resolvers operation
67
+ const extension = extensionService.generate({ typeRegistry: registry });
68
+
69
+ // Add the extension's resolvers to the final schema
70
+ const schema = addResolversToSchema(mergedSchema, extension.resolvers);
71
+
72
+ // Wrap resolvers if needed (auth, middlewares, policies...) as configured in the extension
73
+ const wrappedSchema = wrapResolvers({ schema, strapi, extension });
74
+
75
+ // Prune schema, remove unused types
76
+ // eg: removes registered subscriptions if they're disabled in the config)
77
+ const prunedSchema = pruneSchema(wrappedSchema);
78
+
79
+ return prunedSchema;
80
+ };
81
+
82
+ const buildSchemas = ({ registry }) => {
83
+ // Here we extract types, plugins & typeDefs from a temporary generated
84
+ // extension since there won't be any addition allowed after schemas generation
85
+ const { types, plugins, typeDefs = [] } = extensionService.generate({ typeRegistry: registry });
86
+
87
+ // Create a new Nexus schema (shadow CRUD) & add it to the schemas collection
88
+ const nexusSchema = makeSchema({
89
+ types: [
90
+ // Add the auto-generated Nexus types (shadow CRUD)
91
+ registry.definitions,
92
+ // Add every Nexus type registered using the extension service
93
+ types,
94
+ ],
95
+
96
+ plugins: [
97
+ // Add every plugin registered using the extension service
98
+ ...plugins,
99
+ ],
100
+ });
101
+
102
+ // Build schemas based on SDL type definitions (defined in the extension)
103
+ const sdlSchemas = typeDefs.map(sdl => makeExecutableSchema({ typeDefs: sdl }));
104
+
105
+ return [nexusSchema, ...sdlSchemas];
106
+ };
107
+
108
+ const shadowCRUD = () => {
109
+ const extensionService = getGraphQLService('extension');
110
+
111
+ // Get every content type & component defined in Strapi
112
+ const contentTypes = [
113
+ ...Object.values(strapi.components),
114
+ ...Object.values(strapi.contentTypes),
115
+ ];
116
+
117
+ // Disable Shadow CRUD for admin content types
118
+ contentTypes
119
+ .map(prop('uid'))
120
+ .filter(startsWith('admin::'))
121
+ .forEach(uid => extensionService.shadowCRUD(uid).disable());
122
+
123
+ const contentTypesWithShadowCRUD = contentTypes.filter(ct =>
124
+ extensionService.shadowCRUD(ct.uid).isEnabled()
125
+ );
126
+
127
+ // Generate and register definitions for every content type
128
+ registerAPITypes(contentTypesWithShadowCRUD);
129
+
130
+ // Generate and register polymorphic types' definitions
131
+ registerMorphTypes(contentTypesWithShadowCRUD);
132
+ };
133
+
134
+ /**
135
+ * Register needed GraphQL types for every content type
136
+ * @param {object[]} contentTypes
137
+ */
138
+ const registerAPITypes = contentTypes => {
139
+ for (const contentType of contentTypes) {
140
+ const { kind, modelType } = contentType;
141
+
142
+ const registerOptions = { registry, strapi, builders };
143
+
144
+ // Generate various types associated to the content type
145
+ // (enums, dynamic-zones, filters, inputs...)
146
+ registerEnumsDefinition(contentType, registerOptions);
147
+ registerDynamicZonesDefinition(contentType, registerOptions);
148
+ registerFiltersDefinition(contentType, registerOptions);
149
+ registerInputsDefinition(contentType, registerOptions);
150
+
151
+ // Generate & register component's definition
152
+ if (modelType === 'component') {
153
+ registerComponent(contentType, registerOptions);
154
+ }
155
+
156
+ // Generate & register single type's definition
157
+ else if (kind === 'singleType') {
158
+ registerSingleType(contentType, registerOptions);
159
+ }
160
+
161
+ // Generate & register collection type's definition
162
+ else if (kind === 'collectionType') {
163
+ registerCollectionType(contentType, registerOptions);
164
+ }
165
+ }
166
+ };
167
+
168
+ const registerMorphTypes = contentTypes => {
169
+ // Create & register a union type that includes every type or component registered
170
+ const genericMorphType = builders.buildGenericMorphDefinition();
171
+ registry.register(GENERIC_MORPH_TYPENAME, genericMorphType, { kind: KINDS.morph });
172
+
173
+ for (const contentType of contentTypes) {
174
+ registerPolymorphicContentType(contentType, { registry, strapi });
175
+ }
176
+ };
177
+
178
+ return { buildSchema };
179
+ };
@@ -0,0 +1,60 @@
1
+ 'use strict';
2
+
3
+ const { propOr } = require('lodash/fp');
4
+ const { policy: policyUtils } = require('@strapi/utils');
5
+ const { ForbiddenError } = require('@strapi/utils').errors;
6
+
7
+ const getPoliciesConfig = propOr([], 'policies');
8
+
9
+ const createPoliciesMiddleware = (resolverConfig, { strapi }) => {
10
+ const resolverPolicies = getPoliciesConfig(resolverConfig);
11
+ const policies = policyUtils.resolve(resolverPolicies);
12
+
13
+ return async (resolve, ...rest) => {
14
+ // Create a graphql policy context
15
+ const context = createGraphQLPolicyContext(...rest);
16
+
17
+ // Run policies & throw an error if one of them fails
18
+ for (const { handler, config } of policies) {
19
+ const result = await handler(context, config, { strapi });
20
+
21
+ if (![true, undefined].includes(result)) {
22
+ throw new ForbiddenError('Policies failed.');
23
+ }
24
+ }
25
+
26
+ return resolve(...rest);
27
+ };
28
+ };
29
+
30
+ const createGraphQLPolicyContext = (parent, args, context, info) => {
31
+ return policyUtils.createPolicyContext('graphql', {
32
+ get parent() {
33
+ return parent;
34
+ },
35
+
36
+ get args() {
37
+ return args;
38
+ },
39
+
40
+ get context() {
41
+ return context;
42
+ },
43
+
44
+ get info() {
45
+ return info;
46
+ },
47
+
48
+ get state() {
49
+ return this.context.state;
50
+ },
51
+
52
+ get http() {
53
+ return this.context.koaContext;
54
+ },
55
+ });
56
+ };
57
+
58
+ module.exports = {
59
+ createPoliciesMiddleware,
60
+ };
@@ -0,0 +1,72 @@
1
+ 'use strict';
2
+
3
+ const registerCollectionType = (contentType, { registry, strapi, builders }) => {
4
+ const { service: getService } = strapi.plugin('graphql');
5
+
6
+ const { naming } = getService('utils');
7
+ const { KINDS } = getService('constants');
8
+
9
+ const extension = getService('extension');
10
+
11
+ // Types name (as string)
12
+ const types = {
13
+ base: naming.getTypeName(contentType),
14
+ entity: naming.getEntityName(contentType),
15
+ response: naming.getEntityResponseName(contentType),
16
+ responseCollection: naming.getEntityResponseCollectionName(contentType),
17
+ relationResponseCollection: naming.getRelationResponseCollectionName(contentType),
18
+ queries: naming.getEntityQueriesTypeName(contentType),
19
+ mutations: naming.getEntityMutationsTypeName(contentType),
20
+ };
21
+
22
+ const getConfig = kind => ({ kind, contentType });
23
+
24
+ // Type definition
25
+ registry.register(types.base, builders.buildTypeDefinition(contentType), getConfig(KINDS.type));
26
+
27
+ // Higher level entity definition
28
+ registry.register(
29
+ types.entity,
30
+ builders.buildEntityDefinition(contentType),
31
+ getConfig(KINDS.entity)
32
+ );
33
+
34
+ // Responses definition
35
+ registry.register(
36
+ types.response,
37
+ builders.buildResponseDefinition(contentType),
38
+ getConfig(KINDS.entityResponse)
39
+ );
40
+
41
+ registry.register(
42
+ types.responseCollection,
43
+ builders.buildResponseCollectionDefinition(contentType),
44
+ getConfig(KINDS.entityResponseCollection)
45
+ );
46
+
47
+ registry.register(
48
+ types.relationResponseCollection,
49
+ builders.buildRelationResponseCollectionDefinition(contentType),
50
+ getConfig(KINDS.relationResponseCollection)
51
+ );
52
+
53
+ if (extension.shadowCRUD(contentType.uid).areQueriesEnabled()) {
54
+ // Query extensions
55
+ registry.register(
56
+ types.queries,
57
+ builders.buildCollectionTypeQueries(contentType),
58
+ getConfig(KINDS.query)
59
+ );
60
+ }
61
+
62
+ if (extension.shadowCRUD(contentType.uid).areMutationsEnabled()) {
63
+ // Mutation extensions
64
+ registry.register(
65
+ types.mutations,
66
+ builders.buildCollectionTypeMutations(contentType),
67
+ getConfig(KINDS.mutation)
68
+ );
69
+ }
70
+ };
71
+
72
+ module.exports = { registerCollectionType };
@@ -0,0 +1,15 @@
1
+ 'use strict';
2
+
3
+ const registerComponent = (contentType, { registry, strapi, builders }) => {
4
+ const { service: getService } = strapi.plugin('graphql');
5
+
6
+ const { getComponentName } = getService('utils').naming;
7
+ const { KINDS } = getService('constants');
8
+
9
+ const name = getComponentName(contentType);
10
+ const definition = builders.buildTypeDefinition(contentType);
11
+
12
+ registry.register(name, definition, { kind: KINDS.component, contentType });
13
+ };
14
+
15
+ module.exports = { registerComponent };
@@ -0,0 +1,36 @@
1
+ 'use strict';
2
+
3
+ const registerDynamicZonesDefinition = (contentType, { registry, strapi, builders }) => {
4
+ const { service: getService } = strapi.plugin('graphql');
5
+
6
+ const {
7
+ naming,
8
+ attributes: { isDynamicZone },
9
+ } = getService('utils');
10
+ const { KINDS } = getService('constants');
11
+
12
+ const { attributes } = contentType;
13
+
14
+ const dynamicZoneAttributes = Object.keys(attributes).filter(attributeName =>
15
+ isDynamicZone(attributes[attributeName])
16
+ );
17
+
18
+ for (const attributeName of dynamicZoneAttributes) {
19
+ const attribute = attributes[attributeName];
20
+ const dzName = naming.getDynamicZoneName(contentType, attributeName);
21
+ const dzInputName = naming.getDynamicZoneInputName(contentType, attributeName);
22
+
23
+ const [type, input] = builders.buildDynamicZoneDefinition(attribute, dzName, dzInputName);
24
+
25
+ const baseConfig = {
26
+ contentType,
27
+ attributeName,
28
+ attribute,
29
+ };
30
+
31
+ registry.register(dzName, type, { kind: KINDS.dynamicZone, ...baseConfig });
32
+ registry.register(dzInputName, input, { kind: KINDS.input, ...baseConfig });
33
+ }
34
+ };
35
+
36
+ module.exports = { registerDynamicZonesDefinition };
@@ -0,0 +1,33 @@
1
+ 'use strict';
2
+
3
+ const registerEnumsDefinition = (contentType, { registry, strapi, builders }) => {
4
+ const { service: getService } = strapi.plugin('graphql');
5
+
6
+ const {
7
+ naming,
8
+ attributes: { isEnumeration },
9
+ } = getService('utils');
10
+ const { KINDS } = getService('constants');
11
+
12
+ const { attributes } = contentType;
13
+
14
+ const enumAttributes = Object.keys(attributes).filter(attributeName =>
15
+ isEnumeration(attributes[attributeName])
16
+ );
17
+
18
+ for (const attributeName of enumAttributes) {
19
+ const attribute = attributes[attributeName];
20
+
21
+ const enumName = naming.getEnumName(contentType, attributeName);
22
+ const enumDefinition = builders.buildEnumTypeDefinition(attribute, enumName);
23
+
24
+ registry.register(enumName, enumDefinition, {
25
+ kind: KINDS.enum,
26
+ contentType,
27
+ attributeName,
28
+ attribute,
29
+ });
30
+ }
31
+ };
32
+
33
+ module.exports = { registerEnumsDefinition };
@@ -0,0 +1,15 @@
1
+ 'use strict';
2
+
3
+ const registerFiltersDefinition = (contentType, { registry, strapi, builders }) => {
4
+ const { service: getService } = strapi.plugin('graphql');
5
+
6
+ const { getFiltersInputTypeName } = getService('utils').naming;
7
+ const { KINDS } = getService('constants');
8
+
9
+ const type = getFiltersInputTypeName(contentType);
10
+ const definition = builders.buildContentTypeFilters(contentType);
11
+
12
+ registry.register(type, definition, { kind: KINDS.filtersInput, contentType });
13
+ };
14
+
15
+ module.exports = { registerFiltersDefinition };
@@ -0,0 +1,13 @@
1
+ 'use strict';
2
+
3
+ const { registerDynamicZonesDefinition } = require('./dynamic-zones');
4
+ const { registerEnumsDefinition } = require('./enums');
5
+ const { registerInputsDefinition } = require('./inputs');
6
+ const { registerFiltersDefinition } = require('./filters');
7
+
8
+ module.exports = {
9
+ registerDynamicZonesDefinition,
10
+ registerFiltersDefinition,
11
+ registerInputsDefinition,
12
+ registerEnumsDefinition,
13
+ };
@@ -0,0 +1,21 @@
1
+ 'use strict';
2
+
3
+ const registerInputsDefinition = (contentType, { registry, strapi, builders }) => {
4
+ const { service: getService } = strapi.plugin('graphql');
5
+
6
+ const { getComponentInputName, getContentTypeInputName } = getService('utils').naming;
7
+ const { KINDS } = getService('constants');
8
+
9
+ const { modelType } = contentType;
10
+
11
+ const type = (modelType === 'component' ? getComponentInputName : getContentTypeInputName).call(
12
+ null,
13
+ contentType
14
+ );
15
+
16
+ const definition = builders.buildInputType(contentType);
17
+
18
+ registry.register(type, definition, { kind: KINDS.input, contentType });
19
+ };
20
+
21
+ module.exports = { registerInputsDefinition };
@@ -0,0 +1,22 @@
1
+ 'use strict';
2
+
3
+ const { registerCollectionType } = require('./collection-type');
4
+ const { registerSingleType } = require('./single-type');
5
+ const { registerComponent } = require('./component');
6
+ const { registerPolymorphicContentType } = require('./polymorphic');
7
+
8
+ const { registerScalars } = require('./scalars');
9
+ const { registerInternals } = require('./internals');
10
+
11
+ const contentType = require('./content-type');
12
+
13
+ module.exports = {
14
+ registerCollectionType,
15
+ registerSingleType,
16
+ registerComponent,
17
+ registerPolymorphicContentType,
18
+ registerInternals,
19
+ registerScalars,
20
+
21
+ contentType,
22
+ };
@@ -0,0 +1,13 @@
1
+ 'use strict';
2
+
3
+ const registerInternals = ({ registry, strapi }) => {
4
+ const { buildInternalTypes } = strapi.plugin('graphql').service('internals');
5
+
6
+ const internalTypes = buildInternalTypes({ strapi });
7
+
8
+ for (const [kind, definitions] of Object.entries(internalTypes)) {
9
+ registry.registerMany(Object.entries(definitions), { kind });
10
+ }
11
+ };
12
+
13
+ module.exports = { registerInternals };