@strapi/plugin-graphql 4.15.5-alpha.6 → 4.16.0
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/admin/src/index.d.ts +16 -0
- package/dist/admin/admin/src/pluginId.d.ts +1 -0
- package/dist/admin/index.js +31 -17
- package/dist/admin/index.js.map +1 -1
- package/dist/admin/index.mjs +31 -17
- package/dist/admin/index.mjs.map +1 -1
- package/dist/server/bootstrap.d.ts +5 -0
- package/dist/server/bootstrap.d.ts.map +1 -0
- package/dist/server/config/default-config.d.ts +9 -0
- package/dist/server/config/default-config.d.ts.map +1 -0
- package/dist/server/config/index.d.ts +10 -0
- package/dist/server/config/index.d.ts.map +1 -0
- package/dist/server/format-graphql-error.d.ts +4 -0
- package/dist/server/format-graphql-error.d.ts.map +1 -0
- package/dist/server/index.d.ts +301 -0
- package/dist/server/index.d.ts.map +1 -0
- package/dist/server/index.js +2970 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/index.mjs +2949 -0
- package/dist/server/index.mjs.map +1 -0
- package/dist/server/services/builders/dynamic-zones.d.ts +14 -0
- package/dist/server/services/builders/dynamic-zones.d.ts.map +1 -0
- package/dist/server/services/builders/entity-meta.d.ts +6 -0
- package/dist/server/services/builders/entity-meta.d.ts.map +1 -0
- package/dist/server/services/builders/entity.d.ts +12 -0
- package/dist/server/services/builders/entity.d.ts.map +1 -0
- package/dist/server/services/builders/enums.d.ts +8 -0
- package/dist/server/services/builders/enums.d.ts.map +1 -0
- package/dist/server/services/builders/filters/content-type.d.ts +8 -0
- package/dist/server/services/builders/filters/content-type.d.ts.map +1 -0
- package/dist/server/services/builders/filters/index.d.ts +6 -0
- package/dist/server/services/builders/filters/index.d.ts.map +1 -0
- package/dist/server/services/builders/filters/operators/and.d.ts +8 -0
- package/dist/server/services/builders/filters/operators/and.d.ts.map +1 -0
- package/dist/server/services/builders/filters/operators/between.d.ts +8 -0
- package/dist/server/services/builders/filters/operators/between.d.ts.map +1 -0
- package/dist/server/services/builders/filters/operators/contains.d.ts +8 -0
- package/dist/server/services/builders/filters/operators/contains.d.ts.map +1 -0
- package/dist/server/services/builders/filters/operators/containsi.d.ts +8 -0
- package/dist/server/services/builders/filters/operators/containsi.d.ts.map +1 -0
- package/dist/server/services/builders/filters/operators/ends-with.d.ts +8 -0
- package/dist/server/services/builders/filters/operators/ends-with.d.ts.map +1 -0
- package/dist/server/services/builders/filters/operators/eq.d.ts +11 -0
- package/dist/server/services/builders/filters/operators/eq.d.ts.map +1 -0
- package/dist/server/services/builders/filters/operators/eqi.d.ts +8 -0
- package/dist/server/services/builders/filters/operators/eqi.d.ts.map +1 -0
- package/dist/server/services/builders/filters/operators/gt.d.ts +8 -0
- package/dist/server/services/builders/filters/operators/gt.d.ts.map +1 -0
- package/dist/server/services/builders/filters/operators/gte.d.ts +8 -0
- package/dist/server/services/builders/filters/operators/gte.d.ts.map +1 -0
- package/dist/server/services/builders/filters/operators/in.d.ts +8 -0
- package/dist/server/services/builders/filters/operators/in.d.ts.map +1 -0
- package/dist/server/services/builders/filters/operators/index.d.ts +11 -0
- package/dist/server/services/builders/filters/operators/index.d.ts.map +1 -0
- package/dist/server/services/builders/filters/operators/lt.d.ts +8 -0
- package/dist/server/services/builders/filters/operators/lt.d.ts.map +1 -0
- package/dist/server/services/builders/filters/operators/lte.d.ts +8 -0
- package/dist/server/services/builders/filters/operators/lte.d.ts.map +1 -0
- package/dist/server/services/builders/filters/operators/ne.d.ts +8 -0
- package/dist/server/services/builders/filters/operators/ne.d.ts.map +1 -0
- package/dist/server/services/builders/filters/operators/nei.d.ts +8 -0
- package/dist/server/services/builders/filters/operators/nei.d.ts.map +1 -0
- package/dist/server/services/builders/filters/operators/not-contains.d.ts +8 -0
- package/dist/server/services/builders/filters/operators/not-contains.d.ts.map +1 -0
- package/dist/server/services/builders/filters/operators/not-containsi.d.ts +8 -0
- package/dist/server/services/builders/filters/operators/not-containsi.d.ts.map +1 -0
- package/dist/server/services/builders/filters/operators/not-in.d.ts +8 -0
- package/dist/server/services/builders/filters/operators/not-in.d.ts.map +1 -0
- package/dist/server/services/builders/filters/operators/not-null.d.ts +8 -0
- package/dist/server/services/builders/filters/operators/not-null.d.ts.map +1 -0
- package/dist/server/services/builders/filters/operators/not.d.ts +11 -0
- package/dist/server/services/builders/filters/operators/not.d.ts.map +1 -0
- package/dist/server/services/builders/filters/operators/null.d.ts +8 -0
- package/dist/server/services/builders/filters/operators/null.d.ts.map +1 -0
- package/dist/server/services/builders/filters/operators/or.d.ts +8 -0
- package/dist/server/services/builders/filters/operators/or.d.ts.map +1 -0
- package/dist/server/services/builders/filters/operators/starts-with.d.ts +8 -0
- package/dist/server/services/builders/filters/operators/starts-with.d.ts.map +1 -0
- package/dist/server/services/builders/generic-morph.d.ts +6 -0
- package/dist/server/services/builders/generic-morph.d.ts.map +1 -0
- package/dist/server/services/builders/index.d.ts +58 -0
- package/dist/server/services/builders/index.d.ts.map +1 -0
- package/dist/server/services/builders/input.d.ts +7 -0
- package/dist/server/services/builders/input.d.ts.map +1 -0
- package/dist/server/services/builders/mutations/collection-type.d.ts +8 -0
- package/dist/server/services/builders/mutations/collection-type.d.ts.map +1 -0
- package/dist/server/services/builders/mutations/index.d.ts +7 -0
- package/dist/server/services/builders/mutations/index.d.ts.map +1 -0
- package/dist/server/services/builders/mutations/single-type.d.ts +8 -0
- package/dist/server/services/builders/mutations/single-type.d.ts.map +1 -0
- package/dist/server/services/builders/queries/collection-type.d.ts +8 -0
- package/dist/server/services/builders/queries/collection-type.d.ts.map +1 -0
- package/dist/server/services/builders/queries/index.d.ts +7 -0
- package/dist/server/services/builders/queries/index.d.ts.map +1 -0
- package/dist/server/services/builders/queries/single-type.d.ts +8 -0
- package/dist/server/services/builders/queries/single-type.d.ts.map +1 -0
- package/dist/server/services/builders/relation-response-collection.d.ts +10 -0
- package/dist/server/services/builders/relation-response-collection.d.ts.map +1 -0
- package/dist/server/services/builders/resolvers/association.d.ts +10 -0
- package/dist/server/services/builders/resolvers/association.d.ts.map +1 -0
- package/dist/server/services/builders/resolvers/component.d.ts +10 -0
- package/dist/server/services/builders/resolvers/component.d.ts.map +1 -0
- package/dist/server/services/builders/resolvers/dynamic-zone.d.ts +10 -0
- package/dist/server/services/builders/resolvers/dynamic-zone.d.ts.map +1 -0
- package/dist/server/services/builders/resolvers/index.d.ts +30 -0
- package/dist/server/services/builders/resolvers/index.d.ts.map +1 -0
- package/dist/server/services/builders/resolvers/mutation.d.ts +13 -0
- package/dist/server/services/builders/resolvers/mutation.d.ts.map +1 -0
- package/dist/server/services/builders/resolvers/query.d.ts +12 -0
- package/dist/server/services/builders/resolvers/query.d.ts.map +1 -0
- package/dist/server/services/builders/response-collection.d.ts +12 -0
- package/dist/server/services/builders/response-collection.d.ts.map +1 -0
- package/dist/server/services/builders/response.d.ts +10 -0
- package/dist/server/services/builders/response.d.ts.map +1 -0
- package/dist/server/services/builders/type.d.ts +19 -0
- package/dist/server/services/builders/type.d.ts.map +1 -0
- package/dist/server/services/builders/utils.d.ts +52 -0
- package/dist/server/services/builders/utils.d.ts.map +1 -0
- package/dist/server/services/constants.d.ts +128 -0
- package/dist/server/services/constants.d.ts.map +1 -0
- package/dist/server/services/content-api/index.d.ts +8 -0
- package/dist/server/services/content-api/index.d.ts.map +1 -0
- package/dist/server/services/content-api/policy.d.ts +7 -0
- package/dist/server/services/content-api/policy.d.ts.map +1 -0
- package/dist/server/services/content-api/register-functions/collection-type.d.ts +9 -0
- package/dist/server/services/content-api/register-functions/collection-type.d.ts.map +1 -0
- package/dist/server/services/content-api/register-functions/component.d.ts +9 -0
- package/dist/server/services/content-api/register-functions/component.d.ts.map +1 -0
- package/dist/server/services/content-api/register-functions/content-type/dynamic-zones.d.ts +9 -0
- package/dist/server/services/content-api/register-functions/content-type/dynamic-zones.d.ts.map +1 -0
- package/dist/server/services/content-api/register-functions/content-type/enums.d.ts +9 -0
- package/dist/server/services/content-api/register-functions/content-type/enums.d.ts.map +1 -0
- package/dist/server/services/content-api/register-functions/content-type/filters.d.ts +9 -0
- package/dist/server/services/content-api/register-functions/content-type/filters.d.ts.map +1 -0
- package/dist/server/services/content-api/register-functions/content-type/index.d.ts +24 -0
- package/dist/server/services/content-api/register-functions/content-type/index.d.ts.map +1 -0
- package/dist/server/services/content-api/register-functions/content-type/inputs.d.ts +9 -0
- package/dist/server/services/content-api/register-functions/content-type/inputs.d.ts.map +1 -0
- package/dist/server/services/content-api/register-functions/index.d.ts +9 -0
- package/dist/server/services/content-api/register-functions/index.d.ts.map +1 -0
- package/dist/server/services/content-api/register-functions/internals.d.ts +4 -0
- package/dist/server/services/content-api/register-functions/internals.d.ts.map +1 -0
- package/dist/server/services/content-api/register-functions/polymorphic.d.ts +5 -0
- package/dist/server/services/content-api/register-functions/polymorphic.d.ts.map +1 -0
- package/dist/server/services/content-api/register-functions/scalars.d.ts +4 -0
- package/dist/server/services/content-api/register-functions/scalars.d.ts.map +1 -0
- package/dist/server/services/content-api/register-functions/single-type.d.ts +9 -0
- package/dist/server/services/content-api/register-functions/single-type.d.ts.map +1 -0
- package/dist/server/services/content-api/wrap-resolvers.d.ts +18 -0
- package/dist/server/services/content-api/wrap-resolvers.d.ts.map +1 -0
- package/dist/server/services/extension/extension.d.ts +63 -0
- package/dist/server/services/extension/extension.d.ts.map +1 -0
- package/dist/server/services/extension/index.d.ts +3 -0
- package/dist/server/services/extension/index.d.ts.map +1 -0
- package/dist/server/services/extension/shadow-crud-manager.d.ts +40 -0
- package/dist/server/services/extension/shadow-crud-manager.d.ts.map +1 -0
- package/dist/server/services/format/index.d.ts +20 -0
- package/dist/server/services/format/index.d.ts.map +1 -0
- package/dist/server/services/format/return-types.d.ts +22 -0
- package/dist/server/services/format/return-types.d.ts.map +1 -0
- package/dist/server/services/index.d.ts +287 -0
- package/dist/server/services/index.d.ts.map +1 -0
- package/dist/server/services/internals/args/index.d.ts +8 -0
- package/dist/server/services/internals/args/index.d.ts.map +1 -0
- package/dist/server/services/internals/args/pagination.d.ts +3 -0
- package/dist/server/services/internals/args/pagination.d.ts.map +1 -0
- package/dist/server/services/internals/args/publication-state.d.ts +4 -0
- package/dist/server/services/internals/args/publication-state.d.ts.map +1 -0
- package/dist/server/services/internals/args/sort.d.ts +3 -0
- package/dist/server/services/internals/args/sort.d.ts.map +1 -0
- package/dist/server/services/internals/helpers/get-enabled-scalars.d.ts +4 -0
- package/dist/server/services/internals/helpers/get-enabled-scalars.d.ts.map +1 -0
- package/dist/server/services/internals/helpers/index.d.ts +6 -0
- package/dist/server/services/internals/helpers/index.d.ts.map +1 -0
- package/dist/server/services/internals/index.d.ts +46 -0
- package/dist/server/services/internals/index.d.ts.map +1 -0
- package/dist/server/services/internals/scalars/date.d.ts +3 -0
- package/dist/server/services/internals/scalars/date.d.ts.map +1 -0
- package/dist/server/services/internals/scalars/index.d.ts +10 -0
- package/dist/server/services/internals/scalars/index.d.ts.map +1 -0
- package/dist/server/services/internals/scalars/time.d.ts +8 -0
- package/dist/server/services/internals/scalars/time.d.ts.map +1 -0
- package/dist/server/services/internals/types/error.d.ts +8 -0
- package/dist/server/services/internals/types/error.d.ts.map +1 -0
- package/dist/server/services/internals/types/filters.d.ts +6 -0
- package/dist/server/services/internals/types/filters.d.ts.map +1 -0
- package/dist/server/services/internals/types/index.d.ts +28 -0
- package/dist/server/services/internals/types/index.d.ts.map +1 -0
- package/dist/server/services/internals/types/pagination.d.ts +10 -0
- package/dist/server/services/internals/types/pagination.d.ts.map +1 -0
- package/dist/server/services/internals/types/publication-state.d.ts +10 -0
- package/dist/server/services/internals/types/publication-state.d.ts.map +1 -0
- package/dist/server/services/internals/types/response-collection-meta.d.ts +11 -0
- package/dist/server/services/internals/types/response-collection-meta.d.ts.map +1 -0
- package/dist/server/services/type-registry.d.ts +15 -0
- package/dist/server/services/type-registry.d.ts.map +1 -0
- package/dist/server/services/types.d.ts +7 -0
- package/dist/server/services/types.d.ts.map +1 -0
- package/dist/server/services/utils/attributes.d.ts +14 -0
- package/dist/server/services/utils/attributes.d.ts.map +1 -0
- package/dist/server/services/utils/index.d.ts +81 -0
- package/dist/server/services/utils/index.d.ts.map +1 -0
- package/dist/server/services/utils/mappers/entity-to-response-entity.d.ts +33 -0
- package/dist/server/services/utils/mappers/entity-to-response-entity.d.ts.map +1 -0
- package/dist/server/services/utils/mappers/graphql-filters-to-strapi-query.d.ts +13 -0
- package/dist/server/services/utils/mappers/graphql-filters-to-strapi-query.d.ts.map +1 -0
- package/dist/server/services/utils/mappers/graphql-scalar-to-operators.d.ts +6 -0
- package/dist/server/services/utils/mappers/graphql-scalar-to-operators.d.ts.map +1 -0
- package/dist/server/services/utils/mappers/index.d.ts +36 -0
- package/dist/server/services/utils/mappers/index.d.ts.map +1 -0
- package/dist/server/services/utils/mappers/strapi-scalar-to-graphql-scalar.d.ts +9 -0
- package/dist/server/services/utils/mappers/strapi-scalar-to-graphql-scalar.d.ts.map +1 -0
- package/dist/server/services/utils/naming.d.ts +37 -0
- package/dist/server/services/utils/naming.d.ts.map +1 -0
- package/package.json +28 -16
- package/strapi-server.js +1 -11
- package/.eslintignore +0 -1
- package/.eslintrc +0 -14
- package/admin/src/index.js +0 -38
- package/admin/src/pluginId.js +0 -5
- package/admin/src/translations/dk.json +0 -5
- package/admin/src/translations/en.json +0 -5
- package/admin/src/translations/es.json +0 -5
- package/admin/src/translations/fr.json +0 -5
- package/admin/src/translations/pl.json +0 -5
- package/admin/src/translations/ru.json +0 -5
- package/admin/src/translations/sv.json +0 -5
- package/admin/src/translations/tr.json +0 -5
- package/admin/src/translations/zh-Hans.json +0 -5
- package/admin/src/translations/zh.json +0 -5
- package/packup.config.ts +0 -42
- package/server/bootstrap.js +0 -134
- package/server/config/default-config.js +0 -13
- package/server/config/index.js +0 -7
- package/server/format-graphql-error.js +0 -45
- package/server/services/builders/dynamic-zones.js +0 -97
- package/server/services/builders/entity-meta.js +0 -7
- package/server/services/builders/entity.js +0 -43
- package/server/services/builders/enums.js +0 -26
- package/server/services/builders/filters/content-type.js +0 -111
- package/server/services/builders/filters/index.js +0 -7
- package/server/services/builders/filters/operators/and.js +0 -15
- package/server/services/builders/filters/operators/between.js +0 -15
- package/server/services/builders/filters/operators/contains.js +0 -13
- package/server/services/builders/filters/operators/containsi.js +0 -13
- package/server/services/builders/filters/operators/ends-with.js +0 -13
- package/server/services/builders/filters/operators/eq.js +0 -23
- package/server/services/builders/filters/operators/eqi.js +0 -13
- package/server/services/builders/filters/operators/gt.js +0 -13
- package/server/services/builders/filters/operators/gte.js +0 -13
- package/server/services/builders/filters/operators/in.js +0 -15
- package/server/services/builders/filters/operators/index.js +0 -40
- package/server/services/builders/filters/operators/lt.js +0 -13
- package/server/services/builders/filters/operators/lte.js +0 -13
- package/server/services/builders/filters/operators/ne.js +0 -13
- package/server/services/builders/filters/operators/nei.js +0 -13
- package/server/services/builders/filters/operators/not-contains.js +0 -13
- package/server/services/builders/filters/operators/not-containsi.js +0 -13
- package/server/services/builders/filters/operators/not-in.js +0 -15
- package/server/services/builders/filters/operators/not-null.js +0 -13
- package/server/services/builders/filters/operators/not.js +0 -19
- package/server/services/builders/filters/operators/null.js +0 -13
- package/server/services/builders/filters/operators/or.js +0 -15
- package/server/services/builders/filters/operators/starts-with.js +0 -13
- package/server/services/builders/generic-morph.js +0 -41
- package/server/services/builders/index.js +0 -92
- package/server/services/builders/input.js +0 -121
- package/server/services/builders/mutations/collection-type.js +0 -191
- package/server/services/builders/mutations/index.js +0 -9
- package/server/services/builders/mutations/single-type.js +0 -164
- package/server/services/builders/queries/collection-type.js +0 -122
- package/server/services/builders/queries/index.js +0 -9
- package/server/services/builders/queries/single-type.js +0 -71
- package/server/services/builders/relation-response-collection.js +0 -32
- package/server/services/builders/resolvers/association.js +0 -92
- package/server/services/builders/resolvers/component.js +0 -25
- package/server/services/builders/resolvers/dynamic-zone.js +0 -9
- package/server/services/builders/resolvers/index.js +0 -18
- package/server/services/builders/resolvers/mutation.js +0 -38
- package/server/services/builders/resolvers/query.js +0 -34
- package/server/services/builders/response-collection.js +0 -40
- package/server/services/builders/response.js +0 -32
- package/server/services/builders/type.js +0 -363
- package/server/services/builders/utils.js +0 -134
- package/server/services/constants.js +0 -153
- package/server/services/content-api/index.js +0 -188
- package/server/services/content-api/policy.js +0 -60
- package/server/services/content-api/register-functions/collection-type.js +0 -72
- package/server/services/content-api/register-functions/component.js +0 -15
- package/server/services/content-api/register-functions/content-type/dynamic-zones.js +0 -36
- package/server/services/content-api/register-functions/content-type/enums.js +0 -33
- package/server/services/content-api/register-functions/content-type/filters.js +0 -15
- package/server/services/content-api/register-functions/content-type/index.js +0 -13
- package/server/services/content-api/register-functions/content-type/inputs.js +0 -21
- package/server/services/content-api/register-functions/index.js +0 -22
- package/server/services/content-api/register-functions/internals.js +0 -13
- package/server/services/content-api/register-functions/polymorphic.js +0 -69
- package/server/services/content-api/register-functions/scalars.js +0 -14
- package/server/services/content-api/register-functions/single-type.js +0 -72
- package/server/services/content-api/wrap-resolvers.js +0 -148
- package/server/services/extension/extension.js +0 -94
- package/server/services/extension/index.js +0 -5
- package/server/services/extension/shadow-crud-manager.js +0 -161
- package/server/services/format/index.js +0 -7
- package/server/services/format/return-types.js +0 -27
- package/server/services/index.js +0 -21
- package/server/services/internals/args/index.js +0 -11
- package/server/services/internals/args/pagination.js +0 -19
- package/server/services/internals/args/publication-state.js +0 -12
- package/server/services/internals/args/sort.js +0 -10
- package/server/services/internals/helpers/get-enabled-scalars.js +0 -17
- package/server/services/internals/helpers/index.js +0 -7
- package/server/services/internals/index.js +0 -13
- package/server/services/internals/scalars/date.js +0 -22
- package/server/services/internals/scalars/index.js +0 -17
- package/server/services/internals/scalars/time.js +0 -36
- package/server/services/internals/types/error.js +0 -34
- package/server/services/internals/types/filters.js +0 -39
- package/server/services/internals/types/index.js +0 -29
- package/server/services/internals/types/pagination.js +0 -24
- package/server/services/internals/types/publication-state.js +0 -24
- package/server/services/internals/types/response-collection-meta.js +0 -46
- package/server/services/type-registry.js +0 -104
- package/server/services/utils/attributes.js +0 -78
- package/server/services/utils/index.js +0 -11
- package/server/services/utils/mappers/entity-to-response-entity.js +0 -12
- package/server/services/utils/mappers/graphql-filters-to-strapi-query.js +0 -119
- package/server/services/utils/mappers/graphql-scalar-to-operators.js +0 -17
- package/server/services/utils/mappers/index.js +0 -13
- package/server/services/utils/mappers/strapi-scalar-to-graphql-scalar.js +0 -25
- package/server/services/utils/naming.js +0 -287
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
const { sanitize, validate } = require('@strapi/utils');
|
|
4
|
-
|
|
5
|
-
module.exports = ({ strapi }) => ({
|
|
6
|
-
buildComponentResolver({ contentTypeUID, attributeName }) {
|
|
7
|
-
const { transformArgs } = strapi.plugin('graphql').service('builders').utils;
|
|
8
|
-
|
|
9
|
-
return async (parent, args = {}, ctx) => {
|
|
10
|
-
const contentType = strapi.getModel(contentTypeUID);
|
|
11
|
-
|
|
12
|
-
const { component: componentName } = contentType.attributes[attributeName];
|
|
13
|
-
const component = strapi.getModel(componentName);
|
|
14
|
-
|
|
15
|
-
const transformedArgs = transformArgs(args, { contentType: component, usePagination: true });
|
|
16
|
-
await validate.contentAPI.query(transformedArgs, component, {
|
|
17
|
-
auth: ctx?.state?.auth,
|
|
18
|
-
});
|
|
19
|
-
const sanitizedQuery = await sanitize.contentAPI.query(transformedArgs, component, {
|
|
20
|
-
auth: ctx?.state?.auth,
|
|
21
|
-
});
|
|
22
|
-
return strapi.entityService.load(contentTypeUID, parent, attributeName, sanitizedQuery);
|
|
23
|
-
};
|
|
24
|
-
},
|
|
25
|
-
});
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
const associationResolvers = require('./association');
|
|
4
|
-
const queriesResolvers = require('./query');
|
|
5
|
-
const mutationsResolvers = require('./mutation');
|
|
6
|
-
const componentResolvers = require('./component');
|
|
7
|
-
const dynamicZoneResolvers = require('./dynamic-zone');
|
|
8
|
-
|
|
9
|
-
module.exports = (context) => ({
|
|
10
|
-
// Generics
|
|
11
|
-
...associationResolvers(context),
|
|
12
|
-
|
|
13
|
-
// Builders
|
|
14
|
-
...mutationsResolvers(context),
|
|
15
|
-
...queriesResolvers(context),
|
|
16
|
-
...componentResolvers(context),
|
|
17
|
-
...dynamicZoneResolvers(context),
|
|
18
|
-
});
|
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
const { pick } = require('lodash/fp');
|
|
4
|
-
const { sanitize, validate } = require('@strapi/utils');
|
|
5
|
-
|
|
6
|
-
const pickCreateArgs = pick(['params', 'data', 'files']);
|
|
7
|
-
|
|
8
|
-
module.exports = ({ strapi }) => ({
|
|
9
|
-
buildMutationsResolvers({ contentType }) {
|
|
10
|
-
const { uid } = contentType;
|
|
11
|
-
|
|
12
|
-
return {
|
|
13
|
-
async create(parent, args) {
|
|
14
|
-
// todo[v4]: Might be interesting to generate dynamic yup schema to validate payloads with more complex checks (on top of graphql validation)
|
|
15
|
-
const params = pickCreateArgs(args);
|
|
16
|
-
|
|
17
|
-
// todo[v4]: Sanitize args to only keep params / data / files (or do it in the base resolver)
|
|
18
|
-
return strapi.entityService.create(uid, params);
|
|
19
|
-
},
|
|
20
|
-
|
|
21
|
-
async update(parent, args) {
|
|
22
|
-
const { id, data } = args;
|
|
23
|
-
return strapi.entityService.update(uid, id, { data });
|
|
24
|
-
},
|
|
25
|
-
|
|
26
|
-
async delete(parent, args, ctx) {
|
|
27
|
-
const { id, ...rest } = args;
|
|
28
|
-
await validate.contentAPI.query(rest, contentType, {
|
|
29
|
-
auth: ctx?.state?.auth,
|
|
30
|
-
});
|
|
31
|
-
const sanitizedQuery = await sanitize.contentAPI.query(rest, contentType, {
|
|
32
|
-
auth: ctx?.state?.auth,
|
|
33
|
-
});
|
|
34
|
-
return strapi.entityService.delete(uid, id, sanitizedQuery);
|
|
35
|
-
},
|
|
36
|
-
};
|
|
37
|
-
},
|
|
38
|
-
});
|
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
const { omit } = require('lodash/fp');
|
|
4
|
-
const { sanitize, validate } = require('@strapi/utils');
|
|
5
|
-
|
|
6
|
-
module.exports = ({ strapi }) => ({
|
|
7
|
-
buildQueriesResolvers({ contentType }) {
|
|
8
|
-
const { uid } = contentType;
|
|
9
|
-
|
|
10
|
-
return {
|
|
11
|
-
async find(parent, args, ctx) {
|
|
12
|
-
await validate.contentAPI.query(args, contentType, {
|
|
13
|
-
auth: ctx?.state?.auth,
|
|
14
|
-
});
|
|
15
|
-
const sanitizedQuery = await sanitize.contentAPI.query(args, contentType, {
|
|
16
|
-
auth: ctx?.state?.auth,
|
|
17
|
-
});
|
|
18
|
-
|
|
19
|
-
return strapi.entityService.findMany(uid, sanitizedQuery);
|
|
20
|
-
},
|
|
21
|
-
|
|
22
|
-
async findOne(parent, args, ctx) {
|
|
23
|
-
await validate.contentAPI.query(args, contentType, {
|
|
24
|
-
auth: ctx?.state?.auth,
|
|
25
|
-
});
|
|
26
|
-
const sanitizedQuery = await sanitize.contentAPI.query(args, contentType, {
|
|
27
|
-
auth: ctx?.state?.auth,
|
|
28
|
-
});
|
|
29
|
-
|
|
30
|
-
return strapi.entityService.findOne(uid, args.id, omit('id', sanitizedQuery));
|
|
31
|
-
},
|
|
32
|
-
};
|
|
33
|
-
},
|
|
34
|
-
});
|
|
@@ -1,40 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
const { objectType, nonNull } = require('nexus');
|
|
4
|
-
const { defaultTo, prop, pipe } = require('lodash/fp');
|
|
5
|
-
|
|
6
|
-
module.exports = ({ strapi }) => {
|
|
7
|
-
const { naming } = strapi.plugin('graphql').service('utils');
|
|
8
|
-
const { RESPONSE_COLLECTION_META_TYPE_NAME } = strapi.plugin('graphql').service('constants');
|
|
9
|
-
|
|
10
|
-
return {
|
|
11
|
-
/**
|
|
12
|
-
* Build a type definition for a content API collection response for a given content type
|
|
13
|
-
* @param {object} contentType The content type which will be used to build its content API response definition
|
|
14
|
-
* @return {NexusObjectTypeDef}
|
|
15
|
-
*/
|
|
16
|
-
buildResponseCollectionDefinition(contentType) {
|
|
17
|
-
const name = naming.getEntityResponseCollectionName(contentType);
|
|
18
|
-
const entityName = naming.getEntityName(contentType);
|
|
19
|
-
|
|
20
|
-
return objectType({
|
|
21
|
-
name,
|
|
22
|
-
|
|
23
|
-
definition(t) {
|
|
24
|
-
t.nonNull.list.field('data', {
|
|
25
|
-
type: nonNull(entityName),
|
|
26
|
-
|
|
27
|
-
resolve: pipe(prop('nodes'), defaultTo([])),
|
|
28
|
-
});
|
|
29
|
-
|
|
30
|
-
t.nonNull.field('meta', {
|
|
31
|
-
type: RESPONSE_COLLECTION_META_TYPE_NAME,
|
|
32
|
-
|
|
33
|
-
// Pass down the args stored in the source object
|
|
34
|
-
resolve: prop('info'),
|
|
35
|
-
});
|
|
36
|
-
},
|
|
37
|
-
});
|
|
38
|
-
},
|
|
39
|
-
};
|
|
40
|
-
};
|
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
const { objectType } = require('nexus');
|
|
4
|
-
const { prop } = require('lodash/fp');
|
|
5
|
-
|
|
6
|
-
module.exports = ({ strapi }) => {
|
|
7
|
-
const { naming } = strapi.plugin('graphql').service('utils');
|
|
8
|
-
|
|
9
|
-
return {
|
|
10
|
-
/**
|
|
11
|
-
* Build a type definition for a content API response for a given content type
|
|
12
|
-
* @param {object} contentType The content type which will be used to build its content API response definition
|
|
13
|
-
* @return {NexusObjectTypeDef}
|
|
14
|
-
*/
|
|
15
|
-
buildResponseDefinition(contentType) {
|
|
16
|
-
const name = naming.getEntityResponseName(contentType);
|
|
17
|
-
const entityName = naming.getEntityName(contentType);
|
|
18
|
-
|
|
19
|
-
return objectType({
|
|
20
|
-
name,
|
|
21
|
-
|
|
22
|
-
definition(t) {
|
|
23
|
-
t.field('data', {
|
|
24
|
-
type: entityName,
|
|
25
|
-
|
|
26
|
-
resolve: prop('value'),
|
|
27
|
-
});
|
|
28
|
-
},
|
|
29
|
-
});
|
|
30
|
-
},
|
|
31
|
-
};
|
|
32
|
-
};
|
|
@@ -1,363 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
const { isArray, isString, isUndefined, constant } = require('lodash/fp');
|
|
4
|
-
const { objectType } = require('nexus');
|
|
5
|
-
|
|
6
|
-
const { contentTypes } = require('@strapi/utils');
|
|
7
|
-
|
|
8
|
-
/**
|
|
9
|
-
* @typedef TypeBuildersOptions
|
|
10
|
-
*
|
|
11
|
-
* @property {ObjectDefinitionBlock} builder
|
|
12
|
-
* @property {string} attributeName
|
|
13
|
-
* @property {object} attribute
|
|
14
|
-
* @property {object} contentType
|
|
15
|
-
* @property {object} context
|
|
16
|
-
* @property {object} context.strapi
|
|
17
|
-
* @property {object} context.registry
|
|
18
|
-
*/
|
|
19
|
-
module.exports = (context) => {
|
|
20
|
-
const { strapi } = context;
|
|
21
|
-
|
|
22
|
-
const getGraphQLService = strapi.plugin('graphql').service;
|
|
23
|
-
|
|
24
|
-
const extension = getGraphQLService('extension');
|
|
25
|
-
|
|
26
|
-
/**
|
|
27
|
-
* Add a scalar attribute to the type definition
|
|
28
|
-
*
|
|
29
|
-
* The attribute is added based on a simple association between a Strapi
|
|
30
|
-
* type and a GraphQL type (the map is defined in `strapiTypeToGraphQLScalar`)
|
|
31
|
-
*
|
|
32
|
-
* @param {TypeBuildersOptions} options
|
|
33
|
-
*/
|
|
34
|
-
const addScalarAttribute = ({ builder, attributeName, attribute }) => {
|
|
35
|
-
const { mappers } = getGraphQLService('utils');
|
|
36
|
-
|
|
37
|
-
const gqlType = mappers.strapiScalarToGraphQLScalar(attribute.type);
|
|
38
|
-
|
|
39
|
-
builder.field(attributeName, { type: gqlType });
|
|
40
|
-
};
|
|
41
|
-
|
|
42
|
-
/**
|
|
43
|
-
* Add a component attribute to the type definition
|
|
44
|
-
*
|
|
45
|
-
* The attribute is added by fetching the component's type
|
|
46
|
-
* name and using it as the attribute's type
|
|
47
|
-
*
|
|
48
|
-
* @param {TypeBuildersOptions} options
|
|
49
|
-
*/
|
|
50
|
-
const addComponentAttribute = ({ builder, attributeName, contentType, attribute }) => {
|
|
51
|
-
let localBuilder = builder;
|
|
52
|
-
|
|
53
|
-
const { naming } = getGraphQLService('utils');
|
|
54
|
-
const { getContentTypeArgs } = getGraphQLService('builders').utils;
|
|
55
|
-
const { buildComponentResolver } = getGraphQLService('builders').get('content-api');
|
|
56
|
-
|
|
57
|
-
const type = naming.getComponentNameFromAttribute(attribute);
|
|
58
|
-
|
|
59
|
-
if (attribute.repeatable) {
|
|
60
|
-
localBuilder = localBuilder.list;
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
const targetComponent = strapi.getModel(attribute.component);
|
|
64
|
-
|
|
65
|
-
const resolve = buildComponentResolver({
|
|
66
|
-
contentTypeUID: contentType.uid,
|
|
67
|
-
attributeName,
|
|
68
|
-
strapi,
|
|
69
|
-
});
|
|
70
|
-
|
|
71
|
-
const args = getContentTypeArgs(targetComponent, { multiple: !!attribute.repeatable });
|
|
72
|
-
|
|
73
|
-
localBuilder.field(attributeName, { type, resolve, args });
|
|
74
|
-
};
|
|
75
|
-
|
|
76
|
-
/**
|
|
77
|
-
* Add a dynamic zone attribute to the type definition
|
|
78
|
-
*
|
|
79
|
-
* The attribute is added by fetching the dynamic zone's
|
|
80
|
-
* type name and using it as the attribute's type
|
|
81
|
-
*
|
|
82
|
-
* @param {TypeBuildersOptions} options
|
|
83
|
-
*/
|
|
84
|
-
const addDynamicZoneAttribute = ({ builder, attributeName, contentType }) => {
|
|
85
|
-
const { naming } = getGraphQLService('utils');
|
|
86
|
-
const { ERROR_CODES } = getGraphQLService('constants');
|
|
87
|
-
const { buildDynamicZoneResolver } = getGraphQLService('builders').get('content-api');
|
|
88
|
-
|
|
89
|
-
const { components } = contentType.attributes[attributeName];
|
|
90
|
-
|
|
91
|
-
const isEmpty = components.length === 0;
|
|
92
|
-
const type = naming.getDynamicZoneName(contentType, attributeName);
|
|
93
|
-
|
|
94
|
-
const resolve = isEmpty
|
|
95
|
-
? // If the dynamic zone don't have any component, then return an error payload
|
|
96
|
-
constant({
|
|
97
|
-
code: ERROR_CODES.emptyDynamicZone,
|
|
98
|
-
message: `This dynamic zone don't have any component attached to it`,
|
|
99
|
-
})
|
|
100
|
-
: // Else, return a classic dynamic-zone resolver
|
|
101
|
-
buildDynamicZoneResolver({
|
|
102
|
-
contentTypeUID: contentType.uid,
|
|
103
|
-
attributeName,
|
|
104
|
-
});
|
|
105
|
-
|
|
106
|
-
builder.list.field(attributeName, { type, resolve });
|
|
107
|
-
};
|
|
108
|
-
|
|
109
|
-
/**
|
|
110
|
-
* Add an enum attribute to the type definition
|
|
111
|
-
*
|
|
112
|
-
* The attribute is added by fetching the enum's type
|
|
113
|
-
* name and using it as the attribute's type
|
|
114
|
-
*
|
|
115
|
-
* @param {TypeBuildersOptions} options
|
|
116
|
-
*/
|
|
117
|
-
const addEnumAttribute = ({ builder, attributeName, contentType }) => {
|
|
118
|
-
const { naming } = getGraphQLService('utils');
|
|
119
|
-
|
|
120
|
-
const type = naming.getEnumName(contentType, attributeName);
|
|
121
|
-
|
|
122
|
-
builder.field(attributeName, { type });
|
|
123
|
-
};
|
|
124
|
-
|
|
125
|
-
/**
|
|
126
|
-
* Add a media attribute to the type definition
|
|
127
|
-
* @param {TypeBuildersOptions} options
|
|
128
|
-
*/
|
|
129
|
-
const addMediaAttribute = (options) => {
|
|
130
|
-
const { naming } = getGraphQLService('utils');
|
|
131
|
-
const { getContentTypeArgs } = getGraphQLService('builders').utils;
|
|
132
|
-
const { buildAssociationResolver } = getGraphQLService('builders').get('content-api');
|
|
133
|
-
const extension = getGraphQLService('extension');
|
|
134
|
-
|
|
135
|
-
const { builder } = options;
|
|
136
|
-
const { attributeName, attribute, contentType } = options;
|
|
137
|
-
const fileUID = 'plugin::upload.file';
|
|
138
|
-
|
|
139
|
-
if (extension.shadowCRUD(fileUID).isDisabled()) {
|
|
140
|
-
return;
|
|
141
|
-
}
|
|
142
|
-
|
|
143
|
-
const fileContentType = strapi.contentTypes[fileUID];
|
|
144
|
-
|
|
145
|
-
const resolve = buildAssociationResolver({
|
|
146
|
-
contentTypeUID: contentType.uid,
|
|
147
|
-
attributeName,
|
|
148
|
-
strapi,
|
|
149
|
-
});
|
|
150
|
-
|
|
151
|
-
const args = attribute.multiple ? getContentTypeArgs(fileContentType) : undefined;
|
|
152
|
-
const type = attribute.multiple
|
|
153
|
-
? naming.getRelationResponseCollectionName(fileContentType)
|
|
154
|
-
: naming.getEntityResponseName(fileContentType);
|
|
155
|
-
|
|
156
|
-
builder.field(attributeName, { type, resolve, args });
|
|
157
|
-
};
|
|
158
|
-
|
|
159
|
-
/**
|
|
160
|
-
* Add a polymorphic relational attribute to the type definition
|
|
161
|
-
* @param {TypeBuildersOptions} options
|
|
162
|
-
*/
|
|
163
|
-
const addPolymorphicRelationalAttribute = (options) => {
|
|
164
|
-
const { GENERIC_MORPH_TYPENAME } = getGraphQLService('constants');
|
|
165
|
-
const { naming } = getGraphQLService('utils');
|
|
166
|
-
const { buildAssociationResolver } = getGraphQLService('builders').get('content-api');
|
|
167
|
-
|
|
168
|
-
let { builder } = options;
|
|
169
|
-
const { attributeName, attribute, contentType } = options;
|
|
170
|
-
|
|
171
|
-
const { target } = attribute;
|
|
172
|
-
const isToManyRelation = attribute.relation.endsWith('Many');
|
|
173
|
-
|
|
174
|
-
if (isToManyRelation) {
|
|
175
|
-
builder = builder.list;
|
|
176
|
-
}
|
|
177
|
-
// todo[v4]: How to handle polymorphic relation w/ entity response collection types?
|
|
178
|
-
// -> Currently return raw polymorphic entities
|
|
179
|
-
|
|
180
|
-
const resolve = buildAssociationResolver({
|
|
181
|
-
contentTypeUID: contentType.uid,
|
|
182
|
-
attributeName,
|
|
183
|
-
strapi,
|
|
184
|
-
});
|
|
185
|
-
|
|
186
|
-
// If there is no specific target specified, then use the GenericMorph type
|
|
187
|
-
if (isUndefined(target)) {
|
|
188
|
-
builder.field(attributeName, {
|
|
189
|
-
type: GENERIC_MORPH_TYPENAME,
|
|
190
|
-
resolve,
|
|
191
|
-
});
|
|
192
|
-
}
|
|
193
|
-
|
|
194
|
-
// If the target is an array of string, resolve the associated morph type and use it
|
|
195
|
-
else if (isArray(target) && target.every(isString)) {
|
|
196
|
-
const type = naming.getMorphRelationTypeName(contentType, attributeName);
|
|
197
|
-
|
|
198
|
-
builder.field(attributeName, { type, resolve });
|
|
199
|
-
}
|
|
200
|
-
};
|
|
201
|
-
|
|
202
|
-
/**
|
|
203
|
-
* Add a regular relational attribute to the type definition
|
|
204
|
-
* @param {TypeBuildersOptions} options
|
|
205
|
-
*/
|
|
206
|
-
const addRegularRelationalAttribute = (options) => {
|
|
207
|
-
const { naming } = getGraphQLService('utils');
|
|
208
|
-
const { getContentTypeArgs } = getGraphQLService('builders').utils;
|
|
209
|
-
const { buildAssociationResolver } = getGraphQLService('builders').get('content-api');
|
|
210
|
-
const extension = getGraphQLService('extension');
|
|
211
|
-
|
|
212
|
-
const { builder } = options;
|
|
213
|
-
const { attributeName, attribute, contentType } = options;
|
|
214
|
-
|
|
215
|
-
if (extension.shadowCRUD(attribute.target).isDisabled()) {
|
|
216
|
-
return;
|
|
217
|
-
}
|
|
218
|
-
|
|
219
|
-
const isToManyRelation = attribute.relation.endsWith('Many');
|
|
220
|
-
|
|
221
|
-
const resolve = buildAssociationResolver({
|
|
222
|
-
contentTypeUID: contentType.uid,
|
|
223
|
-
attributeName,
|
|
224
|
-
strapi,
|
|
225
|
-
});
|
|
226
|
-
|
|
227
|
-
const targetContentType = strapi.getModel(attribute.target);
|
|
228
|
-
|
|
229
|
-
const type = isToManyRelation
|
|
230
|
-
? naming.getRelationResponseCollectionName(targetContentType)
|
|
231
|
-
: naming.getEntityResponseName(targetContentType);
|
|
232
|
-
|
|
233
|
-
const args = isToManyRelation ? getContentTypeArgs(targetContentType) : undefined;
|
|
234
|
-
|
|
235
|
-
const resolverPath = `${naming.getTypeName(contentType)}.${attributeName}`;
|
|
236
|
-
const resolverScope = `${targetContentType.uid}.find`;
|
|
237
|
-
|
|
238
|
-
extension.use({ resolversConfig: { [resolverPath]: { auth: { scope: [resolverScope] } } } });
|
|
239
|
-
|
|
240
|
-
builder.field(attributeName, { type, resolve, args });
|
|
241
|
-
};
|
|
242
|
-
|
|
243
|
-
const isNotPrivate = (contentType) => (attributeName) => {
|
|
244
|
-
return !contentTypes.isPrivateAttribute(contentType, attributeName);
|
|
245
|
-
};
|
|
246
|
-
|
|
247
|
-
const isNotDisabled = (contentType) => (attributeName) => {
|
|
248
|
-
return extension.shadowCRUD(contentType.uid).field(attributeName).hasOutputEnabled();
|
|
249
|
-
};
|
|
250
|
-
|
|
251
|
-
return {
|
|
252
|
-
/**
|
|
253
|
-
* Create a type definition for a given content type
|
|
254
|
-
* @param contentType - The content type used to created the definition
|
|
255
|
-
* @return {NexusObjectTypeDef}
|
|
256
|
-
*/
|
|
257
|
-
buildTypeDefinition(contentType) {
|
|
258
|
-
const utils = getGraphQLService('utils');
|
|
259
|
-
|
|
260
|
-
const { getComponentName, getTypeName } = utils.naming;
|
|
261
|
-
const {
|
|
262
|
-
isStrapiScalar,
|
|
263
|
-
isComponent,
|
|
264
|
-
isDynamicZone,
|
|
265
|
-
isEnumeration,
|
|
266
|
-
isMedia,
|
|
267
|
-
isMorphRelation,
|
|
268
|
-
isRelation,
|
|
269
|
-
} = utils.attributes;
|
|
270
|
-
|
|
271
|
-
const { attributes, modelType } = contentType;
|
|
272
|
-
|
|
273
|
-
const attributesKey = Object.keys(attributes);
|
|
274
|
-
|
|
275
|
-
const name = (modelType === 'component' ? getComponentName : getTypeName).call(
|
|
276
|
-
null,
|
|
277
|
-
contentType
|
|
278
|
-
);
|
|
279
|
-
|
|
280
|
-
return objectType({
|
|
281
|
-
name,
|
|
282
|
-
|
|
283
|
-
definition(t) {
|
|
284
|
-
if (modelType === 'component' && isNotDisabled(contentType)('id')) {
|
|
285
|
-
t.nonNull.id('id');
|
|
286
|
-
}
|
|
287
|
-
|
|
288
|
-
/** Attributes
|
|
289
|
-
*
|
|
290
|
-
* Attributes can be of 7 different kind:
|
|
291
|
-
* - Scalar
|
|
292
|
-
* - Component
|
|
293
|
-
* - Dynamic Zone
|
|
294
|
-
* - Enum
|
|
295
|
-
* - Media
|
|
296
|
-
* - Polymorphic Relations
|
|
297
|
-
* - Regular Relations
|
|
298
|
-
*
|
|
299
|
-
* Here, we iterate over each non-private attribute
|
|
300
|
-
* and add it to the type definition based on its type
|
|
301
|
-
*/
|
|
302
|
-
attributesKey
|
|
303
|
-
// Ignore private attributes
|
|
304
|
-
.filter(isNotPrivate(contentType))
|
|
305
|
-
// Ignore disabled fields (from extension service)
|
|
306
|
-
.filter(isNotDisabled(contentType))
|
|
307
|
-
// Add each attribute to the type definition
|
|
308
|
-
.forEach((attributeName) => {
|
|
309
|
-
const attribute = attributes[attributeName];
|
|
310
|
-
|
|
311
|
-
// We create a copy of the builder (t) to apply custom
|
|
312
|
-
// rules only on the current attribute (eg: nonNull, list, ...)
|
|
313
|
-
let builder = t;
|
|
314
|
-
|
|
315
|
-
if (attribute.required) {
|
|
316
|
-
builder = builder.nonNull;
|
|
317
|
-
}
|
|
318
|
-
|
|
319
|
-
/**
|
|
320
|
-
* @type {TypeBuildersOptions}
|
|
321
|
-
*/
|
|
322
|
-
const options = { builder, attributeName, attribute, contentType, context };
|
|
323
|
-
|
|
324
|
-
// Enums
|
|
325
|
-
if (isEnumeration(attribute)) {
|
|
326
|
-
addEnumAttribute(options);
|
|
327
|
-
}
|
|
328
|
-
|
|
329
|
-
// Scalars
|
|
330
|
-
else if (isStrapiScalar(attribute)) {
|
|
331
|
-
addScalarAttribute(options);
|
|
332
|
-
}
|
|
333
|
-
|
|
334
|
-
// Components
|
|
335
|
-
else if (isComponent(attribute)) {
|
|
336
|
-
addComponentAttribute(options);
|
|
337
|
-
}
|
|
338
|
-
|
|
339
|
-
// Dynamic Zones
|
|
340
|
-
else if (isDynamicZone(attribute)) {
|
|
341
|
-
addDynamicZoneAttribute(options);
|
|
342
|
-
}
|
|
343
|
-
|
|
344
|
-
// Media
|
|
345
|
-
else if (isMedia(attribute)) {
|
|
346
|
-
addMediaAttribute(options);
|
|
347
|
-
}
|
|
348
|
-
|
|
349
|
-
// Polymorphic Relations
|
|
350
|
-
else if (isMorphRelation(attribute)) {
|
|
351
|
-
addPolymorphicRelationalAttribute(options);
|
|
352
|
-
}
|
|
353
|
-
|
|
354
|
-
// Regular Relations
|
|
355
|
-
else if (isRelation(attribute)) {
|
|
356
|
-
addRegularRelationalAttribute(options);
|
|
357
|
-
}
|
|
358
|
-
});
|
|
359
|
-
},
|
|
360
|
-
});
|
|
361
|
-
},
|
|
362
|
-
};
|
|
363
|
-
};
|
|
@@ -1,134 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
const { entries, mapValues, omit } = require('lodash/fp');
|
|
4
|
-
const {
|
|
5
|
-
pagination: { withDefaultPagination },
|
|
6
|
-
contentTypes: { hasDraftAndPublish },
|
|
7
|
-
} = require('@strapi/utils');
|
|
8
|
-
|
|
9
|
-
module.exports = ({ strapi }) => {
|
|
10
|
-
const { service: getService } = strapi.plugin('graphql');
|
|
11
|
-
|
|
12
|
-
return {
|
|
13
|
-
/**
|
|
14
|
-
* Get every args for a given content type
|
|
15
|
-
* @param {object} contentType
|
|
16
|
-
* @param {object} options
|
|
17
|
-
* @param {boolean} options.multiple
|
|
18
|
-
* @return {object}
|
|
19
|
-
*/
|
|
20
|
-
getContentTypeArgs(contentType, { multiple = true } = {}) {
|
|
21
|
-
const { naming } = getService('utils');
|
|
22
|
-
const { args } = getService('internals');
|
|
23
|
-
|
|
24
|
-
const { kind, modelType } = contentType;
|
|
25
|
-
|
|
26
|
-
// Components
|
|
27
|
-
if (modelType === 'component') {
|
|
28
|
-
if (!multiple) return {};
|
|
29
|
-
|
|
30
|
-
return {
|
|
31
|
-
filters: naming.getFiltersInputTypeName(contentType),
|
|
32
|
-
pagination: args.PaginationArg,
|
|
33
|
-
sort: args.SortArg,
|
|
34
|
-
};
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
// Collection Types
|
|
38
|
-
if (kind === 'collectionType') {
|
|
39
|
-
if (!multiple) {
|
|
40
|
-
return { id: 'ID' };
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
const params = {
|
|
44
|
-
filters: naming.getFiltersInputTypeName(contentType),
|
|
45
|
-
pagination: args.PaginationArg,
|
|
46
|
-
sort: args.SortArg,
|
|
47
|
-
};
|
|
48
|
-
|
|
49
|
-
if (hasDraftAndPublish(contentType)) {
|
|
50
|
-
Object.assign(params, { publicationState: args.PublicationStateArg });
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
return params;
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
// Single Types
|
|
57
|
-
if (kind === 'singleType') {
|
|
58
|
-
const params = {};
|
|
59
|
-
|
|
60
|
-
if (hasDraftAndPublish(contentType)) {
|
|
61
|
-
Object.assign(params, { publicationState: args.PublicationStateArg });
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
return params;
|
|
65
|
-
}
|
|
66
|
-
},
|
|
67
|
-
|
|
68
|
-
/**
|
|
69
|
-
* Filter an object entries and keep only those whose value is a unique scalar attribute
|
|
70
|
-
* @param {object} attributes
|
|
71
|
-
* @return {Object<string, object>}
|
|
72
|
-
*/
|
|
73
|
-
getUniqueScalarAttributes(attributes) {
|
|
74
|
-
const { isStrapiScalar } = getService('utils').attributes;
|
|
75
|
-
|
|
76
|
-
const uniqueAttributes = entries(attributes).filter(
|
|
77
|
-
([, attribute]) => isStrapiScalar(attribute) && attribute.unique
|
|
78
|
-
);
|
|
79
|
-
|
|
80
|
-
return Object.fromEntries(uniqueAttributes);
|
|
81
|
-
},
|
|
82
|
-
|
|
83
|
-
/**
|
|
84
|
-
* Map each value from an attribute to a FiltersInput type name
|
|
85
|
-
* @param {object} attributes - The attributes object to transform
|
|
86
|
-
* @return {Object<string, string>}
|
|
87
|
-
*/
|
|
88
|
-
scalarAttributesToFiltersMap: mapValues((attribute) => {
|
|
89
|
-
const { mappers, naming } = getService('utils');
|
|
90
|
-
|
|
91
|
-
const gqlScalar = mappers.strapiScalarToGraphQLScalar(attribute.type);
|
|
92
|
-
|
|
93
|
-
return naming.getScalarFilterInputTypeName(gqlScalar);
|
|
94
|
-
}),
|
|
95
|
-
|
|
96
|
-
/**
|
|
97
|
-
* Apply basic transform to GQL args
|
|
98
|
-
*/
|
|
99
|
-
transformArgs(args, { contentType, usePagination = false } = {}) {
|
|
100
|
-
const { mappers } = getService('utils');
|
|
101
|
-
const { config } = strapi.plugin('graphql');
|
|
102
|
-
const { pagination = {}, filters = {} } = args;
|
|
103
|
-
|
|
104
|
-
// Init
|
|
105
|
-
const newArgs = omit(['pagination', 'filters'], args);
|
|
106
|
-
|
|
107
|
-
// Pagination
|
|
108
|
-
if (usePagination) {
|
|
109
|
-
const defaultLimit = config('defaultLimit');
|
|
110
|
-
const maxLimit = config('maxLimit');
|
|
111
|
-
|
|
112
|
-
Object.assign(
|
|
113
|
-
newArgs,
|
|
114
|
-
withDefaultPagination(pagination, {
|
|
115
|
-
maxLimit,
|
|
116
|
-
defaults: {
|
|
117
|
-
offset: { limit: defaultLimit },
|
|
118
|
-
page: { pageSize: defaultLimit },
|
|
119
|
-
},
|
|
120
|
-
})
|
|
121
|
-
);
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
// Filters
|
|
125
|
-
if (args.filters) {
|
|
126
|
-
Object.assign(newArgs, {
|
|
127
|
-
filters: mappers.graphQLFiltersToStrapiQuery(filters, contentType),
|
|
128
|
-
});
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
return newArgs;
|
|
132
|
-
},
|
|
133
|
-
};
|
|
134
|
-
};
|