@strapi/plugin-graphql 0.0.0-experimental.6340da17068c3bed7fb006e7bcc554c71129e282 → 0.0.0-experimental.63624e21eb5b0713345a0cf2f68f1c40eab427bc
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.
- package/dist/admin/index.js +1 -1
- package/dist/admin/index.js.map +1 -1
- package/dist/admin/index.mjs +1 -1
- package/dist/admin/index.mjs.map +1 -1
- package/dist/admin/package.json.js +1 -2
- package/dist/admin/package.json.js.map +1 -1
- package/dist/admin/package.json.mjs +1 -2
- package/dist/admin/package.json.mjs.map +1 -1
- package/dist/admin/src/index.d.ts +2 -1
- package/dist/admin/translations/ko.json.js +10 -0
- package/dist/admin/translations/ko.json.js.map +1 -0
- package/dist/admin/translations/ko.json.mjs +8 -0
- package/dist/admin/translations/ko.json.mjs.map +1 -0
- package/dist/server/bootstrap.js +35 -10
- package/dist/server/bootstrap.js.map +1 -1
- package/dist/server/bootstrap.mjs +33 -9
- package/dist/server/bootstrap.mjs.map +1 -1
- package/dist/server/format-graphql-error.js +34 -8
- package/dist/server/format-graphql-error.js.map +1 -1
- package/dist/server/format-graphql-error.mjs +34 -8
- package/dist/server/format-graphql-error.mjs.map +1 -1
- package/dist/server/index.js.map +1 -1
- package/dist/server/index.mjs.map +1 -1
- package/dist/server/services/builders/dynamic-zones.js +3 -3
- package/dist/server/services/builders/dynamic-zones.js.map +1 -1
- package/dist/server/services/builders/dynamic-zones.mjs +3 -3
- package/dist/server/services/builders/dynamic-zones.mjs.map +1 -1
- package/dist/server/services/builders/entity.js +4 -4
- package/dist/server/services/builders/entity.js.map +1 -1
- package/dist/server/services/builders/entity.mjs +2 -2
- package/dist/server/services/builders/entity.mjs.map +1 -1
- package/dist/server/services/builders/enums.js +2 -2
- package/dist/server/services/builders/enums.js.map +1 -1
- package/dist/server/services/builders/enums.mjs +2 -2
- package/dist/server/services/builders/enums.mjs.map +1 -1
- package/dist/server/services/builders/filters/content-type.js +1 -0
- package/dist/server/services/builders/filters/content-type.js.map +1 -1
- package/dist/server/services/builders/filters/content-type.mjs +1 -0
- package/dist/server/services/builders/filters/content-type.mjs.map +1 -1
- package/dist/server/services/builders/filters/operators/eq.js.map +1 -1
- package/dist/server/services/builders/filters/operators/eq.mjs.map +1 -1
- package/dist/server/services/builders/filters/operators/index.js +3 -3
- package/dist/server/services/builders/filters/operators/index.js.map +1 -1
- package/dist/server/services/builders/filters/operators/index.mjs +3 -3
- package/dist/server/services/builders/filters/operators/index.mjs.map +1 -1
- package/dist/server/services/builders/filters/operators/not.js +1 -0
- package/dist/server/services/builders/filters/operators/not.js.map +1 -1
- package/dist/server/services/builders/filters/operators/not.mjs +1 -0
- package/dist/server/services/builders/filters/operators/not.mjs.map +1 -1
- package/dist/server/services/builders/generic-morph.js +1 -2
- package/dist/server/services/builders/generic-morph.js.map +1 -1
- package/dist/server/services/builders/generic-morph.mjs +1 -2
- package/dist/server/services/builders/generic-morph.mjs.map +1 -1
- package/dist/server/services/builders/index.js +2 -4
- package/dist/server/services/builders/index.js.map +1 -1
- package/dist/server/services/builders/index.mjs +2 -4
- package/dist/server/services/builders/index.mjs.map +1 -1
- package/dist/server/services/builders/input.js +1 -2
- package/dist/server/services/builders/input.js.map +1 -1
- package/dist/server/services/builders/input.mjs +1 -2
- package/dist/server/services/builders/input.mjs.map +1 -1
- package/dist/server/services/builders/queries/collection-type.js.map +1 -1
- package/dist/server/services/builders/queries/collection-type.mjs.map +1 -1
- package/dist/server/services/builders/queries/single-type.js.map +1 -1
- package/dist/server/services/builders/queries/single-type.mjs.map +1 -1
- package/dist/server/services/builders/relation-response-collection.js +3 -3
- package/dist/server/services/builders/relation-response-collection.js.map +1 -1
- package/dist/server/services/builders/relation-response-collection.mjs +3 -3
- package/dist/server/services/builders/relation-response-collection.mjs.map +1 -1
- package/dist/server/services/builders/resolvers/association.js +4 -3
- package/dist/server/services/builders/resolvers/association.js.map +1 -1
- package/dist/server/services/builders/resolvers/association.mjs +4 -3
- package/dist/server/services/builders/resolvers/association.mjs.map +1 -1
- package/dist/server/services/builders/resolvers/component.js +1 -0
- package/dist/server/services/builders/resolvers/component.js.map +1 -1
- package/dist/server/services/builders/resolvers/component.mjs +1 -0
- package/dist/server/services/builders/resolvers/component.mjs.map +1 -1
- package/dist/server/services/builders/resolvers/query.js +3 -3
- package/dist/server/services/builders/resolvers/query.js.map +1 -1
- package/dist/server/services/builders/resolvers/query.mjs +3 -3
- package/dist/server/services/builders/resolvers/query.mjs.map +1 -1
- package/dist/server/services/builders/response-collection.js +4 -4
- package/dist/server/services/builders/response-collection.js.map +1 -1
- package/dist/server/services/builders/response-collection.mjs +3 -3
- package/dist/server/services/builders/response-collection.mjs.map +1 -1
- package/dist/server/services/builders/response.js +1 -2
- package/dist/server/services/builders/response.js.map +1 -1
- package/dist/server/services/builders/response.mjs +1 -2
- package/dist/server/services/builders/response.mjs.map +1 -1
- package/dist/server/services/builders/type.js +4 -4
- package/dist/server/services/builders/type.js.map +1 -1
- package/dist/server/services/builders/type.mjs +3 -3
- package/dist/server/services/builders/type.mjs.map +1 -1
- package/dist/server/services/builders/utils.js +7 -6
- package/dist/server/services/builders/utils.js.map +1 -1
- package/dist/server/services/builders/utils.mjs +7 -6
- package/dist/server/services/builders/utils.mjs.map +1 -1
- package/dist/server/services/constants.js +3 -3
- package/dist/server/services/constants.js.map +1 -1
- package/dist/server/services/constants.mjs +3 -3
- package/dist/server/services/constants.mjs.map +1 -1
- package/dist/server/services/content-api/index.js +12 -10
- package/dist/server/services/content-api/index.js.map +1 -1
- package/dist/server/services/content-api/index.mjs +12 -10
- package/dist/server/services/content-api/index.mjs.map +1 -1
- package/dist/server/services/content-api/policy.js +2 -3
- package/dist/server/services/content-api/policy.js.map +1 -1
- package/dist/server/services/content-api/policy.mjs +2 -3
- package/dist/server/services/content-api/policy.mjs.map +1 -1
- package/dist/server/services/content-api/register-functions/internals.js +1 -3
- package/dist/server/services/content-api/register-functions/internals.js.map +1 -1
- package/dist/server/services/content-api/register-functions/internals.mjs +1 -3
- package/dist/server/services/content-api/register-functions/internals.mjs.map +1 -1
- package/dist/server/services/content-api/wrap-resolvers.js +13 -13
- package/dist/server/services/content-api/wrap-resolvers.js.map +1 -1
- package/dist/server/services/content-api/wrap-resolvers.mjs +13 -13
- package/dist/server/services/content-api/wrap-resolvers.mjs.map +1 -1
- package/dist/server/services/extension/extension.js +3 -3
- package/dist/server/services/extension/extension.js.map +1 -1
- package/dist/server/services/extension/extension.mjs +3 -3
- package/dist/server/services/extension/extension.mjs.map +1 -1
- package/dist/server/services/extension/shadow-crud-manager.js +3 -3
- package/dist/server/services/extension/shadow-crud-manager.js.map +1 -1
- package/dist/server/services/extension/shadow-crud-manager.mjs +3 -3
- package/dist/server/services/extension/shadow-crud-manager.mjs.map +1 -1
- package/dist/server/services/index.js.map +1 -1
- package/dist/server/services/index.mjs +2 -2
- package/dist/server/services/index.mjs.map +1 -1
- package/dist/server/services/internals/helpers/get-enabled-scalars.js +2 -2
- package/dist/server/services/internals/helpers/get-enabled-scalars.js.map +1 -1
- package/dist/server/services/internals/helpers/get-enabled-scalars.mjs +1 -1
- package/dist/server/services/internals/helpers/get-enabled-scalars.mjs.map +1 -1
- package/dist/server/services/internals/types/error.js +1 -2
- package/dist/server/services/internals/types/error.js.map +1 -1
- package/dist/server/services/internals/types/error.mjs +1 -2
- package/dist/server/services/internals/types/error.mjs.map +1 -1
- package/dist/server/services/internals/types/filters.js +3 -0
- package/dist/server/services/internals/types/filters.js.map +1 -1
- package/dist/server/services/internals/types/filters.mjs +3 -0
- package/dist/server/services/internals/types/filters.mjs.map +1 -1
- package/dist/server/services/type-registry.js +1 -2
- package/dist/server/services/type-registry.js.map +1 -1
- package/dist/server/services/type-registry.mjs +1 -2
- package/dist/server/services/type-registry.mjs.map +1 -1
- package/dist/server/services/utils/attributes.js +7 -6
- package/dist/server/services/utils/attributes.js.map +1 -1
- package/dist/server/services/utils/attributes.mjs +7 -6
- package/dist/server/services/utils/attributes.mjs.map +1 -1
- package/dist/server/services/utils/mappers/entity-to-response-entity.js +2 -2
- package/dist/server/services/utils/mappers/entity-to-response-entity.js.map +1 -1
- package/dist/server/services/utils/mappers/entity-to-response-entity.mjs +2 -2
- package/dist/server/services/utils/mappers/entity-to-response-entity.mjs.map +1 -1
- package/dist/server/services/utils/mappers/graphql-filters-to-strapi-query.js +11 -10
- package/dist/server/services/utils/mappers/graphql-filters-to-strapi-query.js.map +1 -1
- package/dist/server/services/utils/mappers/graphql-filters-to-strapi-query.mjs +10 -9
- package/dist/server/services/utils/mappers/graphql-filters-to-strapi-query.mjs.map +1 -1
- package/dist/server/services/utils/mappers/graphql-scalar-to-operators.js +4 -3
- package/dist/server/services/utils/mappers/graphql-scalar-to-operators.js.map +1 -1
- package/dist/server/services/utils/mappers/graphql-scalar-to-operators.mjs +4 -3
- package/dist/server/services/utils/mappers/graphql-scalar-to-operators.mjs.map +1 -1
- package/dist/server/services/utils/mappers/strapi-scalar-to-graphql-scalar.js +3 -3
- package/dist/server/services/utils/mappers/strapi-scalar-to-graphql-scalar.js.map +1 -1
- package/dist/server/services/utils/mappers/strapi-scalar-to-graphql-scalar.mjs +2 -2
- package/dist/server/services/utils/mappers/strapi-scalar-to-graphql-scalar.mjs.map +1 -1
- package/dist/server/services/utils/naming.js +13 -10
- package/dist/server/services/utils/naming.js.map +1 -1
- package/dist/server/services/utils/naming.mjs +9 -6
- package/dist/server/services/utils/naming.mjs.map +1 -1
- package/dist/server/src/bootstrap.d.ts +5 -0
- package/dist/server/src/bootstrap.d.ts.map +1 -1
- package/dist/server/src/format-graphql-error.d.ts.map +1 -1
- package/dist/server/src/index.d.ts +170 -54
- package/dist/server/src/index.d.ts.map +1 -1
- package/dist/server/src/services/builders/dynamic-zones.d.ts +1 -1
- package/dist/server/src/services/builders/filters/content-type.d.ts.map +1 -1
- package/dist/server/src/services/builders/filters/index.d.ts +1 -1
- package/dist/server/src/services/builders/filters/operators/index.d.ts +112 -5
- package/dist/server/src/services/builders/filters/operators/index.d.ts.map +1 -1
- package/dist/server/src/services/builders/filters/operators/not.d.ts.map +1 -1
- package/dist/server/src/services/builders/generic-morph.d.ts.map +1 -1
- package/dist/server/src/services/builders/index.d.ts +120 -11
- package/dist/server/src/services/builders/index.d.ts.map +1 -1
- package/dist/server/src/services/builders/input.d.ts.map +1 -1
- package/dist/server/src/services/builders/mutations/index.d.ts +2 -2
- package/dist/server/src/services/builders/queries/collection-type.d.ts.map +1 -1
- package/dist/server/src/services/builders/queries/index.d.ts +2 -2
- package/dist/server/src/services/builders/resolvers/association.d.ts.map +1 -1
- package/dist/server/src/services/builders/resolvers/component.d.ts.map +1 -1
- package/dist/server/src/services/builders/resolvers/index.d.ts +7 -7
- package/dist/server/src/services/builders/resolvers/index.d.ts.map +1 -1
- package/dist/server/src/services/builders/resolvers/query.d.ts +3 -3
- package/dist/server/src/services/builders/response.d.ts.map +1 -1
- package/dist/server/src/services/builders/utils.d.ts +4 -2
- package/dist/server/src/services/builders/utils.d.ts.map +1 -1
- package/dist/server/src/services/constants.d.ts +4 -67
- package/dist/server/src/services/constants.d.ts.map +1 -1
- package/dist/server/src/services/content-api/index.d.ts.map +1 -1
- package/dist/server/src/services/content-api/policy.d.ts.map +1 -1
- package/dist/server/src/services/extension/shadow-crud-manager.d.ts.map +1 -1
- package/dist/server/src/services/index.d.ts +170 -54
- package/dist/server/src/services/index.d.ts.map +1 -1
- package/dist/server/src/services/internals/types/error.d.ts.map +1 -1
- package/dist/server/src/services/internals/types/filters.d.ts.map +1 -1
- package/dist/server/src/services/type-registry.d.ts.map +1 -1
- package/dist/server/src/services/utils/attributes.d.ts.map +1 -1
- package/dist/server/src/services/utils/index.d.ts +46 -40
- package/dist/server/src/services/utils/index.d.ts.map +1 -1
- package/dist/server/src/services/utils/mappers/entity-to-response-entity.d.ts +14 -7
- package/dist/server/src/services/utils/mappers/entity-to-response-entity.d.ts.map +1 -1
- package/dist/server/src/services/utils/mappers/graphql-filters-to-strapi-query.d.ts.map +1 -1
- package/dist/server/src/services/utils/mappers/index.d.ts +19 -13
- package/dist/server/src/services/utils/mappers/index.d.ts.map +1 -1
- package/dist/server/src/types/index.d.ts +64 -0
- package/dist/server/src/types/index.d.ts.map +1 -0
- package/dist/server/src/types/services.d.ts +97 -0
- package/dist/server/src/types/services.d.ts.map +1 -0
- package/package.json +32 -18
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.mjs","sources":["../../../server/src/services/constants.ts"],"sourcesContent":["const PAGINATION_TYPE_NAME = 'Pagination';\nconst DELETE_MUTATION_RESPONSE_TYPE_NAME = 'DeleteMutationResponse';\nconst PUBLICATION_STATUS_TYPE_NAME = 'PublicationStatus';\nconst PUBLICATION_FILTER_TYPE_NAME = 'PublicationFilter';\nconst ERROR_TYPE_NAME = 'Error';\n\nconst RESPONSE_COLLECTION_META_TYPE_NAME = 'ResponseCollectionMeta';\n\nconst GRAPHQL_SCALARS = [\n 'ID',\n 'Boolean',\n 'Int',\n 'String',\n 'Long',\n 'Float',\n 'JSON',\n 'Date',\n 'Time',\n 'DateTime',\n] as const;\n\nconst STRAPI_SCALARS = [\n 'boolean',\n 'integer',\n 'string',\n 'richtext',\n 'blocks',\n 'enumeration',\n 'biginteger',\n 'float',\n 'decimal',\n 'json',\n 'date',\n 'time',\n 'datetime',\n 'timestamp',\n 'uid',\n 'email',\n 'password',\n 'text',\n] as const;\n\nconst SCALARS_ASSOCIATIONS = {\n uid: 'String',\n email: 'String',\n password: 'String',\n text: 'String',\n boolean: 'Boolean',\n integer: 'Int',\n string: 'String',\n enumeration: 'String',\n richtext: 'String',\n blocks: 'JSON',\n biginteger: 'Long',\n float: 'Float',\n decimal: 'Float',\n json: 'JSON',\n date: 'Date',\n time: 'Time',\n datetime: 'DateTime',\n timestamp: 'DateTime',\n} as const;\n\nconst GENERIC_MORPH_TYPENAME = 'GenericMorph';\n\nconst KINDS = {\n type: 'type',\n component: 'component',\n dynamicZone: 'dynamic-zone',\n enum: 'enum',\n entity: 'entity',\n entityResponse: 'entity-response',\n entityResponseCollection: 'entity-response-collection',\n relationResponseCollection: 'relation-response-collection',\n query: 'query',\n mutation: 'mutation',\n input: 'input',\n filtersInput: 'filters-input',\n scalar: 'scalar',\n morph: 'polymorphic',\n internal: 'internal',\n} as const;\n\nconst allOperators = [\n 'and',\n 'or',\n 'not',\n\n 'eq',\n 'eqi',\n 'ne',\n 'nei',\n\n 'startsWith',\n 'endsWith',\n\n 'contains',\n 'notContains',\n\n 'containsi',\n 'notContainsi',\n\n 'gt',\n 'gte',\n\n 'lt',\n 'lte',\n\n 'null',\n 'notNull',\n\n 'in',\n 'notIn',\n\n 'between',\n] as const;\n\nconst GRAPHQL_SCALAR_OPERATORS = {\n // ID\n ID: allOperators,\n // Booleans\n Boolean: allOperators,\n // Strings\n String: allOperators,\n // Numbers\n Int: allOperators,\n Long: allOperators,\n Float: allOperators,\n // Dates\n Date: allOperators,\n Time: allOperators,\n DateTime: allOperators,\n // Others\n JSON: allOperators,\n} as const;\n\nconst ERROR_CODES = {\n emptyDynamicZone: 'dynamiczone.empty',\n} as const;\n\
|
|
1
|
+
{"version":3,"file":"constants.mjs","sources":["../../../server/src/services/constants.ts"],"sourcesContent":["const PAGINATION_TYPE_NAME = 'Pagination';\nconst DELETE_MUTATION_RESPONSE_TYPE_NAME = 'DeleteMutationResponse';\nconst PUBLICATION_STATUS_TYPE_NAME = 'PublicationStatus';\nconst PUBLICATION_FILTER_TYPE_NAME = 'PublicationFilter';\nconst ERROR_TYPE_NAME = 'Error';\n\nconst RESPONSE_COLLECTION_META_TYPE_NAME = 'ResponseCollectionMeta';\n\nconst GRAPHQL_SCALARS = [\n 'ID',\n 'Boolean',\n 'Int',\n 'String',\n 'Long',\n 'Float',\n 'JSON',\n 'Date',\n 'Time',\n 'DateTime',\n] as const;\n\nconst STRAPI_SCALARS = [\n 'boolean',\n 'integer',\n 'string',\n 'richtext',\n 'blocks',\n 'enumeration',\n 'biginteger',\n 'float',\n 'decimal',\n 'json',\n 'date',\n 'time',\n 'datetime',\n 'timestamp',\n 'uid',\n 'email',\n 'password',\n 'text',\n] as const;\n\nconst SCALARS_ASSOCIATIONS = {\n uid: 'String',\n email: 'String',\n password: 'String',\n text: 'String',\n boolean: 'Boolean',\n integer: 'Int',\n string: 'String',\n enumeration: 'String',\n richtext: 'String',\n blocks: 'JSON',\n biginteger: 'Long',\n float: 'Float',\n decimal: 'Float',\n json: 'JSON',\n date: 'Date',\n time: 'Time',\n datetime: 'DateTime',\n timestamp: 'DateTime',\n} as const;\n\nconst GENERIC_MORPH_TYPENAME = 'GenericMorph';\n\nconst KINDS = {\n type: 'type',\n component: 'component',\n dynamicZone: 'dynamic-zone',\n enum: 'enum',\n entity: 'entity',\n entityResponse: 'entity-response',\n entityResponseCollection: 'entity-response-collection',\n relationResponseCollection: 'relation-response-collection',\n query: 'query',\n mutation: 'mutation',\n input: 'input',\n filtersInput: 'filters-input',\n scalar: 'scalar',\n morph: 'polymorphic',\n internal: 'internal',\n} as const;\n\nconst allOperators = [\n 'and',\n 'or',\n 'not',\n\n 'eq',\n 'eqi',\n 'ne',\n 'nei',\n\n 'startsWith',\n 'endsWith',\n\n 'contains',\n 'notContains',\n\n 'containsi',\n 'notContainsi',\n\n 'gt',\n 'gte',\n\n 'lt',\n 'lte',\n\n 'null',\n 'notNull',\n\n 'in',\n 'notIn',\n\n 'between',\n] as const;\n\nconst GRAPHQL_SCALAR_OPERATORS = {\n // ID\n ID: allOperators,\n // Booleans\n Boolean: allOperators,\n // Strings\n String: allOperators,\n // Numbers\n Int: allOperators,\n Long: allOperators,\n Float: allOperators,\n // Dates\n Date: allOperators,\n Time: allOperators,\n DateTime: allOperators,\n // Others\n JSON: allOperators,\n} as const;\n\nconst ERROR_CODES = {\n emptyDynamicZone: 'dynamiczone.empty',\n} as const;\n\nconst createConstants = () => ({\n PAGINATION_TYPE_NAME,\n RESPONSE_COLLECTION_META_TYPE_NAME,\n DELETE_MUTATION_RESPONSE_TYPE_NAME,\n PUBLICATION_STATUS_TYPE_NAME,\n PUBLICATION_FILTER_TYPE_NAME,\n GRAPHQL_SCALARS,\n STRAPI_SCALARS,\n GENERIC_MORPH_TYPENAME,\n KINDS,\n GRAPHQL_SCALAR_OPERATORS,\n SCALARS_ASSOCIATIONS,\n ERROR_CODES,\n ERROR_TYPE_NAME,\n});\n\n/** The constants service, as runtime builds it. */\nexport type Constants = ReturnType<typeof createConstants>;\n\nexport default createConstants;\n"],"names":["PAGINATION_TYPE_NAME","DELETE_MUTATION_RESPONSE_TYPE_NAME","PUBLICATION_STATUS_TYPE_NAME","PUBLICATION_FILTER_TYPE_NAME","ERROR_TYPE_NAME","RESPONSE_COLLECTION_META_TYPE_NAME","GRAPHQL_SCALARS","STRAPI_SCALARS","SCALARS_ASSOCIATIONS","uid","email","password","text","boolean","integer","string","enumeration","richtext","blocks","biginteger","float","decimal","json","date","time","datetime","timestamp","GENERIC_MORPH_TYPENAME","KINDS","type","component","dynamicZone","enum","entity","entityResponse","entityResponseCollection","relationResponseCollection","query","mutation","input","filtersInput","scalar","morph","internal","allOperators","GRAPHQL_SCALAR_OPERATORS","ID","Boolean","String","Int","Long","Float","Date","Time","DateTime","JSON","ERROR_CODES","emptyDynamicZone","createConstants"],"mappings":"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"}
|
|
@@ -2,7 +2,6 @@
|
|
|
2
2
|
|
|
3
3
|
var utils = require('@graphql-tools/utils');
|
|
4
4
|
var nexus = require('nexus');
|
|
5
|
-
var fp = require('lodash/fp');
|
|
6
5
|
var wrapResolvers = require('./wrap-resolvers.js');
|
|
7
6
|
var collectionType = require('./register-functions/collection-type.js');
|
|
8
7
|
var singleType = require('./register-functions/single-type.js');
|
|
@@ -77,6 +76,7 @@ var contentAPI = (({ strapi })=>{
|
|
|
77
76
|
schema: schemaWithResolvers
|
|
78
77
|
},
|
|
79
78
|
// Apply user-defined plugins
|
|
79
|
+
// The extension keeps develop's published `PluginConfig[]` type for its plugins.
|
|
80
80
|
plugins: extension.plugins,
|
|
81
81
|
// Whether to generate artifacts (GraphQL schema, TS types definitions) or not.
|
|
82
82
|
// By default, we generate artifacts only on development environment
|
|
@@ -93,19 +93,21 @@ var contentAPI = (({ strapi })=>{
|
|
|
93
93
|
// Prune schema, remove unused types
|
|
94
94
|
// eg: removes registered subscriptions if they're disabled in the config)
|
|
95
95
|
const prunedNexusSchema = utils.pruneSchema(wrappedNexusSchema);
|
|
96
|
-
// Populate builtInQueryFields set for use by resolvers to avoid runtime schema builds
|
|
97
|
-
try {
|
|
98
|
-
const queryType = prunedNexusSchema.getQueryType();
|
|
99
|
-
const fields = queryType ? Object.keys(queryType.getFields() || {}) : [];
|
|
100
|
-
builtInQueryFields = new Set(fields);
|
|
101
|
-
} catch (e) {
|
|
102
|
-
// ignore; leave set empty
|
|
103
|
-
}
|
|
104
96
|
return prunedNexusSchema;
|
|
105
97
|
};
|
|
106
98
|
const getBuiltInQueryFields = ()=>builtInQueryFields;
|
|
107
99
|
const isBuiltInQueryField = (fieldName)=>builtInQueryFields.has(fieldName) || fieldName.endsWith('_connection');
|
|
108
100
|
const buildMergedSchema = ({ registry })=>{
|
|
101
|
+
// Capture the built-in (shadow CRUD) query fields from a schema built with only the
|
|
102
|
+
// registry's own types, before any extension-registered types/typeDefs are merged in,
|
|
103
|
+
// so isBuiltInQueryField can tell shadow CRUD fields apart from custom extension resolvers.
|
|
104
|
+
const shadowCRUDSchema = nexus.makeSchema({
|
|
105
|
+
types: [
|
|
106
|
+
registry.definitions
|
|
107
|
+
]
|
|
108
|
+
});
|
|
109
|
+
const shadowCRUDQueryFields = shadowCRUDSchema.getQueryType()?.getFields() ?? {};
|
|
110
|
+
builtInQueryFields = new Set(Object.keys(shadowCRUDQueryFields));
|
|
109
111
|
// Here we extract types, plugins & typeDefs from a temporary generated
|
|
110
112
|
// extension since there won't be any addition allowed after schemas generation
|
|
111
113
|
const { types, typeDefs = [] } = extensionService.generate({
|
|
@@ -136,7 +138,7 @@ var contentAPI = (({ strapi })=>{
|
|
|
136
138
|
...Object.values(strapi.contentTypes)
|
|
137
139
|
];
|
|
138
140
|
// Disable Shadow CRUD for admin content types
|
|
139
|
-
contentTypes.map(
|
|
141
|
+
contentTypes.map((contentType)=>contentType.uid).filter((uid)=>uid.startsWith('admin::')).forEach((uid)=>extensionService.shadowCRUD(uid).disable());
|
|
140
142
|
const contentTypesWithShadowCRUD = contentTypes.filter((ct)=>extensionService.shadowCRUD(ct.uid).isEnabled());
|
|
141
143
|
// Generate and register definitions for every content type
|
|
142
144
|
registerAPITypes(contentTypesWithShadowCRUD);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../../../server/src/services/content-api/index.ts"],"sourcesContent":["import { pruneSchema } from '@graphql-tools/utils';\nimport { makeSchema } from 'nexus';\nimport { prop, startsWith } from 'lodash/fp';\nimport type * as Nexus from 'nexus';\nimport type { Core, Struct } from '@strapi/types';\n\nimport { wrapResolvers } from './wrap-resolvers';\nimport {\n registerSingleType,\n registerCollectionType,\n registerComponent,\n registerScalars,\n registerInternals,\n registerPolymorphicContentType,\n registerEnumsDefinition,\n registerInputsDefinition,\n registerFiltersDefinition,\n registerDynamicZonesDefinition,\n} from './register-functions';\nimport { TypeRegistry } from '../type-registry';\n\nexport default ({ strapi }: { strapi: Core.Strapi }) => {\n // eslint-disable-next-line @typescript-eslint/no-var-requires\n const { mergeSchemas, addResolversToSchema } = require('@graphql-tools/schema');\n\n const { service: getGraphQLService } = strapi.plugin('graphql');\n const { config } = strapi.plugin('graphql');\n\n const { KINDS, GENERIC_MORPH_TYPENAME } = getGraphQLService('constants');\n const extensionService = getGraphQLService('extension');\n\n // Type Registry\n let registry: any;\n // Builders Instances\n let builders: any;\n // Cached set of built-in query fields (populated at bootstrap)\n let builtInQueryFields: Set<string> = new Set();\n\n const buildSchema = () => {\n const isShadowCRUDEnabled = !!config('shadowCRUD');\n\n // Create a new empty type registry\n registry = getGraphQLService('type-registry').new();\n\n // Reset the builders instances associated to the\n // content-api, and link the new type registry\n builders = getGraphQLService('builders').new('content-api', registry);\n\n registerScalars({ registry, strapi });\n registerInternals({ registry, strapi });\n\n if (isShadowCRUDEnabled) {\n shadowCRUD();\n }\n\n // Build a merged schema from both Nexus types & SDL type definitions\n const schema = buildMergedSchema({ registry });\n\n // Generate the extension configuration for the content API.\n // This extension instance needs to be generated after the Nexus schema's\n // generation, so that configurations created during types definitions\n // can be registered before being used in the wrap resolvers operation\n const extension = extensionService.generate({ typeRegistry: registry });\n\n // Add the extension's resolvers to the final schema\n const schemaWithResolvers = addResolversToSchema({\n schema,\n resolvers: extension.resolvers,\n });\n\n // Create a configuration object for the artifacts generation\n const outputs: Nexus.core.SchemaConfig['outputs'] = {\n schema: config('artifacts.schema', false),\n typegen: config('artifacts.typegen', false),\n };\n\n const currentEnv = strapi.config.get('environment');\n\n const nexusSchema = makeSchema({\n types: [],\n // Build the schema from the merged GraphQL schema.\n // Since we're passing the schema to the mergeSchema property, it'll transform our SDL type definitions\n // into Nexus type definition, thus allowing them to be handled by Nexus plugins & other processing\n mergeSchema: { schema: schemaWithResolvers },\n\n // Apply user-defined plugins\n plugins: extension.plugins,\n\n // Whether to generate artifacts (GraphQL schema, TS types definitions) or not.\n // By default, we generate artifacts only on development environment\n shouldGenerateArtifacts: config('generateArtifacts', currentEnv === 'development'),\n\n // Artifacts generation configuration\n outputs,\n });\n\n // Wrap resolvers if needed (auth, middlewares, policies...) as configured in the extension\n const wrappedNexusSchema = wrapResolvers({ schema: nexusSchema, strapi, extension });\n\n // Prune schema, remove unused types\n // eg: removes registered subscriptions if they're disabled in the config)\n const prunedNexusSchema = pruneSchema(wrappedNexusSchema);\n\n // Populate builtInQueryFields set for use by resolvers to avoid runtime schema builds\n try {\n const queryType = prunedNexusSchema.getQueryType();\n const fields = queryType ? Object.keys(queryType.getFields() || {}) : [];\n builtInQueryFields = new Set(fields);\n } catch (e) {\n // ignore; leave set empty\n }\n\n return prunedNexusSchema;\n };\n\n const getBuiltInQueryFields = () => builtInQueryFields;\n\n const isBuiltInQueryField = (fieldName: string) =>\n builtInQueryFields.has(fieldName) || fieldName.endsWith('_connection');\n\n const buildMergedSchema = ({ registry }: { registry: TypeRegistry }) => {\n // Here we extract types, plugins & typeDefs from a temporary generated\n // extension since there won't be any addition allowed after schemas generation\n const { types, typeDefs = [] } = extensionService.generate({ typeRegistry: registry });\n\n // Nexus schema built with user-defined & shadow CRUD auto generated Nexus types\n const nexusSchema = makeSchema({ types: [registry.definitions, types] });\n\n // Merge type definitions with the Nexus schema\n return mergeSchemas({\n typeDefs,\n // Give access to the shadowCRUD & nexus based types\n // Note: This is necessary so that types defined in SDL can reference types defined with Nexus\n schemas: [nexusSchema],\n });\n };\n\n const shadowCRUD = () => {\n const extensionService = getGraphQLService('extension');\n\n // Get every content type & component defined in Strapi\n const contentTypes = [\n ...Object.values(strapi.components),\n ...Object.values(strapi.contentTypes),\n ];\n\n // Disable Shadow CRUD for admin content types\n contentTypes\n .map(prop('uid'))\n .filter(startsWith('admin::'))\n .forEach((uid) => extensionService.shadowCRUD(uid).disable());\n\n const contentTypesWithShadowCRUD = contentTypes.filter((ct) =>\n extensionService.shadowCRUD(ct.uid).isEnabled()\n );\n\n // Generate and register definitions for every content type\n registerAPITypes(contentTypesWithShadowCRUD);\n\n // Generate and register polymorphic types' definitions\n registerMorphTypes(contentTypesWithShadowCRUD);\n };\n\n /**\n * Register needed GraphQL types for every content type\n * @param {object[]} contentTypes\n */\n const registerAPITypes = (contentTypes: Struct.Schema[]) => {\n for (const contentType of contentTypes) {\n const { modelType } = contentType;\n\n const registerOptions = { registry, strapi, builders };\n\n // Generate various types associated to the content type\n // (enums, dynamic-zones, filters, inputs...)\n registerEnumsDefinition(contentType, registerOptions);\n registerDynamicZonesDefinition(contentType, registerOptions);\n registerFiltersDefinition(contentType, registerOptions);\n registerInputsDefinition(contentType, registerOptions);\n\n // Generate & register component's definition\n if (modelType === 'component') {\n registerComponent(contentType, registerOptions);\n continue;\n }\n\n const { kind } = contentType;\n\n // Generate & register single type's definition\n if (kind === 'singleType') {\n registerSingleType(contentType, registerOptions);\n }\n\n // Generate & register collection type's definition\n else if (kind === 'collectionType') {\n registerCollectionType(contentType, registerOptions);\n }\n }\n };\n\n const registerMorphTypes = (contentTypes: Struct.Schema[]) => {\n // Create & register a union type that includes every type or component registered\n const genericMorphType = builders.buildGenericMorphDefinition();\n registry.register(GENERIC_MORPH_TYPENAME, genericMorphType, { kind: KINDS.morph });\n\n for (const contentType of contentTypes) {\n registerPolymorphicContentType(contentType, { registry, strapi });\n }\n };\n\n return { buildSchema, getBuiltInQueryFields, isBuiltInQueryField };\n};\n"],"names":["strapi","mergeSchemas","addResolversToSchema","require","service","getGraphQLService","plugin","config","KINDS","GENERIC_MORPH_TYPENAME","extensionService","registry","builders","builtInQueryFields","Set","buildSchema","isShadowCRUDEnabled","new","registerScalars","registerInternals","shadowCRUD","schema","buildMergedSchema","extension","generate","typeRegistry","schemaWithResolvers","resolvers","outputs","typegen","currentEnv","get","nexusSchema","makeSchema","types","mergeSchema","plugins","shouldGenerateArtifacts","wrappedNexusSchema","wrapResolvers","prunedNexusSchema","pruneSchema","queryType","getQueryType","fields","Object","keys","getFields","e","getBuiltInQueryFields","isBuiltInQueryField","fieldName","has","endsWith","typeDefs","definitions","schemas","contentTypes","values","components","map","prop","filter","startsWith","forEach","uid","disable","contentTypesWithShadowCRUD","ct","isEnabled","registerAPITypes","registerMorphTypes","contentType","modelType","registerOptions","registerEnumsDefinition","registerDynamicZonesDefinition","registerFiltersDefinition","registerInputsDefinition","registerComponent","kind","registerSingleType","registerCollectionType","genericMorphType","buildGenericMorphDefinition","register","morph","registerPolymorphicContentType"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../../server/src/services/content-api/index.ts"],"sourcesContent":["import { pruneSchema } from '@graphql-tools/utils';\nimport { makeSchema } from 'nexus';\nimport type * as Nexus from 'nexus';\nimport type { Core, Struct } from '@strapi/types';\n\nimport { wrapResolvers } from './wrap-resolvers';\nimport {\n registerSingleType,\n registerCollectionType,\n registerComponent,\n registerScalars,\n registerInternals,\n registerPolymorphicContentType,\n registerEnumsDefinition,\n registerInputsDefinition,\n registerFiltersDefinition,\n registerDynamicZonesDefinition,\n} from './register-functions';\nimport { TypeRegistry } from '../type-registry';\n\nexport default ({ strapi }: { strapi: Core.Strapi }) => {\n // eslint-disable-next-line @typescript-eslint/no-var-requires\n const { mergeSchemas, addResolversToSchema } = require('@graphql-tools/schema');\n\n const { service: getGraphQLService } = strapi.plugin('graphql');\n const { config } = strapi.plugin('graphql');\n\n const { KINDS, GENERIC_MORPH_TYPENAME } = getGraphQLService('constants');\n const extensionService = getGraphQLService('extension');\n\n // Type Registry\n let registry: any;\n // Builders Instances\n let builders: any;\n // Cached set of built-in query fields (populated at bootstrap)\n let builtInQueryFields: Set<string> = new Set();\n\n const buildSchema = () => {\n const isShadowCRUDEnabled = !!config('shadowCRUD');\n\n // Create a new empty type registry\n registry = getGraphQLService('type-registry').new();\n\n // Reset the builders instances associated to the\n // content-api, and link the new type registry\n builders = getGraphQLService('builders').new('content-api', registry);\n\n registerScalars({ registry, strapi });\n registerInternals({ registry, strapi });\n\n if (isShadowCRUDEnabled) {\n shadowCRUD();\n }\n\n // Build a merged schema from both Nexus types & SDL type definitions\n const schema = buildMergedSchema({ registry });\n\n // Generate the extension configuration for the content API.\n // This extension instance needs to be generated after the Nexus schema's\n // generation, so that configurations created during types definitions\n // can be registered before being used in the wrap resolvers operation\n const extension = extensionService.generate({ typeRegistry: registry });\n\n // Add the extension's resolvers to the final schema\n const schemaWithResolvers = addResolversToSchema({\n schema,\n resolvers: extension.resolvers,\n });\n\n // Create a configuration object for the artifacts generation\n const outputs: Nexus.core.SchemaConfig['outputs'] = {\n schema: config('artifacts.schema', false),\n typegen: config('artifacts.typegen', false),\n };\n\n const currentEnv = strapi.config.get('environment');\n\n const nexusSchema = makeSchema({\n types: [],\n // Build the schema from the merged GraphQL schema.\n // Since we're passing the schema to the mergeSchema property, it'll transform our SDL type definitions\n // into Nexus type definition, thus allowing them to be handled by Nexus plugins & other processing\n mergeSchema: { schema: schemaWithResolvers },\n\n // Apply user-defined plugins\n // The extension keeps develop's published `PluginConfig[]` type for its plugins.\n plugins: extension.plugins as unknown as Nexus.core.NexusPlugin[],\n\n // Whether to generate artifacts (GraphQL schema, TS types definitions) or not.\n // By default, we generate artifacts only on development environment\n shouldGenerateArtifacts: config('generateArtifacts', currentEnv === 'development'),\n\n // Artifacts generation configuration\n outputs,\n });\n\n // Wrap resolvers if needed (auth, middlewares, policies...) as configured in the extension\n const wrappedNexusSchema = wrapResolvers({ schema: nexusSchema, strapi, extension });\n\n // Prune schema, remove unused types\n // eg: removes registered subscriptions if they're disabled in the config)\n const prunedNexusSchema = pruneSchema(wrappedNexusSchema);\n\n return prunedNexusSchema;\n };\n\n const getBuiltInQueryFields = () => builtInQueryFields;\n\n const isBuiltInQueryField = (fieldName: string) =>\n builtInQueryFields.has(fieldName) || fieldName.endsWith('_connection');\n\n const buildMergedSchema = ({ registry }: { registry: TypeRegistry }) => {\n // Capture the built-in (shadow CRUD) query fields from a schema built with only the\n // registry's own types, before any extension-registered types/typeDefs are merged in,\n // so isBuiltInQueryField can tell shadow CRUD fields apart from custom extension resolvers.\n const shadowCRUDSchema = makeSchema({ types: [registry.definitions] });\n const shadowCRUDQueryFields = shadowCRUDSchema.getQueryType()?.getFields() ?? {};\n builtInQueryFields = new Set(Object.keys(shadowCRUDQueryFields));\n\n // Here we extract types, plugins & typeDefs from a temporary generated\n // extension since there won't be any addition allowed after schemas generation\n const { types, typeDefs = [] } = extensionService.generate({ typeRegistry: registry });\n\n // Nexus schema built with user-defined & shadow CRUD auto generated Nexus types\n const nexusSchema = makeSchema({ types: [registry.definitions, types] });\n\n // Merge type definitions with the Nexus schema\n return mergeSchemas({\n typeDefs,\n // Give access to the shadowCRUD & nexus based types\n // Note: This is necessary so that types defined in SDL can reference types defined with Nexus\n schemas: [nexusSchema],\n });\n };\n\n const shadowCRUD = () => {\n const extensionService = getGraphQLService('extension');\n\n // Get every content type & component defined in Strapi\n const contentTypes = [\n ...Object.values(strapi.components),\n ...Object.values(strapi.contentTypes),\n ];\n\n // Disable Shadow CRUD for admin content types\n contentTypes\n .map((contentType) => contentType.uid)\n .filter((uid) => uid.startsWith('admin::'))\n .forEach((uid) => extensionService.shadowCRUD(uid).disable());\n\n const contentTypesWithShadowCRUD = contentTypes.filter((ct) =>\n extensionService.shadowCRUD(ct.uid).isEnabled()\n );\n\n // Generate and register definitions for every content type\n registerAPITypes(contentTypesWithShadowCRUD);\n\n // Generate and register polymorphic types' definitions\n registerMorphTypes(contentTypesWithShadowCRUD);\n };\n\n /**\n * Register needed GraphQL types for every content type\n * @param {object[]} contentTypes\n */\n const registerAPITypes = (contentTypes: Struct.Schema[]) => {\n for (const contentType of contentTypes) {\n const { modelType } = contentType;\n\n const registerOptions = { registry, strapi, builders };\n\n // Generate various types associated to the content type\n // (enums, dynamic-zones, filters, inputs...)\n registerEnumsDefinition(contentType, registerOptions);\n registerDynamicZonesDefinition(contentType, registerOptions);\n registerFiltersDefinition(contentType, registerOptions);\n registerInputsDefinition(contentType, registerOptions);\n\n // Generate & register component's definition\n if (modelType === 'component') {\n registerComponent(contentType, registerOptions);\n continue;\n }\n\n const { kind } = contentType;\n\n // Generate & register single type's definition\n if (kind === 'singleType') {\n registerSingleType(contentType, registerOptions);\n }\n\n // Generate & register collection type's definition\n else if (kind === 'collectionType') {\n registerCollectionType(contentType, registerOptions);\n }\n }\n };\n\n const registerMorphTypes = (contentTypes: Struct.Schema[]) => {\n // Create & register a union type that includes every type or component registered\n const genericMorphType = builders.buildGenericMorphDefinition();\n registry.register(GENERIC_MORPH_TYPENAME, genericMorphType, { kind: KINDS.morph });\n\n for (const contentType of contentTypes) {\n registerPolymorphicContentType(contentType, { registry, strapi });\n }\n };\n\n return { buildSchema, getBuiltInQueryFields, isBuiltInQueryField };\n};\n"],"names":["strapi","mergeSchemas","addResolversToSchema","require","service","getGraphQLService","plugin","config","KINDS","GENERIC_MORPH_TYPENAME","extensionService","registry","builders","builtInQueryFields","Set","buildSchema","isShadowCRUDEnabled","new","registerScalars","registerInternals","shadowCRUD","schema","buildMergedSchema","extension","generate","typeRegistry","schemaWithResolvers","resolvers","outputs","typegen","currentEnv","get","nexusSchema","makeSchema","types","mergeSchema","plugins","shouldGenerateArtifacts","wrappedNexusSchema","wrapResolvers","prunedNexusSchema","pruneSchema","getBuiltInQueryFields","isBuiltInQueryField","fieldName","has","endsWith","shadowCRUDSchema","definitions","shadowCRUDQueryFields","getQueryType","getFields","Object","keys","typeDefs","schemas","contentTypes","values","components","map","contentType","uid","filter","startsWith","forEach","disable","contentTypesWithShadowCRUD","ct","isEnabled","registerAPITypes","registerMorphTypes","modelType","registerOptions","registerEnumsDefinition","registerDynamicZonesDefinition","registerFiltersDefinition","registerInputsDefinition","registerComponent","kind","registerSingleType","registerCollectionType","genericMorphType","buildGenericMorphDefinition","register","morph","registerPolymorphicContentType"],"mappings":"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"}
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { pruneSchema } from '@graphql-tools/utils';
|
|
2
2
|
import { makeSchema } from 'nexus';
|
|
3
|
-
import { prop, startsWith } from 'lodash/fp';
|
|
4
3
|
import { wrapResolvers } from './wrap-resolvers.mjs';
|
|
5
4
|
import { registerCollectionType } from './register-functions/collection-type.mjs';
|
|
6
5
|
import { registerSingleType } from './register-functions/single-type.mjs';
|
|
@@ -75,6 +74,7 @@ var contentAPI = (({ strapi })=>{
|
|
|
75
74
|
schema: schemaWithResolvers
|
|
76
75
|
},
|
|
77
76
|
// Apply user-defined plugins
|
|
77
|
+
// The extension keeps develop's published `PluginConfig[]` type for its plugins.
|
|
78
78
|
plugins: extension.plugins,
|
|
79
79
|
// Whether to generate artifacts (GraphQL schema, TS types definitions) or not.
|
|
80
80
|
// By default, we generate artifacts only on development environment
|
|
@@ -91,19 +91,21 @@ var contentAPI = (({ strapi })=>{
|
|
|
91
91
|
// Prune schema, remove unused types
|
|
92
92
|
// eg: removes registered subscriptions if they're disabled in the config)
|
|
93
93
|
const prunedNexusSchema = pruneSchema(wrappedNexusSchema);
|
|
94
|
-
// Populate builtInQueryFields set for use by resolvers to avoid runtime schema builds
|
|
95
|
-
try {
|
|
96
|
-
const queryType = prunedNexusSchema.getQueryType();
|
|
97
|
-
const fields = queryType ? Object.keys(queryType.getFields() || {}) : [];
|
|
98
|
-
builtInQueryFields = new Set(fields);
|
|
99
|
-
} catch (e) {
|
|
100
|
-
// ignore; leave set empty
|
|
101
|
-
}
|
|
102
94
|
return prunedNexusSchema;
|
|
103
95
|
};
|
|
104
96
|
const getBuiltInQueryFields = ()=>builtInQueryFields;
|
|
105
97
|
const isBuiltInQueryField = (fieldName)=>builtInQueryFields.has(fieldName) || fieldName.endsWith('_connection');
|
|
106
98
|
const buildMergedSchema = ({ registry })=>{
|
|
99
|
+
// Capture the built-in (shadow CRUD) query fields from a schema built with only the
|
|
100
|
+
// registry's own types, before any extension-registered types/typeDefs are merged in,
|
|
101
|
+
// so isBuiltInQueryField can tell shadow CRUD fields apart from custom extension resolvers.
|
|
102
|
+
const shadowCRUDSchema = makeSchema({
|
|
103
|
+
types: [
|
|
104
|
+
registry.definitions
|
|
105
|
+
]
|
|
106
|
+
});
|
|
107
|
+
const shadowCRUDQueryFields = shadowCRUDSchema.getQueryType()?.getFields() ?? {};
|
|
108
|
+
builtInQueryFields = new Set(Object.keys(shadowCRUDQueryFields));
|
|
107
109
|
// Here we extract types, plugins & typeDefs from a temporary generated
|
|
108
110
|
// extension since there won't be any addition allowed after schemas generation
|
|
109
111
|
const { types, typeDefs = [] } = extensionService.generate({
|
|
@@ -134,7 +136,7 @@ var contentAPI = (({ strapi })=>{
|
|
|
134
136
|
...Object.values(strapi.contentTypes)
|
|
135
137
|
];
|
|
136
138
|
// Disable Shadow CRUD for admin content types
|
|
137
|
-
contentTypes.map(
|
|
139
|
+
contentTypes.map((contentType)=>contentType.uid).filter((uid)=>uid.startsWith('admin::')).forEach((uid)=>extensionService.shadowCRUD(uid).disable());
|
|
138
140
|
const contentTypesWithShadowCRUD = contentTypes.filter((ct)=>extensionService.shadowCRUD(ct.uid).isEnabled());
|
|
139
141
|
// Generate and register definitions for every content type
|
|
140
142
|
registerAPITypes(contentTypesWithShadowCRUD);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","sources":["../../../../server/src/services/content-api/index.ts"],"sourcesContent":["import { pruneSchema } from '@graphql-tools/utils';\nimport { makeSchema } from 'nexus';\nimport { prop, startsWith } from 'lodash/fp';\nimport type * as Nexus from 'nexus';\nimport type { Core, Struct } from '@strapi/types';\n\nimport { wrapResolvers } from './wrap-resolvers';\nimport {\n registerSingleType,\n registerCollectionType,\n registerComponent,\n registerScalars,\n registerInternals,\n registerPolymorphicContentType,\n registerEnumsDefinition,\n registerInputsDefinition,\n registerFiltersDefinition,\n registerDynamicZonesDefinition,\n} from './register-functions';\nimport { TypeRegistry } from '../type-registry';\n\nexport default ({ strapi }: { strapi: Core.Strapi }) => {\n // eslint-disable-next-line @typescript-eslint/no-var-requires\n const { mergeSchemas, addResolversToSchema } = require('@graphql-tools/schema');\n\n const { service: getGraphQLService } = strapi.plugin('graphql');\n const { config } = strapi.plugin('graphql');\n\n const { KINDS, GENERIC_MORPH_TYPENAME } = getGraphQLService('constants');\n const extensionService = getGraphQLService('extension');\n\n // Type Registry\n let registry: any;\n // Builders Instances\n let builders: any;\n // Cached set of built-in query fields (populated at bootstrap)\n let builtInQueryFields: Set<string> = new Set();\n\n const buildSchema = () => {\n const isShadowCRUDEnabled = !!config('shadowCRUD');\n\n // Create a new empty type registry\n registry = getGraphQLService('type-registry').new();\n\n // Reset the builders instances associated to the\n // content-api, and link the new type registry\n builders = getGraphQLService('builders').new('content-api', registry);\n\n registerScalars({ registry, strapi });\n registerInternals({ registry, strapi });\n\n if (isShadowCRUDEnabled) {\n shadowCRUD();\n }\n\n // Build a merged schema from both Nexus types & SDL type definitions\n const schema = buildMergedSchema({ registry });\n\n // Generate the extension configuration for the content API.\n // This extension instance needs to be generated after the Nexus schema's\n // generation, so that configurations created during types definitions\n // can be registered before being used in the wrap resolvers operation\n const extension = extensionService.generate({ typeRegistry: registry });\n\n // Add the extension's resolvers to the final schema\n const schemaWithResolvers = addResolversToSchema({\n schema,\n resolvers: extension.resolvers,\n });\n\n // Create a configuration object for the artifacts generation\n const outputs: Nexus.core.SchemaConfig['outputs'] = {\n schema: config('artifacts.schema', false),\n typegen: config('artifacts.typegen', false),\n };\n\n const currentEnv = strapi.config.get('environment');\n\n const nexusSchema = makeSchema({\n types: [],\n // Build the schema from the merged GraphQL schema.\n // Since we're passing the schema to the mergeSchema property, it'll transform our SDL type definitions\n // into Nexus type definition, thus allowing them to be handled by Nexus plugins & other processing\n mergeSchema: { schema: schemaWithResolvers },\n\n // Apply user-defined plugins\n plugins: extension.plugins,\n\n // Whether to generate artifacts (GraphQL schema, TS types definitions) or not.\n // By default, we generate artifacts only on development environment\n shouldGenerateArtifacts: config('generateArtifacts', currentEnv === 'development'),\n\n // Artifacts generation configuration\n outputs,\n });\n\n // Wrap resolvers if needed (auth, middlewares, policies...) as configured in the extension\n const wrappedNexusSchema = wrapResolvers({ schema: nexusSchema, strapi, extension });\n\n // Prune schema, remove unused types\n // eg: removes registered subscriptions if they're disabled in the config)\n const prunedNexusSchema = pruneSchema(wrappedNexusSchema);\n\n // Populate builtInQueryFields set for use by resolvers to avoid runtime schema builds\n try {\n const queryType = prunedNexusSchema.getQueryType();\n const fields = queryType ? Object.keys(queryType.getFields() || {}) : [];\n builtInQueryFields = new Set(fields);\n } catch (e) {\n // ignore; leave set empty\n }\n\n return prunedNexusSchema;\n };\n\n const getBuiltInQueryFields = () => builtInQueryFields;\n\n const isBuiltInQueryField = (fieldName: string) =>\n builtInQueryFields.has(fieldName) || fieldName.endsWith('_connection');\n\n const buildMergedSchema = ({ registry }: { registry: TypeRegistry }) => {\n // Here we extract types, plugins & typeDefs from a temporary generated\n // extension since there won't be any addition allowed after schemas generation\n const { types, typeDefs = [] } = extensionService.generate({ typeRegistry: registry });\n\n // Nexus schema built with user-defined & shadow CRUD auto generated Nexus types\n const nexusSchema = makeSchema({ types: [registry.definitions, types] });\n\n // Merge type definitions with the Nexus schema\n return mergeSchemas({\n typeDefs,\n // Give access to the shadowCRUD & nexus based types\n // Note: This is necessary so that types defined in SDL can reference types defined with Nexus\n schemas: [nexusSchema],\n });\n };\n\n const shadowCRUD = () => {\n const extensionService = getGraphQLService('extension');\n\n // Get every content type & component defined in Strapi\n const contentTypes = [\n ...Object.values(strapi.components),\n ...Object.values(strapi.contentTypes),\n ];\n\n // Disable Shadow CRUD for admin content types\n contentTypes\n .map(prop('uid'))\n .filter(startsWith('admin::'))\n .forEach((uid) => extensionService.shadowCRUD(uid).disable());\n\n const contentTypesWithShadowCRUD = contentTypes.filter((ct) =>\n extensionService.shadowCRUD(ct.uid).isEnabled()\n );\n\n // Generate and register definitions for every content type\n registerAPITypes(contentTypesWithShadowCRUD);\n\n // Generate and register polymorphic types' definitions\n registerMorphTypes(contentTypesWithShadowCRUD);\n };\n\n /**\n * Register needed GraphQL types for every content type\n * @param {object[]} contentTypes\n */\n const registerAPITypes = (contentTypes: Struct.Schema[]) => {\n for (const contentType of contentTypes) {\n const { modelType } = contentType;\n\n const registerOptions = { registry, strapi, builders };\n\n // Generate various types associated to the content type\n // (enums, dynamic-zones, filters, inputs...)\n registerEnumsDefinition(contentType, registerOptions);\n registerDynamicZonesDefinition(contentType, registerOptions);\n registerFiltersDefinition(contentType, registerOptions);\n registerInputsDefinition(contentType, registerOptions);\n\n // Generate & register component's definition\n if (modelType === 'component') {\n registerComponent(contentType, registerOptions);\n continue;\n }\n\n const { kind } = contentType;\n\n // Generate & register single type's definition\n if (kind === 'singleType') {\n registerSingleType(contentType, registerOptions);\n }\n\n // Generate & register collection type's definition\n else if (kind === 'collectionType') {\n registerCollectionType(contentType, registerOptions);\n }\n }\n };\n\n const registerMorphTypes = (contentTypes: Struct.Schema[]) => {\n // Create & register a union type that includes every type or component registered\n const genericMorphType = builders.buildGenericMorphDefinition();\n registry.register(GENERIC_MORPH_TYPENAME, genericMorphType, { kind: KINDS.morph });\n\n for (const contentType of contentTypes) {\n registerPolymorphicContentType(contentType, { registry, strapi });\n }\n };\n\n return { buildSchema, getBuiltInQueryFields, isBuiltInQueryField };\n};\n"],"names":["strapi","mergeSchemas","addResolversToSchema","require","service","getGraphQLService","plugin","config","KINDS","GENERIC_MORPH_TYPENAME","extensionService","registry","builders","builtInQueryFields","Set","buildSchema","isShadowCRUDEnabled","new","registerScalars","registerInternals","shadowCRUD","schema","buildMergedSchema","extension","generate","typeRegistry","schemaWithResolvers","resolvers","outputs","typegen","currentEnv","get","nexusSchema","makeSchema","types","mergeSchema","plugins","shouldGenerateArtifacts","wrappedNexusSchema","wrapResolvers","prunedNexusSchema","pruneSchema","queryType","getQueryType","fields","Object","keys","getFields","e","getBuiltInQueryFields","isBuiltInQueryField","fieldName","has","endsWith","typeDefs","definitions","schemas","contentTypes","values","components","map","prop","filter","startsWith","forEach","uid","disable","contentTypesWithShadowCRUD","ct","isEnabled","registerAPITypes","registerMorphTypes","contentType","modelType","registerOptions","registerEnumsDefinition","registerDynamicZonesDefinition","registerFiltersDefinition","registerInputsDefinition","registerComponent","kind","registerSingleType","registerCollectionType","genericMorphType","buildGenericMorphDefinition","register","morph","registerPolymorphicContentType"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.mjs","sources":["../../../../server/src/services/content-api/index.ts"],"sourcesContent":["import { pruneSchema } from '@graphql-tools/utils';\nimport { makeSchema } from 'nexus';\nimport type * as Nexus from 'nexus';\nimport type { Core, Struct } from '@strapi/types';\n\nimport { wrapResolvers } from './wrap-resolvers';\nimport {\n registerSingleType,\n registerCollectionType,\n registerComponent,\n registerScalars,\n registerInternals,\n registerPolymorphicContentType,\n registerEnumsDefinition,\n registerInputsDefinition,\n registerFiltersDefinition,\n registerDynamicZonesDefinition,\n} from './register-functions';\nimport { TypeRegistry } from '../type-registry';\n\nexport default ({ strapi }: { strapi: Core.Strapi }) => {\n // eslint-disable-next-line @typescript-eslint/no-var-requires\n const { mergeSchemas, addResolversToSchema } = require('@graphql-tools/schema');\n\n const { service: getGraphQLService } = strapi.plugin('graphql');\n const { config } = strapi.plugin('graphql');\n\n const { KINDS, GENERIC_MORPH_TYPENAME } = getGraphQLService('constants');\n const extensionService = getGraphQLService('extension');\n\n // Type Registry\n let registry: any;\n // Builders Instances\n let builders: any;\n // Cached set of built-in query fields (populated at bootstrap)\n let builtInQueryFields: Set<string> = new Set();\n\n const buildSchema = () => {\n const isShadowCRUDEnabled = !!config('shadowCRUD');\n\n // Create a new empty type registry\n registry = getGraphQLService('type-registry').new();\n\n // Reset the builders instances associated to the\n // content-api, and link the new type registry\n builders = getGraphQLService('builders').new('content-api', registry);\n\n registerScalars({ registry, strapi });\n registerInternals({ registry, strapi });\n\n if (isShadowCRUDEnabled) {\n shadowCRUD();\n }\n\n // Build a merged schema from both Nexus types & SDL type definitions\n const schema = buildMergedSchema({ registry });\n\n // Generate the extension configuration for the content API.\n // This extension instance needs to be generated after the Nexus schema's\n // generation, so that configurations created during types definitions\n // can be registered before being used in the wrap resolvers operation\n const extension = extensionService.generate({ typeRegistry: registry });\n\n // Add the extension's resolvers to the final schema\n const schemaWithResolvers = addResolversToSchema({\n schema,\n resolvers: extension.resolvers,\n });\n\n // Create a configuration object for the artifacts generation\n const outputs: Nexus.core.SchemaConfig['outputs'] = {\n schema: config('artifacts.schema', false),\n typegen: config('artifacts.typegen', false),\n };\n\n const currentEnv = strapi.config.get('environment');\n\n const nexusSchema = makeSchema({\n types: [],\n // Build the schema from the merged GraphQL schema.\n // Since we're passing the schema to the mergeSchema property, it'll transform our SDL type definitions\n // into Nexus type definition, thus allowing them to be handled by Nexus plugins & other processing\n mergeSchema: { schema: schemaWithResolvers },\n\n // Apply user-defined plugins\n // The extension keeps develop's published `PluginConfig[]` type for its plugins.\n plugins: extension.plugins as unknown as Nexus.core.NexusPlugin[],\n\n // Whether to generate artifacts (GraphQL schema, TS types definitions) or not.\n // By default, we generate artifacts only on development environment\n shouldGenerateArtifacts: config('generateArtifacts', currentEnv === 'development'),\n\n // Artifacts generation configuration\n outputs,\n });\n\n // Wrap resolvers if needed (auth, middlewares, policies...) as configured in the extension\n const wrappedNexusSchema = wrapResolvers({ schema: nexusSchema, strapi, extension });\n\n // Prune schema, remove unused types\n // eg: removes registered subscriptions if they're disabled in the config)\n const prunedNexusSchema = pruneSchema(wrappedNexusSchema);\n\n return prunedNexusSchema;\n };\n\n const getBuiltInQueryFields = () => builtInQueryFields;\n\n const isBuiltInQueryField = (fieldName: string) =>\n builtInQueryFields.has(fieldName) || fieldName.endsWith('_connection');\n\n const buildMergedSchema = ({ registry }: { registry: TypeRegistry }) => {\n // Capture the built-in (shadow CRUD) query fields from a schema built with only the\n // registry's own types, before any extension-registered types/typeDefs are merged in,\n // so isBuiltInQueryField can tell shadow CRUD fields apart from custom extension resolvers.\n const shadowCRUDSchema = makeSchema({ types: [registry.definitions] });\n const shadowCRUDQueryFields = shadowCRUDSchema.getQueryType()?.getFields() ?? {};\n builtInQueryFields = new Set(Object.keys(shadowCRUDQueryFields));\n\n // Here we extract types, plugins & typeDefs from a temporary generated\n // extension since there won't be any addition allowed after schemas generation\n const { types, typeDefs = [] } = extensionService.generate({ typeRegistry: registry });\n\n // Nexus schema built with user-defined & shadow CRUD auto generated Nexus types\n const nexusSchema = makeSchema({ types: [registry.definitions, types] });\n\n // Merge type definitions with the Nexus schema\n return mergeSchemas({\n typeDefs,\n // Give access to the shadowCRUD & nexus based types\n // Note: This is necessary so that types defined in SDL can reference types defined with Nexus\n schemas: [nexusSchema],\n });\n };\n\n const shadowCRUD = () => {\n const extensionService = getGraphQLService('extension');\n\n // Get every content type & component defined in Strapi\n const contentTypes = [\n ...Object.values(strapi.components),\n ...Object.values(strapi.contentTypes),\n ];\n\n // Disable Shadow CRUD for admin content types\n contentTypes\n .map((contentType) => contentType.uid)\n .filter((uid) => uid.startsWith('admin::'))\n .forEach((uid) => extensionService.shadowCRUD(uid).disable());\n\n const contentTypesWithShadowCRUD = contentTypes.filter((ct) =>\n extensionService.shadowCRUD(ct.uid).isEnabled()\n );\n\n // Generate and register definitions for every content type\n registerAPITypes(contentTypesWithShadowCRUD);\n\n // Generate and register polymorphic types' definitions\n registerMorphTypes(contentTypesWithShadowCRUD);\n };\n\n /**\n * Register needed GraphQL types for every content type\n * @param {object[]} contentTypes\n */\n const registerAPITypes = (contentTypes: Struct.Schema[]) => {\n for (const contentType of contentTypes) {\n const { modelType } = contentType;\n\n const registerOptions = { registry, strapi, builders };\n\n // Generate various types associated to the content type\n // (enums, dynamic-zones, filters, inputs...)\n registerEnumsDefinition(contentType, registerOptions);\n registerDynamicZonesDefinition(contentType, registerOptions);\n registerFiltersDefinition(contentType, registerOptions);\n registerInputsDefinition(contentType, registerOptions);\n\n // Generate & register component's definition\n if (modelType === 'component') {\n registerComponent(contentType, registerOptions);\n continue;\n }\n\n const { kind } = contentType;\n\n // Generate & register single type's definition\n if (kind === 'singleType') {\n registerSingleType(contentType, registerOptions);\n }\n\n // Generate & register collection type's definition\n else if (kind === 'collectionType') {\n registerCollectionType(contentType, registerOptions);\n }\n }\n };\n\n const registerMorphTypes = (contentTypes: Struct.Schema[]) => {\n // Create & register a union type that includes every type or component registered\n const genericMorphType = builders.buildGenericMorphDefinition();\n registry.register(GENERIC_MORPH_TYPENAME, genericMorphType, { kind: KINDS.morph });\n\n for (const contentType of contentTypes) {\n registerPolymorphicContentType(contentType, { registry, strapi });\n }\n };\n\n return { buildSchema, getBuiltInQueryFields, isBuiltInQueryField };\n};\n"],"names":["strapi","mergeSchemas","addResolversToSchema","require","service","getGraphQLService","plugin","config","KINDS","GENERIC_MORPH_TYPENAME","extensionService","registry","builders","builtInQueryFields","Set","buildSchema","isShadowCRUDEnabled","new","registerScalars","registerInternals","shadowCRUD","schema","buildMergedSchema","extension","generate","typeRegistry","schemaWithResolvers","resolvers","outputs","typegen","currentEnv","get","nexusSchema","makeSchema","types","mergeSchema","plugins","shouldGenerateArtifacts","wrappedNexusSchema","wrapResolvers","prunedNexusSchema","pruneSchema","getBuiltInQueryFields","isBuiltInQueryField","fieldName","has","endsWith","shadowCRUDSchema","definitions","shadowCRUDQueryFields","getQueryType","getFields","Object","keys","typeDefs","schemas","contentTypes","values","components","map","contentType","uid","filter","startsWith","forEach","disable","contentTypesWithShadowCRUD","ct","isEnabled","registerAPITypes","registerMorphTypes","modelType","registerOptions","registerEnumsDefinition","registerDynamicZonesDefinition","registerFiltersDefinition","registerInputsDefinition","registerComponent","kind","registerSingleType","registerCollectionType","genericMorphType","buildGenericMorphDefinition","register","morph","registerPolymorphicContentType"],"mappings":"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"}
|
|
@@ -1,12 +1,11 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var lodash = require('lodash');
|
|
4
4
|
var utils = require('@strapi/utils');
|
|
5
5
|
|
|
6
6
|
const { PolicyError } = utils.errors;
|
|
7
|
-
const getPoliciesConfig = fp.propOr([], 'policies');
|
|
8
7
|
const createPoliciesMiddleware = (resolverConfig, { strapi })=>{
|
|
9
|
-
const resolverPolicies =
|
|
8
|
+
const resolverPolicies = lodash.get(resolverConfig, 'policies', []);
|
|
10
9
|
const policies = strapi.get('policies').resolve(resolverPolicies, {});
|
|
11
10
|
return async (resolve, parent, args, context, info)=>{
|
|
12
11
|
// Create a graphql policy context
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"policy.js","sources":["../../../../server/src/services/content-api/policy.ts"],"sourcesContent":["import {
|
|
1
|
+
{"version":3,"file":"policy.js","sources":["../../../../server/src/services/content-api/policy.ts"],"sourcesContent":["import { get } from 'lodash';\nimport { GraphQLFieldResolver, GraphQLResolveInfo } from 'graphql';\nimport { policy as policyUtils, errors } from '@strapi/utils';\nimport type { Core } from '@strapi/types';\n\nconst { PolicyError } = errors;\n\nconst createPoliciesMiddleware = (resolverConfig: any, { strapi }: { strapi: Core.Strapi }) => {\n const resolverPolicies = get(resolverConfig, 'policies', []);\n const policies = strapi.get('policies').resolve(resolverPolicies, {});\n\n return async (\n resolve: GraphQLFieldResolver<any, any>,\n parent: any,\n args: any,\n context: any,\n info: GraphQLResolveInfo\n ) => {\n // Create a graphql policy context\n const policyContext = createGraphQLPolicyContext(parent, args, context, info);\n\n // Run policies & throw an error if one of them fails\n for (const { handler, config } of policies) {\n const result = await handler(policyContext, config, { strapi });\n\n if (![true, undefined].includes(result)) {\n throw new PolicyError();\n }\n }\n\n return resolve(parent, args, context, info);\n };\n};\n\nconst createGraphQLPolicyContext = (\n parent: any,\n args: any,\n context: any,\n info: GraphQLResolveInfo\n) => {\n const policyContext = {\n get parent() {\n return parent;\n },\n\n get args() {\n return args;\n },\n\n get context() {\n return context;\n },\n\n get info() {\n return info;\n },\n\n get state() {\n return this.context.state;\n },\n\n get http() {\n return this.context.koaContext;\n },\n };\n\n return policyUtils.createPolicyContext('graphql', policyContext);\n};\n\nexport { createPoliciesMiddleware };\n"],"names":["PolicyError","errors","createPoliciesMiddleware","resolverConfig","strapi","resolverPolicies","get","policies","resolve","parent","args","context","info","policyContext","createGraphQLPolicyContext","handler","config","result","undefined","includes","state","http","koaContext","policyUtils","createPolicyContext"],"mappings":";;;;;AAKA,MAAM,EAAEA,WAAW,EAAE,GAAGC,YAAAA;AAExB,MAAMC,wBAAAA,GAA2B,CAACC,cAAAA,EAAqB,EAAEC,MAAM,EAA2B,GAAA;AACxF,IAAA,MAAMC,gBAAAA,GAAmBC,UAAAA,CAAIH,cAAAA,EAAgB,UAAA,EAAY,EAAE,CAAA;IAC3D,MAAMI,QAAAA,GAAWH,OAAOE,GAAG,CAAC,YAAYE,OAAO,CAACH,kBAAkB,EAAC,CAAA;AAEnE,IAAA,OAAO,OACLG,OAAAA,EACAC,MAAAA,EACAC,IAAAA,EACAC,OAAAA,EACAC,IAAAA,GAAAA;;AAGA,QAAA,MAAMC,aAAAA,GAAgBC,0BAAAA,CAA2BL,MAAAA,EAAQC,IAAAA,EAAMC,OAAAA,EAASC,IAAAA,CAAAA;;AAGxE,QAAA,KAAK,MAAM,EAAEG,OAAO,EAAEC,MAAM,EAAE,IAAIT,QAAAA,CAAU;AAC1C,YAAA,MAAMU,MAAAA,GAAS,MAAMF,OAAAA,CAAQF,aAAAA,EAAeG,MAAAA,EAAQ;AAAEZ,gBAAAA;AAAO,aAAA,CAAA;AAE7D,YAAA,IAAI,CAAC;AAAC,gBAAA,IAAA;AAAMc,gBAAAA;aAAU,CAACC,QAAQ,CAACF,MAAAA,CAAAA,EAAS;AACvC,gBAAA,MAAM,IAAIjB,WAAAA,EAAAA;AACZ,YAAA;AACF,QAAA;QAEA,OAAOQ,OAAAA,CAAQC,MAAAA,EAAQC,IAAAA,EAAMC,OAAAA,EAASC,IAAAA,CAAAA;AACxC,IAAA,CAAA;AACF;AAEA,MAAME,0BAAAA,GAA6B,CACjCL,MAAAA,EACAC,IAAAA,EACAC,OAAAA,EACAC,IAAAA,GAAAA;AAEA,IAAA,MAAMC,aAAAA,GAAgB;AACpB,QAAA,IAAIJ,MAAAA,CAAAA,GAAS;YACX,OAAOA,MAAAA;AACT,QAAA,CAAA;AAEA,QAAA,IAAIC,IAAAA,CAAAA,GAAO;YACT,OAAOA,IAAAA;AACT,QAAA,CAAA;AAEA,QAAA,IAAIC,OAAAA,CAAAA,GAAU;YACZ,OAAOA,OAAAA;AACT,QAAA,CAAA;AAEA,QAAA,IAAIC,IAAAA,CAAAA,GAAO;YACT,OAAOA,IAAAA;AACT,QAAA,CAAA;AAEA,QAAA,IAAIQ,KAAAA,CAAAA,GAAQ;AACV,YAAA,OAAO,IAAI,CAACT,OAAO,CAACS,KAAK;AAC3B,QAAA,CAAA;AAEA,QAAA,IAAIC,IAAAA,CAAAA,GAAO;AACT,YAAA,OAAO,IAAI,CAACV,OAAO,CAACW,UAAU;AAChC,QAAA;AACF,KAAA;IAEA,OAAOC,YAAAA,CAAYC,mBAAmB,CAAC,SAAA,EAAWX,aAAAA,CAAAA;AACpD,CAAA;;;;"}
|
|
@@ -1,10 +1,9 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { get } from 'lodash';
|
|
2
2
|
import { errors, policy } from '@strapi/utils';
|
|
3
3
|
|
|
4
4
|
const { PolicyError } = errors;
|
|
5
|
-
const getPoliciesConfig = propOr([], 'policies');
|
|
6
5
|
const createPoliciesMiddleware = (resolverConfig, { strapi })=>{
|
|
7
|
-
const resolverPolicies =
|
|
6
|
+
const resolverPolicies = get(resolverConfig, 'policies', []);
|
|
8
7
|
const policies = strapi.get('policies').resolve(resolverPolicies, {});
|
|
9
8
|
return async (resolve, parent, args, context, info)=>{
|
|
10
9
|
// Create a graphql policy context
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"policy.mjs","sources":["../../../../server/src/services/content-api/policy.ts"],"sourcesContent":["import {
|
|
1
|
+
{"version":3,"file":"policy.mjs","sources":["../../../../server/src/services/content-api/policy.ts"],"sourcesContent":["import { get } from 'lodash';\nimport { GraphQLFieldResolver, GraphQLResolveInfo } from 'graphql';\nimport { policy as policyUtils, errors } from '@strapi/utils';\nimport type { Core } from '@strapi/types';\n\nconst { PolicyError } = errors;\n\nconst createPoliciesMiddleware = (resolverConfig: any, { strapi }: { strapi: Core.Strapi }) => {\n const resolverPolicies = get(resolverConfig, 'policies', []);\n const policies = strapi.get('policies').resolve(resolverPolicies, {});\n\n return async (\n resolve: GraphQLFieldResolver<any, any>,\n parent: any,\n args: any,\n context: any,\n info: GraphQLResolveInfo\n ) => {\n // Create a graphql policy context\n const policyContext = createGraphQLPolicyContext(parent, args, context, info);\n\n // Run policies & throw an error if one of them fails\n for (const { handler, config } of policies) {\n const result = await handler(policyContext, config, { strapi });\n\n if (![true, undefined].includes(result)) {\n throw new PolicyError();\n }\n }\n\n return resolve(parent, args, context, info);\n };\n};\n\nconst createGraphQLPolicyContext = (\n parent: any,\n args: any,\n context: any,\n info: GraphQLResolveInfo\n) => {\n const policyContext = {\n get parent() {\n return parent;\n },\n\n get args() {\n return args;\n },\n\n get context() {\n return context;\n },\n\n get info() {\n return info;\n },\n\n get state() {\n return this.context.state;\n },\n\n get http() {\n return this.context.koaContext;\n },\n };\n\n return policyUtils.createPolicyContext('graphql', policyContext);\n};\n\nexport { createPoliciesMiddleware };\n"],"names":["PolicyError","errors","createPoliciesMiddleware","resolverConfig","strapi","resolverPolicies","get","policies","resolve","parent","args","context","info","policyContext","createGraphQLPolicyContext","handler","config","result","undefined","includes","state","http","koaContext","policyUtils","createPolicyContext"],"mappings":";;;AAKA,MAAM,EAAEA,WAAW,EAAE,GAAGC,MAAAA;AAExB,MAAMC,wBAAAA,GAA2B,CAACC,cAAAA,EAAqB,EAAEC,MAAM,EAA2B,GAAA;AACxF,IAAA,MAAMC,gBAAAA,GAAmBC,GAAAA,CAAIH,cAAAA,EAAgB,UAAA,EAAY,EAAE,CAAA;IAC3D,MAAMI,QAAAA,GAAWH,OAAOE,GAAG,CAAC,YAAYE,OAAO,CAACH,kBAAkB,EAAC,CAAA;AAEnE,IAAA,OAAO,OACLG,OAAAA,EACAC,MAAAA,EACAC,IAAAA,EACAC,OAAAA,EACAC,IAAAA,GAAAA;;AAGA,QAAA,MAAMC,aAAAA,GAAgBC,0BAAAA,CAA2BL,MAAAA,EAAQC,IAAAA,EAAMC,OAAAA,EAASC,IAAAA,CAAAA;;AAGxE,QAAA,KAAK,MAAM,EAAEG,OAAO,EAAEC,MAAM,EAAE,IAAIT,QAAAA,CAAU;AAC1C,YAAA,MAAMU,MAAAA,GAAS,MAAMF,OAAAA,CAAQF,aAAAA,EAAeG,MAAAA,EAAQ;AAAEZ,gBAAAA;AAAO,aAAA,CAAA;AAE7D,YAAA,IAAI,CAAC;AAAC,gBAAA,IAAA;AAAMc,gBAAAA;aAAU,CAACC,QAAQ,CAACF,MAAAA,CAAAA,EAAS;AACvC,gBAAA,MAAM,IAAIjB,WAAAA,EAAAA;AACZ,YAAA;AACF,QAAA;QAEA,OAAOQ,OAAAA,CAAQC,MAAAA,EAAQC,IAAAA,EAAMC,OAAAA,EAASC,IAAAA,CAAAA;AACxC,IAAA,CAAA;AACF;AAEA,MAAME,0BAAAA,GAA6B,CACjCL,MAAAA,EACAC,IAAAA,EACAC,OAAAA,EACAC,IAAAA,GAAAA;AAEA,IAAA,MAAMC,aAAAA,GAAgB;AACpB,QAAA,IAAIJ,MAAAA,CAAAA,GAAS;YACX,OAAOA,MAAAA;AACT,QAAA,CAAA;AAEA,QAAA,IAAIC,IAAAA,CAAAA,GAAO;YACT,OAAOA,IAAAA;AACT,QAAA,CAAA;AAEA,QAAA,IAAIC,OAAAA,CAAAA,GAAU;YACZ,OAAOA,OAAAA;AACT,QAAA,CAAA;AAEA,QAAA,IAAIC,IAAAA,CAAAA,GAAO;YACT,OAAOA,IAAAA;AACT,QAAA,CAAA;AAEA,QAAA,IAAIQ,KAAAA,CAAAA,GAAQ;AACV,YAAA,OAAO,IAAI,CAACT,OAAO,CAACS,KAAK;AAC3B,QAAA,CAAA;AAEA,QAAA,IAAIC,IAAAA,CAAAA,GAAO;AACT,YAAA,OAAO,IAAI,CAACV,OAAO,CAACW,UAAU;AAChC,QAAA;AACF,KAAA;IAEA,OAAOC,MAAAA,CAAYC,mBAAmB,CAAC,SAAA,EAAWX,aAAAA,CAAAA;AACpD,CAAA;;;;"}
|
|
@@ -2,9 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
const registerInternals = ({ registry, strapi })=>{
|
|
4
4
|
const { buildInternalTypes } = strapi.plugin('graphql').service('internals');
|
|
5
|
-
const internalTypes = buildInternalTypes(
|
|
6
|
-
strapi
|
|
7
|
-
});
|
|
5
|
+
const internalTypes = buildInternalTypes();
|
|
8
6
|
for (const [kind, definitions] of Object.entries(internalTypes)){
|
|
9
7
|
registry.registerMany(Object.entries(definitions), {
|
|
10
8
|
kind
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"internals.js","sources":["../../../../../server/src/services/content-api/register-functions/internals.ts"],"sourcesContent":["import type { Context } from '../../types';\n\nconst registerInternals = ({ registry, strapi }: Context) => {\n const { buildInternalTypes } = strapi.plugin('graphql').service('internals');\n\n const internalTypes = buildInternalTypes(
|
|
1
|
+
{"version":3,"file":"internals.js","sources":["../../../../../server/src/services/content-api/register-functions/internals.ts"],"sourcesContent":["import type { Context } from '../../types';\n\nconst registerInternals = ({ registry, strapi }: Context) => {\n const { buildInternalTypes } = strapi.plugin('graphql').service('internals');\n\n const internalTypes = buildInternalTypes();\n\n for (const [kind, definitions] of Object.entries(internalTypes)) {\n registry.registerMany(Object.entries(definitions as any), { kind });\n }\n};\n\nexport { registerInternals };\n"],"names":["registerInternals","registry","strapi","buildInternalTypes","plugin","service","internalTypes","kind","definitions","Object","entries","registerMany"],"mappings":";;AAEA,MAAMA,oBAAoB,CAAC,EAAEC,QAAQ,EAAEC,MAAM,EAAW,GAAA;IACtD,MAAM,EAAEC,kBAAkB,EAAE,GAAGD,OAAOE,MAAM,CAAC,SAAA,CAAA,CAAWC,OAAO,CAAC,WAAA,CAAA;AAEhE,IAAA,MAAMC,aAAAA,GAAgBH,kBAAAA,EAAAA;IAEtB,KAAK,MAAM,CAACI,IAAAA,EAAMC,WAAAA,CAAY,IAAIC,MAAAA,CAAOC,OAAO,CAACJ,aAAAA,CAAAA,CAAgB;AAC/DL,QAAAA,QAAAA,CAASU,YAAY,CAACF,MAAAA,CAAOC,OAAO,CAACF,WAAAA,CAAAA,EAAqB;AAAED,YAAAA;AAAK,SAAA,CAAA;AACnE,IAAA;AACF;;;;"}
|
|
@@ -1,8 +1,6 @@
|
|
|
1
1
|
const registerInternals = ({ registry, strapi })=>{
|
|
2
2
|
const { buildInternalTypes } = strapi.plugin('graphql').service('internals');
|
|
3
|
-
const internalTypes = buildInternalTypes(
|
|
4
|
-
strapi
|
|
5
|
-
});
|
|
3
|
+
const internalTypes = buildInternalTypes();
|
|
6
4
|
for (const [kind, definitions] of Object.entries(internalTypes)){
|
|
7
5
|
registry.registerMany(Object.entries(definitions), {
|
|
8
6
|
kind
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"internals.mjs","sources":["../../../../../server/src/services/content-api/register-functions/internals.ts"],"sourcesContent":["import type { Context } from '../../types';\n\nconst registerInternals = ({ registry, strapi }: Context) => {\n const { buildInternalTypes } = strapi.plugin('graphql').service('internals');\n\n const internalTypes = buildInternalTypes(
|
|
1
|
+
{"version":3,"file":"internals.mjs","sources":["../../../../../server/src/services/content-api/register-functions/internals.ts"],"sourcesContent":["import type { Context } from '../../types';\n\nconst registerInternals = ({ registry, strapi }: Context) => {\n const { buildInternalTypes } = strapi.plugin('graphql').service('internals');\n\n const internalTypes = buildInternalTypes();\n\n for (const [kind, definitions] of Object.entries(internalTypes)) {\n registry.registerMany(Object.entries(definitions as any), { kind });\n }\n};\n\nexport { registerInternals };\n"],"names":["registerInternals","registry","strapi","buildInternalTypes","plugin","service","internalTypes","kind","definitions","Object","entries","registerMany"],"mappings":"AAEA,MAAMA,oBAAoB,CAAC,EAAEC,QAAQ,EAAEC,MAAM,EAAW,GAAA;IACtD,MAAM,EAAEC,kBAAkB,EAAE,GAAGD,OAAOE,MAAM,CAAC,SAAA,CAAA,CAAWC,OAAO,CAAC,WAAA,CAAA;AAEhE,IAAA,MAAMC,aAAAA,GAAgBH,kBAAAA,EAAAA;IAEtB,KAAK,MAAM,CAACI,IAAAA,EAAMC,WAAAA,CAAY,IAAIC,MAAAA,CAAOC,OAAO,CAACJ,aAAAA,CAAAA,CAAgB;AAC/DL,QAAAA,QAAAA,CAASU,YAAY,CAACF,MAAAA,CAAOC,OAAO,CAACF,WAAAA,CAAAA,EAAqB;AAAED,YAAAA;AAAK,SAAA,CAAA;AACnE,IAAA;AACF;;;;"}
|
|
@@ -1,29 +1,29 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var lodash = require('lodash');
|
|
4
4
|
var graphql = require('graphql');
|
|
5
5
|
var utils = require('@strapi/utils');
|
|
6
6
|
var policy = require('./policy.js');
|
|
7
7
|
|
|
8
8
|
const { ForbiddenError } = utils.errors;
|
|
9
|
-
const introspectionQueries = [
|
|
9
|
+
const introspectionQueries = new Set([
|
|
10
10
|
'__Schema',
|
|
11
11
|
'__Type',
|
|
12
12
|
'__Field',
|
|
13
13
|
'__InputValue',
|
|
14
14
|
'__EnumValue',
|
|
15
15
|
'__Directive'
|
|
16
|
-
];
|
|
16
|
+
]);
|
|
17
17
|
/**
|
|
18
18
|
* Get & parse middlewares definitions from the resolver's config
|
|
19
19
|
* @param {object} resolverConfig
|
|
20
20
|
* @param {object} strapi
|
|
21
21
|
* @return {function[]}
|
|
22
22
|
*/ const parseMiddlewares = (resolverConfig, strapi)=>{
|
|
23
|
-
const resolverMiddlewares =
|
|
23
|
+
const resolverMiddlewares = lodash.get(resolverConfig, 'middlewares', []);
|
|
24
24
|
// TODO: [v4] to factorize with compose endpoints (routes)
|
|
25
25
|
return resolverMiddlewares.map((middleware)=>{
|
|
26
|
-
if (
|
|
26
|
+
if (typeof middleware === 'function') {
|
|
27
27
|
return middleware;
|
|
28
28
|
}
|
|
29
29
|
if (typeof middleware === 'string') {
|
|
@@ -54,16 +54,16 @@ const introspectionQueries = [
|
|
|
54
54
|
const typeMap = schema.getTypeMap();
|
|
55
55
|
Object.entries(typeMap).forEach(([type, definition])=>{
|
|
56
56
|
const isGraphQLObjectType = definition instanceof graphql.GraphQLObjectType;
|
|
57
|
-
const isIgnoredType = introspectionQueries.
|
|
57
|
+
const isIgnoredType = introspectionQueries.has(type);
|
|
58
58
|
if (!isGraphQLObjectType || isIgnoredType) {
|
|
59
59
|
return;
|
|
60
60
|
}
|
|
61
61
|
const fields = definition.getFields();
|
|
62
62
|
const fieldsToProcess = Object.entries(fields).filter(([field])=>isValidFieldName(field));
|
|
63
63
|
for (const [fieldName, fieldDefinition] of fieldsToProcess){
|
|
64
|
-
const defaultResolver =
|
|
64
|
+
const defaultResolver = lodash.property(fieldName);
|
|
65
65
|
const path = `${type}.${fieldName}`;
|
|
66
|
-
const resolverConfig =
|
|
66
|
+
const resolverConfig = lodash.get(resolversConfig, path, {});
|
|
67
67
|
const { resolve: baseResolver = defaultResolver } = fieldDefinition;
|
|
68
68
|
// Parse & initialize the middlewares
|
|
69
69
|
const middlewares = parseMiddlewares(resolverConfig, strapi);
|
|
@@ -83,19 +83,19 @@ const introspectionQueries = [
|
|
|
83
83
|
* @param {object} context
|
|
84
84
|
* @return {Promise<void>}
|
|
85
85
|
*/ const authorize = async ({ context })=>{
|
|
86
|
-
const authConfig =
|
|
87
|
-
const authContext =
|
|
86
|
+
const authConfig = resolverConfig?.auth;
|
|
87
|
+
const authContext = lodash.get(context, 'state.auth');
|
|
88
88
|
const isValidType = [
|
|
89
89
|
'Mutation',
|
|
90
90
|
'Query',
|
|
91
91
|
'Subscription'
|
|
92
92
|
].includes(type);
|
|
93
|
-
const hasConfig =
|
|
93
|
+
const hasConfig = authConfig != null;
|
|
94
94
|
const isAuthDisabled = authConfig === false;
|
|
95
95
|
if ((isValidType || hasConfig) && !isAuthDisabled) {
|
|
96
96
|
try {
|
|
97
97
|
await strapi.auth.verify(authContext, authConfig);
|
|
98
|
-
} catch
|
|
98
|
+
} catch {
|
|
99
99
|
throw new ForbiddenError();
|
|
100
100
|
}
|
|
101
101
|
}
|
|
@@ -108,7 +108,7 @@ const introspectionQueries = [
|
|
|
108
108
|
context
|
|
109
109
|
});
|
|
110
110
|
// Execute middlewares (including the policy middleware which will always be included)
|
|
111
|
-
return
|
|
111
|
+
return boundMiddlewares[0](parent, args, context, info);
|
|
112
112
|
};
|
|
113
113
|
}
|
|
114
114
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wrap-resolvers.js","sources":["../../../../server/src/services/content-api/wrap-resolvers.ts"],"sourcesContent":["import { get,
|
|
1
|
+
{"version":3,"file":"wrap-resolvers.js","sources":["../../../../server/src/services/content-api/wrap-resolvers.ts"],"sourcesContent":["import { get, property } from 'lodash';\nimport {\n GraphQLObjectType,\n GraphQLResolveInfo,\n GraphQLSchema,\n GraphQLFieldResolver,\n} from 'graphql';\nimport { errors } from '@strapi/utils';\nimport type { Core } from '@strapi/types';\n\nimport { createPoliciesMiddleware } from './policy';\n\nconst { ForbiddenError } = errors;\n\nconst introspectionQueries = new Set([\n '__Schema',\n '__Type',\n '__Field',\n '__InputValue',\n '__EnumValue',\n '__Directive',\n]);\n\ntype GraphQLMiddleware = (\n resolve: GraphQLFieldResolver<any, any>,\n parents: unknown,\n args: unknown,\n context: unknown,\n info: GraphQLResolveInfo\n) => any;\n\n/**\n * Get & parse middlewares definitions from the resolver's config\n * @param {object} resolverConfig\n * @param {object} strapi\n * @return {function[]}\n */\nconst parseMiddlewares = (resolverConfig: any, strapi: Core.Strapi): GraphQLMiddleware[] => {\n const resolverMiddlewares = get(resolverConfig, 'middlewares', []);\n\n // TODO: [v4] to factorize with compose endpoints (routes)\n return resolverMiddlewares.map(\n (middleware: string | Core.MiddlewareHandler | { name: string; options: any }) => {\n if (typeof middleware === 'function') {\n return middleware;\n }\n\n if (typeof middleware === 'string') {\n return strapi.middleware(middleware) as Core.MiddlewareFactory;\n }\n\n if (typeof middleware === 'object') {\n const { name, options = {} } = middleware;\n\n return (strapi.middleware(name) as Core.MiddlewareFactory)(options, { strapi });\n }\n\n throw new Error(\n `Invalid middleware type, expected (function,string,object), received ${typeof middleware}`\n );\n }\n );\n};\n\n/**\n * Wrap the schema's resolvers if they've been\n * customized using the GraphQL extension service\n * @param {object} options\n * @param {GraphQLSchema} options.schema\n * @param {object} options.strapi\n * @param {object} options.extension\n * @return {GraphQLSchema}\n */\nconst wrapResolvers = ({\n schema,\n strapi,\n extension = {},\n}: {\n schema: GraphQLSchema;\n strapi: Core.Strapi;\n extension: any;\n}) => {\n // Get all the registered resolvers configuration\n const { resolversConfig = {} } = extension;\n\n // Fields filters\n const isValidFieldName = (field: string) => !field.startsWith('__');\n\n const typeMap = schema.getTypeMap();\n\n Object.entries(typeMap).forEach(([type, definition]) => {\n const isGraphQLObjectType = definition instanceof GraphQLObjectType;\n const isIgnoredType = introspectionQueries.has(type);\n\n if (!isGraphQLObjectType || isIgnoredType) {\n return;\n }\n\n const fields = definition.getFields();\n const fieldsToProcess = Object.entries(fields).filter(([field]) => isValidFieldName(field));\n\n for (const [fieldName, fieldDefinition] of fieldsToProcess) {\n const defaultResolver = property(fieldName);\n\n const path = `${type}.${fieldName}`;\n const resolverConfig = get(resolversConfig, path, {});\n\n const { resolve: baseResolver = defaultResolver } = fieldDefinition;\n\n // Parse & initialize the middlewares\n const middlewares = parseMiddlewares(resolverConfig, strapi);\n\n // Generate the policy middleware\n const policyMiddleware = createPoliciesMiddleware(resolverConfig, { strapi });\n\n // Add the policyMiddleware at the end of the middlewares collection\n middlewares.push(policyMiddleware);\n\n // Bind every middleware to the next one\n const boundMiddlewares = middlewares.map((middleware, index, collection) => {\n return (parents: unknown, args: unknown, context: unknown, info: GraphQLResolveInfo) =>\n middleware(\n // Make sure the last middleware in the list calls the baseResolver\n index >= collection.length - 1 ? baseResolver : boundMiddlewares[index + 1],\n parents,\n args,\n context,\n info\n );\n });\n\n /**\n * GraphQL authorization flow\n * @param {object} context\n * @return {Promise<void>}\n */\n const authorize = async ({ context }: any) => {\n const authConfig = resolverConfig?.auth;\n const authContext = get(context, 'state.auth');\n\n const isValidType = ['Mutation', 'Query', 'Subscription'].includes(type);\n const hasConfig = authConfig != null;\n\n const isAuthDisabled = authConfig === false;\n\n if ((isValidType || hasConfig) && !isAuthDisabled) {\n try {\n await strapi.auth.verify(authContext, authConfig);\n } catch {\n throw new ForbiddenError();\n }\n }\n };\n\n /**\n * Base resolver wrapper that handles authorization, middlewares & policies\n * @return {Promise<any>}\n */\n fieldDefinition.resolve = async (parent, args, context, info) => {\n await authorize({ context });\n\n // Execute middlewares (including the policy middleware which will always be included)\n return boundMiddlewares[0]!(parent, args, context, info);\n };\n }\n });\n\n return schema;\n};\n\nexport { wrapResolvers };\n"],"names":["ForbiddenError","errors","introspectionQueries","Set","parseMiddlewares","resolverConfig","strapi","resolverMiddlewares","get","map","middleware","name","options","Error","wrapResolvers","schema","extension","resolversConfig","isValidFieldName","field","startsWith","typeMap","getTypeMap","Object","entries","forEach","type","definition","isGraphQLObjectType","GraphQLObjectType","isIgnoredType","has","fields","getFields","fieldsToProcess","filter","fieldName","fieldDefinition","defaultResolver","property","path","resolve","baseResolver","middlewares","policyMiddleware","createPoliciesMiddleware","push","boundMiddlewares","index","collection","parents","args","context","info","length","authorize","authConfig","auth","authContext","isValidType","includes","hasConfig","isAuthDisabled","verify","parent"],"mappings":"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"}
|