@strapi/plugin-graphql 5.57.0 → 5.59.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.
@@ -31,8 +31,10 @@ function createFormattedError(formattedError, message, code, originalError) {
31
31
  * Intercepts specific Strapi error types to send custom error response codes in the GraphQL response
32
32
  */ function formatGraphqlError(formattedError, error) {
33
33
  const originalError = errors.unwrapResolverError(error);
34
- // If this error doesn't have an associated originalError, it
35
- if (lodash.isEmpty(originalError)) {
34
+ // Nothing to inspect, so keep Apollo's own formatted error. This must not be an emptiness check:
35
+ // an Error only has non-enumerable fields (message, stack), so lodash isEmpty reports it as
36
+ // empty and a bare Error from a resolver would reach the client with its message
37
+ if (originalError === null || originalError === undefined) {
36
38
  return formattedError;
37
39
  }
38
40
  const { message = '', name = 'UNKNOWN' } = originalError;
@@ -52,8 +54,32 @@ function createFormattedError(formattedError, message, code, originalError) {
52
54
  // else if originalError doesn't appear to be from Strapi or GraphQL..
53
55
  // Log the error
54
56
  strapi.log.error(originalError);
55
- // Create a generic 500 to send so we don't risk leaking any data
56
- return createFormattedError(new graphql.GraphQLError('Internal Server Error'), 'Internal Server Error', 'INTERNAL_SERVER_ERROR', originalError);
57
+ // Create a generic 500 to send so we don't risk leaking any data. The error that went to the log
58
+ // is not passed on: its name, message and details can hold SQL with bound values, hostnames and
59
+ // driver reasons. The extension carries the same error shape as the REST 500 body.
60
+ // path and locations stay: they name the field and the place in the query, and clients use them
61
+ // to attach the error. A fresh GraphQLError does not copy locations (the constructor only
62
+ // derives them from source positions), and spreading formattedError would also copy
63
+ // extensions.stacktrace in development.
64
+ const sanitized = createFormattedError({
65
+ message: 'Internal Server Error',
66
+ path: formattedError.path
67
+ }, 'Internal Server Error', 'INTERNAL_SERVER_ERROR', {
68
+ name: 'InternalServerError',
69
+ message: 'Internal Server Error'
70
+ });
71
+ // The GraphQLError type marks locations readonly. The constructor still creates a writable,
72
+ // enumerable field, and it will not copy locations off a formatted error, so set the field
73
+ // directly. Clients read it from toJSON().
74
+ if (formattedError.locations != null) {
75
+ Object.defineProperty(sanitized, 'locations', {
76
+ value: formattedError.locations,
77
+ enumerable: true,
78
+ writable: true,
79
+ configurable: true
80
+ });
81
+ }
82
+ return sanitized;
57
83
  }
58
84
 
59
85
  exports.formatGraphqlError = formatGraphqlError;
@@ -1 +1 @@
1
- {"version":3,"file":"format-graphql-error.js","sources":["../../server/src/format-graphql-error.ts"],"sourcesContent":["import { snakeCase, pick, isEmpty } from 'lodash';\nimport { errors } from '@strapi/utils';\nimport { unwrapResolverError } from '@apollo/server/errors';\nimport { GraphQLError, type GraphQLFormattedError } from 'graphql';\n\nconst { HttpError, ForbiddenError, UnauthorizedError, ApplicationError, ValidationError } = errors;\n\nconst formatToCode = (name: string) => `STRAPI_${snakeCase(name).toUpperCase()}`;\nconst formatErrorToExtension = (error: any) => ({\n error: pick(error, ['name', 'message', 'details']),\n});\n\nfunction createFormattedError(\n formattedError: GraphQLFormattedError,\n message: string,\n code: string,\n originalError: unknown\n) {\n const options = {\n ...formattedError,\n extensions: {\n ...formattedError.extensions,\n ...formatErrorToExtension(originalError),\n code,\n },\n };\n\n return new GraphQLError(message, options);\n}\n\n/**\n * The handler for Apollo Server v4's formatError config option\n *\n * Intercepts specific Strapi error types to send custom error response codes in the GraphQL response\n */\nexport function formatGraphqlError(formattedError: GraphQLFormattedError, error: unknown) {\n const originalError = unwrapResolverError(error);\n\n // If this error doesn't have an associated originalError, it\n if (isEmpty(originalError)) {\n return formattedError;\n }\n\n const { message = '', name = 'UNKNOWN' } = originalError as Error;\n\n if (originalError instanceof ForbiddenError || originalError instanceof UnauthorizedError) {\n return createFormattedError(formattedError, message, 'FORBIDDEN', originalError);\n }\n\n if (originalError instanceof ValidationError) {\n return createFormattedError(formattedError, message, 'BAD_USER_INPUT', originalError);\n }\n\n if (originalError instanceof ApplicationError || originalError instanceof HttpError) {\n const errorName = formatToCode(name);\n return createFormattedError(formattedError, message, errorName, originalError);\n }\n\n if (originalError instanceof GraphQLError) {\n return formattedError;\n }\n\n // else if originalError doesn't appear to be from Strapi or GraphQL..\n\n // Log the error\n strapi.log.error(originalError);\n\n // Create a generic 500 to send so we don't risk leaking any data\n return createFormattedError(\n new GraphQLError('Internal Server Error'),\n 'Internal Server Error',\n 'INTERNAL_SERVER_ERROR',\n originalError\n );\n}\n"],"names":["HttpError","ForbiddenError","UnauthorizedError","ApplicationError","ValidationError","errors","formatToCode","name","snakeCase","toUpperCase","formatErrorToExtension","error","pick","createFormattedError","formattedError","message","code","originalError","options","extensions","GraphQLError","formatGraphqlError","unwrapResolverError","isEmpty","errorName","strapi","log"],"mappings":";;;;;;;AAKA,MAAM,EAAEA,SAAS,EAAEC,cAAc,EAAEC,iBAAiB,EAAEC,gBAAgB,EAAEC,eAAe,EAAE,GAAGC,YAAAA;AAE5F,MAAMC,YAAAA,GAAe,CAACC,IAAAA,GAAiB,CAAC,OAAO,EAAEC,gBAAAA,CAAUD,IAAAA,CAAAA,CAAME,WAAW,EAAA,CAAA,CAAI;AAChF,MAAMC,sBAAAA,GAAyB,CAACC,KAAAA,IAAgB;AAC9CA,QAAAA,KAAAA,EAAOC,YAAKD,KAAAA,EAAO;AAAC,YAAA,MAAA;AAAQ,YAAA,SAAA;AAAW,YAAA;AAAU,SAAA;KACnD,CAAA;AAEA,SAASE,qBACPC,cAAqC,EACrCC,OAAe,EACfC,IAAY,EACZC,aAAsB,EAAA;AAEtB,IAAA,MAAMC,OAAAA,GAAU;AACd,QAAA,GAAGJ,cAAc;QACjBK,UAAAA,EAAY;AACV,YAAA,GAAGL,eAAeK,UAAU;AAC5B,YAAA,GAAGT,uBAAuBO,aAAAA,CAAc;AACxCD,YAAAA;AACF;AACF,KAAA;IAEA,OAAO,IAAII,qBAAaL,OAAAA,EAASG,OAAAA,CAAAA;AACnC;AAEA;;;;AAIC,IACM,SAASG,kBAAAA,CAAmBP,cAAqC,EAAEH,KAAc,EAAA;AACtF,IAAA,MAAMM,gBAAgBK,0BAAAA,CAAoBX,KAAAA,CAAAA;;AAG1C,IAAA,IAAIY,eAAQN,aAAAA,CAAAA,EAAgB;QAC1B,OAAOH,cAAAA;AACT,IAAA;AAEA,IAAA,MAAM,EAAEC,OAAAA,GAAU,EAAE,EAAER,IAAAA,GAAO,SAAS,EAAE,GAAGU,aAAAA;IAE3C,IAAIA,aAAAA,YAAyBhB,cAAAA,IAAkBgB,aAAAA,YAAyBf,iBAAAA,EAAmB;QACzF,OAAOW,oBAAAA,CAAqBC,cAAAA,EAAgBC,OAAAA,EAAS,WAAA,EAAaE,aAAAA,CAAAA;AACpE,IAAA;AAEA,IAAA,IAAIA,yBAAyBb,eAAAA,EAAiB;QAC5C,OAAOS,oBAAAA,CAAqBC,cAAAA,EAAgBC,OAAAA,EAAS,gBAAA,EAAkBE,aAAAA,CAAAA;AACzE,IAAA;IAEA,IAAIA,aAAAA,YAAyBd,gBAAAA,IAAoBc,aAAAA,YAAyBjB,SAAAA,EAAW;AACnF,QAAA,MAAMwB,YAAYlB,YAAAA,CAAaC,IAAAA,CAAAA;QAC/B,OAAOM,oBAAAA,CAAqBC,cAAAA,EAAgBC,OAAAA,EAASS,SAAAA,EAAWP,aAAAA,CAAAA;AAClE,IAAA;AAEA,IAAA,IAAIA,yBAAyBG,oBAAAA,EAAc;QACzC,OAAON,cAAAA;AACT,IAAA;;;IAKAW,MAAAA,CAAOC,GAAG,CAACf,KAAK,CAACM,aAAAA,CAAAA;;AAGjB,IAAA,OAAOJ,oBAAAA,CACL,IAAIO,oBAAAA,CAAa,uBAAA,CAAA,EACjB,yBACA,uBAAA,EACAH,aAAAA,CAAAA;AAEJ;;;;"}
1
+ {"version":3,"file":"format-graphql-error.js","sources":["../../server/src/format-graphql-error.ts"],"sourcesContent":["import { snakeCase, pick } from 'lodash';\nimport { errors } from '@strapi/utils';\nimport { unwrapResolverError } from '@apollo/server/errors';\nimport { GraphQLError, type GraphQLFormattedError } from 'graphql';\n\nconst { HttpError, ForbiddenError, UnauthorizedError, ApplicationError, ValidationError } = errors;\n\nconst formatToCode = (name: string) => `STRAPI_${snakeCase(name).toUpperCase()}`;\nconst formatErrorToExtension = (error: any) => ({\n error: pick(error, ['name', 'message', 'details']),\n});\n\nfunction createFormattedError(\n formattedError: GraphQLFormattedError,\n message: string,\n code: string,\n originalError: unknown\n) {\n const options = {\n ...formattedError,\n extensions: {\n ...formattedError.extensions,\n ...formatErrorToExtension(originalError),\n code,\n },\n };\n\n return new GraphQLError(message, options);\n}\n\n/**\n * The handler for Apollo Server v4's formatError config option\n *\n * Intercepts specific Strapi error types to send custom error response codes in the GraphQL response\n */\nexport function formatGraphqlError(formattedError: GraphQLFormattedError, error: unknown) {\n const originalError = unwrapResolverError(error);\n\n // Nothing to inspect, so keep Apollo's own formatted error. This must not be an emptiness check:\n // an Error only has non-enumerable fields (message, stack), so lodash isEmpty reports it as\n // empty and a bare Error from a resolver would reach the client with its message\n if (originalError === null || originalError === undefined) {\n return formattedError;\n }\n\n const { message = '', name = 'UNKNOWN' } = originalError as Error;\n\n if (originalError instanceof ForbiddenError || originalError instanceof UnauthorizedError) {\n return createFormattedError(formattedError, message, 'FORBIDDEN', originalError);\n }\n\n if (originalError instanceof ValidationError) {\n return createFormattedError(formattedError, message, 'BAD_USER_INPUT', originalError);\n }\n\n if (originalError instanceof ApplicationError || originalError instanceof HttpError) {\n const errorName = formatToCode(name);\n return createFormattedError(formattedError, message, errorName, originalError);\n }\n\n if (originalError instanceof GraphQLError) {\n return formattedError;\n }\n\n // else if originalError doesn't appear to be from Strapi or GraphQL..\n\n // Log the error\n strapi.log.error(originalError);\n\n // Create a generic 500 to send so we don't risk leaking any data. The error that went to the log\n // is not passed on: its name, message and details can hold SQL with bound values, hostnames and\n // driver reasons. The extension carries the same error shape as the REST 500 body.\n // path and locations stay: they name the field and the place in the query, and clients use them\n // to attach the error. A fresh GraphQLError does not copy locations (the constructor only\n // derives them from source positions), and spreading formattedError would also copy\n // extensions.stacktrace in development.\n const sanitized = createFormattedError(\n { message: 'Internal Server Error', path: formattedError.path },\n 'Internal Server Error',\n 'INTERNAL_SERVER_ERROR',\n { name: 'InternalServerError', message: 'Internal Server Error' }\n );\n // The GraphQLError type marks locations readonly. The constructor still creates a writable,\n // enumerable field, and it will not copy locations off a formatted error, so set the field\n // directly. Clients read it from toJSON().\n if (formattedError.locations != null) {\n Object.defineProperty(sanitized, 'locations', {\n value: formattedError.locations,\n enumerable: true,\n writable: true,\n configurable: true,\n });\n }\n return sanitized;\n}\n"],"names":["HttpError","ForbiddenError","UnauthorizedError","ApplicationError","ValidationError","errors","formatToCode","name","snakeCase","toUpperCase","formatErrorToExtension","error","pick","createFormattedError","formattedError","message","code","originalError","options","extensions","GraphQLError","formatGraphqlError","unwrapResolverError","undefined","errorName","strapi","log","sanitized","path","locations","Object","defineProperty","value","enumerable","writable","configurable"],"mappings":";;;;;;;AAKA,MAAM,EAAEA,SAAS,EAAEC,cAAc,EAAEC,iBAAiB,EAAEC,gBAAgB,EAAEC,eAAe,EAAE,GAAGC,YAAAA;AAE5F,MAAMC,YAAAA,GAAe,CAACC,IAAAA,GAAiB,CAAC,OAAO,EAAEC,gBAAAA,CAAUD,IAAAA,CAAAA,CAAME,WAAW,EAAA,CAAA,CAAI;AAChF,MAAMC,sBAAAA,GAAyB,CAACC,KAAAA,IAAgB;AAC9CA,QAAAA,KAAAA,EAAOC,YAAKD,KAAAA,EAAO;AAAC,YAAA,MAAA;AAAQ,YAAA,SAAA;AAAW,YAAA;AAAU,SAAA;KACnD,CAAA;AAEA,SAASE,qBACPC,cAAqC,EACrCC,OAAe,EACfC,IAAY,EACZC,aAAsB,EAAA;AAEtB,IAAA,MAAMC,OAAAA,GAAU;AACd,QAAA,GAAGJ,cAAc;QACjBK,UAAAA,EAAY;AACV,YAAA,GAAGL,eAAeK,UAAU;AAC5B,YAAA,GAAGT,uBAAuBO,aAAAA,CAAc;AACxCD,YAAAA;AACF;AACF,KAAA;IAEA,OAAO,IAAII,qBAAaL,OAAAA,EAASG,OAAAA,CAAAA;AACnC;AAEA;;;;AAIC,IACM,SAASG,kBAAAA,CAAmBP,cAAqC,EAAEH,KAAc,EAAA;AACtF,IAAA,MAAMM,gBAAgBK,0BAAAA,CAAoBX,KAAAA,CAAAA;;;;IAK1C,IAAIM,aAAAA,KAAkB,IAAA,IAAQA,aAAAA,KAAkBM,SAAAA,EAAW;QACzD,OAAOT,cAAAA;AACT,IAAA;AAEA,IAAA,MAAM,EAAEC,OAAAA,GAAU,EAAE,EAAER,IAAAA,GAAO,SAAS,EAAE,GAAGU,aAAAA;IAE3C,IAAIA,aAAAA,YAAyBhB,cAAAA,IAAkBgB,aAAAA,YAAyBf,iBAAAA,EAAmB;QACzF,OAAOW,oBAAAA,CAAqBC,cAAAA,EAAgBC,OAAAA,EAAS,WAAA,EAAaE,aAAAA,CAAAA;AACpE,IAAA;AAEA,IAAA,IAAIA,yBAAyBb,eAAAA,EAAiB;QAC5C,OAAOS,oBAAAA,CAAqBC,cAAAA,EAAgBC,OAAAA,EAAS,gBAAA,EAAkBE,aAAAA,CAAAA;AACzE,IAAA;IAEA,IAAIA,aAAAA,YAAyBd,gBAAAA,IAAoBc,aAAAA,YAAyBjB,SAAAA,EAAW;AACnF,QAAA,MAAMwB,YAAYlB,YAAAA,CAAaC,IAAAA,CAAAA;QAC/B,OAAOM,oBAAAA,CAAqBC,cAAAA,EAAgBC,OAAAA,EAASS,SAAAA,EAAWP,aAAAA,CAAAA;AAClE,IAAA;AAEA,IAAA,IAAIA,yBAAyBG,oBAAAA,EAAc;QACzC,OAAON,cAAAA;AACT,IAAA;;;IAKAW,MAAAA,CAAOC,GAAG,CAACf,KAAK,CAACM,aAAAA,CAAAA;;;;;;;;AASjB,IAAA,MAAMU,YAAYd,oBAAAA,CAChB;QAAEE,OAAAA,EAAS,uBAAA;AAAyBa,QAAAA,IAAAA,EAAMd,eAAec;AAAK,KAAA,EAC9D,yBACA,uBAAA,EACA;QAAErB,IAAAA,EAAM,qBAAA;QAAuBQ,OAAAA,EAAS;AAAwB,KAAA,CAAA;;;;IAKlE,IAAID,cAAAA,CAAee,SAAS,IAAI,IAAA,EAAM;QACpCC,MAAAA,CAAOC,cAAc,CAACJ,SAAAA,EAAW,WAAA,EAAa;AAC5CK,YAAAA,KAAAA,EAAOlB,eAAee,SAAS;YAC/BI,UAAAA,EAAY,IAAA;YACZC,QAAAA,EAAU,IAAA;YACVC,YAAAA,EAAc;AAChB,SAAA,CAAA;AACF,IAAA;IACA,OAAOR,SAAAA;AACT;;;;"}
@@ -1,4 +1,4 @@
1
- import { isEmpty, snakeCase, pick } from 'lodash';
1
+ import { snakeCase, pick } from 'lodash';
2
2
  import { errors } from '@strapi/utils';
3
3
  import { unwrapResolverError } from '@apollo/server/errors';
4
4
  import { GraphQLError } from 'graphql';
@@ -29,8 +29,10 @@ function createFormattedError(formattedError, message, code, originalError) {
29
29
  * Intercepts specific Strapi error types to send custom error response codes in the GraphQL response
30
30
  */ function formatGraphqlError(formattedError, error) {
31
31
  const originalError = unwrapResolverError(error);
32
- // If this error doesn't have an associated originalError, it
33
- if (isEmpty(originalError)) {
32
+ // Nothing to inspect, so keep Apollo's own formatted error. This must not be an emptiness check:
33
+ // an Error only has non-enumerable fields (message, stack), so lodash isEmpty reports it as
34
+ // empty and a bare Error from a resolver would reach the client with its message
35
+ if (originalError === null || originalError === undefined) {
34
36
  return formattedError;
35
37
  }
36
38
  const { message = '', name = 'UNKNOWN' } = originalError;
@@ -50,8 +52,32 @@ function createFormattedError(formattedError, message, code, originalError) {
50
52
  // else if originalError doesn't appear to be from Strapi or GraphQL..
51
53
  // Log the error
52
54
  strapi.log.error(originalError);
53
- // Create a generic 500 to send so we don't risk leaking any data
54
- return createFormattedError(new GraphQLError('Internal Server Error'), 'Internal Server Error', 'INTERNAL_SERVER_ERROR', originalError);
55
+ // Create a generic 500 to send so we don't risk leaking any data. The error that went to the log
56
+ // is not passed on: its name, message and details can hold SQL with bound values, hostnames and
57
+ // driver reasons. The extension carries the same error shape as the REST 500 body.
58
+ // path and locations stay: they name the field and the place in the query, and clients use them
59
+ // to attach the error. A fresh GraphQLError does not copy locations (the constructor only
60
+ // derives them from source positions), and spreading formattedError would also copy
61
+ // extensions.stacktrace in development.
62
+ const sanitized = createFormattedError({
63
+ message: 'Internal Server Error',
64
+ path: formattedError.path
65
+ }, 'Internal Server Error', 'INTERNAL_SERVER_ERROR', {
66
+ name: 'InternalServerError',
67
+ message: 'Internal Server Error'
68
+ });
69
+ // The GraphQLError type marks locations readonly. The constructor still creates a writable,
70
+ // enumerable field, and it will not copy locations off a formatted error, so set the field
71
+ // directly. Clients read it from toJSON().
72
+ if (formattedError.locations != null) {
73
+ Object.defineProperty(sanitized, 'locations', {
74
+ value: formattedError.locations,
75
+ enumerable: true,
76
+ writable: true,
77
+ configurable: true
78
+ });
79
+ }
80
+ return sanitized;
55
81
  }
56
82
 
57
83
  export { formatGraphqlError };
@@ -1 +1 @@
1
- {"version":3,"file":"format-graphql-error.mjs","sources":["../../server/src/format-graphql-error.ts"],"sourcesContent":["import { snakeCase, pick, isEmpty } from 'lodash';\nimport { errors } from '@strapi/utils';\nimport { unwrapResolverError } from '@apollo/server/errors';\nimport { GraphQLError, type GraphQLFormattedError } from 'graphql';\n\nconst { HttpError, ForbiddenError, UnauthorizedError, ApplicationError, ValidationError } = errors;\n\nconst formatToCode = (name: string) => `STRAPI_${snakeCase(name).toUpperCase()}`;\nconst formatErrorToExtension = (error: any) => ({\n error: pick(error, ['name', 'message', 'details']),\n});\n\nfunction createFormattedError(\n formattedError: GraphQLFormattedError,\n message: string,\n code: string,\n originalError: unknown\n) {\n const options = {\n ...formattedError,\n extensions: {\n ...formattedError.extensions,\n ...formatErrorToExtension(originalError),\n code,\n },\n };\n\n return new GraphQLError(message, options);\n}\n\n/**\n * The handler for Apollo Server v4's formatError config option\n *\n * Intercepts specific Strapi error types to send custom error response codes in the GraphQL response\n */\nexport function formatGraphqlError(formattedError: GraphQLFormattedError, error: unknown) {\n const originalError = unwrapResolverError(error);\n\n // If this error doesn't have an associated originalError, it\n if (isEmpty(originalError)) {\n return formattedError;\n }\n\n const { message = '', name = 'UNKNOWN' } = originalError as Error;\n\n if (originalError instanceof ForbiddenError || originalError instanceof UnauthorizedError) {\n return createFormattedError(formattedError, message, 'FORBIDDEN', originalError);\n }\n\n if (originalError instanceof ValidationError) {\n return createFormattedError(formattedError, message, 'BAD_USER_INPUT', originalError);\n }\n\n if (originalError instanceof ApplicationError || originalError instanceof HttpError) {\n const errorName = formatToCode(name);\n return createFormattedError(formattedError, message, errorName, originalError);\n }\n\n if (originalError instanceof GraphQLError) {\n return formattedError;\n }\n\n // else if originalError doesn't appear to be from Strapi or GraphQL..\n\n // Log the error\n strapi.log.error(originalError);\n\n // Create a generic 500 to send so we don't risk leaking any data\n return createFormattedError(\n new GraphQLError('Internal Server Error'),\n 'Internal Server Error',\n 'INTERNAL_SERVER_ERROR',\n originalError\n );\n}\n"],"names":["HttpError","ForbiddenError","UnauthorizedError","ApplicationError","ValidationError","errors","formatToCode","name","snakeCase","toUpperCase","formatErrorToExtension","error","pick","createFormattedError","formattedError","message","code","originalError","options","extensions","GraphQLError","formatGraphqlError","unwrapResolverError","isEmpty","errorName","strapi","log"],"mappings":";;;;;AAKA,MAAM,EAAEA,SAAS,EAAEC,cAAc,EAAEC,iBAAiB,EAAEC,gBAAgB,EAAEC,eAAe,EAAE,GAAGC,MAAAA;AAE5F,MAAMC,YAAAA,GAAe,CAACC,IAAAA,GAAiB,CAAC,OAAO,EAAEC,SAAAA,CAAUD,IAAAA,CAAAA,CAAME,WAAW,EAAA,CAAA,CAAI;AAChF,MAAMC,sBAAAA,GAAyB,CAACC,KAAAA,IAAgB;AAC9CA,QAAAA,KAAAA,EAAOC,KAAKD,KAAAA,EAAO;AAAC,YAAA,MAAA;AAAQ,YAAA,SAAA;AAAW,YAAA;AAAU,SAAA;KACnD,CAAA;AAEA,SAASE,qBACPC,cAAqC,EACrCC,OAAe,EACfC,IAAY,EACZC,aAAsB,EAAA;AAEtB,IAAA,MAAMC,OAAAA,GAAU;AACd,QAAA,GAAGJ,cAAc;QACjBK,UAAAA,EAAY;AACV,YAAA,GAAGL,eAAeK,UAAU;AAC5B,YAAA,GAAGT,uBAAuBO,aAAAA,CAAc;AACxCD,YAAAA;AACF;AACF,KAAA;IAEA,OAAO,IAAII,aAAaL,OAAAA,EAASG,OAAAA,CAAAA;AACnC;AAEA;;;;AAIC,IACM,SAASG,kBAAAA,CAAmBP,cAAqC,EAAEH,KAAc,EAAA;AACtF,IAAA,MAAMM,gBAAgBK,mBAAAA,CAAoBX,KAAAA,CAAAA;;AAG1C,IAAA,IAAIY,QAAQN,aAAAA,CAAAA,EAAgB;QAC1B,OAAOH,cAAAA;AACT,IAAA;AAEA,IAAA,MAAM,EAAEC,OAAAA,GAAU,EAAE,EAAER,IAAAA,GAAO,SAAS,EAAE,GAAGU,aAAAA;IAE3C,IAAIA,aAAAA,YAAyBhB,cAAAA,IAAkBgB,aAAAA,YAAyBf,iBAAAA,EAAmB;QACzF,OAAOW,oBAAAA,CAAqBC,cAAAA,EAAgBC,OAAAA,EAAS,WAAA,EAAaE,aAAAA,CAAAA;AACpE,IAAA;AAEA,IAAA,IAAIA,yBAAyBb,eAAAA,EAAiB;QAC5C,OAAOS,oBAAAA,CAAqBC,cAAAA,EAAgBC,OAAAA,EAAS,gBAAA,EAAkBE,aAAAA,CAAAA;AACzE,IAAA;IAEA,IAAIA,aAAAA,YAAyBd,gBAAAA,IAAoBc,aAAAA,YAAyBjB,SAAAA,EAAW;AACnF,QAAA,MAAMwB,YAAYlB,YAAAA,CAAaC,IAAAA,CAAAA;QAC/B,OAAOM,oBAAAA,CAAqBC,cAAAA,EAAgBC,OAAAA,EAASS,SAAAA,EAAWP,aAAAA,CAAAA;AAClE,IAAA;AAEA,IAAA,IAAIA,yBAAyBG,YAAAA,EAAc;QACzC,OAAON,cAAAA;AACT,IAAA;;;IAKAW,MAAAA,CAAOC,GAAG,CAACf,KAAK,CAACM,aAAAA,CAAAA;;AAGjB,IAAA,OAAOJ,oBAAAA,CACL,IAAIO,YAAAA,CAAa,uBAAA,CAAA,EACjB,yBACA,uBAAA,EACAH,aAAAA,CAAAA;AAEJ;;;;"}
1
+ {"version":3,"file":"format-graphql-error.mjs","sources":["../../server/src/format-graphql-error.ts"],"sourcesContent":["import { snakeCase, pick } from 'lodash';\nimport { errors } from '@strapi/utils';\nimport { unwrapResolverError } from '@apollo/server/errors';\nimport { GraphQLError, type GraphQLFormattedError } from 'graphql';\n\nconst { HttpError, ForbiddenError, UnauthorizedError, ApplicationError, ValidationError } = errors;\n\nconst formatToCode = (name: string) => `STRAPI_${snakeCase(name).toUpperCase()}`;\nconst formatErrorToExtension = (error: any) => ({\n error: pick(error, ['name', 'message', 'details']),\n});\n\nfunction createFormattedError(\n formattedError: GraphQLFormattedError,\n message: string,\n code: string,\n originalError: unknown\n) {\n const options = {\n ...formattedError,\n extensions: {\n ...formattedError.extensions,\n ...formatErrorToExtension(originalError),\n code,\n },\n };\n\n return new GraphQLError(message, options);\n}\n\n/**\n * The handler for Apollo Server v4's formatError config option\n *\n * Intercepts specific Strapi error types to send custom error response codes in the GraphQL response\n */\nexport function formatGraphqlError(formattedError: GraphQLFormattedError, error: unknown) {\n const originalError = unwrapResolverError(error);\n\n // Nothing to inspect, so keep Apollo's own formatted error. This must not be an emptiness check:\n // an Error only has non-enumerable fields (message, stack), so lodash isEmpty reports it as\n // empty and a bare Error from a resolver would reach the client with its message\n if (originalError === null || originalError === undefined) {\n return formattedError;\n }\n\n const { message = '', name = 'UNKNOWN' } = originalError as Error;\n\n if (originalError instanceof ForbiddenError || originalError instanceof UnauthorizedError) {\n return createFormattedError(formattedError, message, 'FORBIDDEN', originalError);\n }\n\n if (originalError instanceof ValidationError) {\n return createFormattedError(formattedError, message, 'BAD_USER_INPUT', originalError);\n }\n\n if (originalError instanceof ApplicationError || originalError instanceof HttpError) {\n const errorName = formatToCode(name);\n return createFormattedError(formattedError, message, errorName, originalError);\n }\n\n if (originalError instanceof GraphQLError) {\n return formattedError;\n }\n\n // else if originalError doesn't appear to be from Strapi or GraphQL..\n\n // Log the error\n strapi.log.error(originalError);\n\n // Create a generic 500 to send so we don't risk leaking any data. The error that went to the log\n // is not passed on: its name, message and details can hold SQL with bound values, hostnames and\n // driver reasons. The extension carries the same error shape as the REST 500 body.\n // path and locations stay: they name the field and the place in the query, and clients use them\n // to attach the error. A fresh GraphQLError does not copy locations (the constructor only\n // derives them from source positions), and spreading formattedError would also copy\n // extensions.stacktrace in development.\n const sanitized = createFormattedError(\n { message: 'Internal Server Error', path: formattedError.path },\n 'Internal Server Error',\n 'INTERNAL_SERVER_ERROR',\n { name: 'InternalServerError', message: 'Internal Server Error' }\n );\n // The GraphQLError type marks locations readonly. The constructor still creates a writable,\n // enumerable field, and it will not copy locations off a formatted error, so set the field\n // directly. Clients read it from toJSON().\n if (formattedError.locations != null) {\n Object.defineProperty(sanitized, 'locations', {\n value: formattedError.locations,\n enumerable: true,\n writable: true,\n configurable: true,\n });\n }\n return sanitized;\n}\n"],"names":["HttpError","ForbiddenError","UnauthorizedError","ApplicationError","ValidationError","errors","formatToCode","name","snakeCase","toUpperCase","formatErrorToExtension","error","pick","createFormattedError","formattedError","message","code","originalError","options","extensions","GraphQLError","formatGraphqlError","unwrapResolverError","undefined","errorName","strapi","log","sanitized","path","locations","Object","defineProperty","value","enumerable","writable","configurable"],"mappings":";;;;;AAKA,MAAM,EAAEA,SAAS,EAAEC,cAAc,EAAEC,iBAAiB,EAAEC,gBAAgB,EAAEC,eAAe,EAAE,GAAGC,MAAAA;AAE5F,MAAMC,YAAAA,GAAe,CAACC,IAAAA,GAAiB,CAAC,OAAO,EAAEC,SAAAA,CAAUD,IAAAA,CAAAA,CAAME,WAAW,EAAA,CAAA,CAAI;AAChF,MAAMC,sBAAAA,GAAyB,CAACC,KAAAA,IAAgB;AAC9CA,QAAAA,KAAAA,EAAOC,KAAKD,KAAAA,EAAO;AAAC,YAAA,MAAA;AAAQ,YAAA,SAAA;AAAW,YAAA;AAAU,SAAA;KACnD,CAAA;AAEA,SAASE,qBACPC,cAAqC,EACrCC,OAAe,EACfC,IAAY,EACZC,aAAsB,EAAA;AAEtB,IAAA,MAAMC,OAAAA,GAAU;AACd,QAAA,GAAGJ,cAAc;QACjBK,UAAAA,EAAY;AACV,YAAA,GAAGL,eAAeK,UAAU;AAC5B,YAAA,GAAGT,uBAAuBO,aAAAA,CAAc;AACxCD,YAAAA;AACF;AACF,KAAA;IAEA,OAAO,IAAII,aAAaL,OAAAA,EAASG,OAAAA,CAAAA;AACnC;AAEA;;;;AAIC,IACM,SAASG,kBAAAA,CAAmBP,cAAqC,EAAEH,KAAc,EAAA;AACtF,IAAA,MAAMM,gBAAgBK,mBAAAA,CAAoBX,KAAAA,CAAAA;;;;IAK1C,IAAIM,aAAAA,KAAkB,IAAA,IAAQA,aAAAA,KAAkBM,SAAAA,EAAW;QACzD,OAAOT,cAAAA;AACT,IAAA;AAEA,IAAA,MAAM,EAAEC,OAAAA,GAAU,EAAE,EAAER,IAAAA,GAAO,SAAS,EAAE,GAAGU,aAAAA;IAE3C,IAAIA,aAAAA,YAAyBhB,cAAAA,IAAkBgB,aAAAA,YAAyBf,iBAAAA,EAAmB;QACzF,OAAOW,oBAAAA,CAAqBC,cAAAA,EAAgBC,OAAAA,EAAS,WAAA,EAAaE,aAAAA,CAAAA;AACpE,IAAA;AAEA,IAAA,IAAIA,yBAAyBb,eAAAA,EAAiB;QAC5C,OAAOS,oBAAAA,CAAqBC,cAAAA,EAAgBC,OAAAA,EAAS,gBAAA,EAAkBE,aAAAA,CAAAA;AACzE,IAAA;IAEA,IAAIA,aAAAA,YAAyBd,gBAAAA,IAAoBc,aAAAA,YAAyBjB,SAAAA,EAAW;AACnF,QAAA,MAAMwB,YAAYlB,YAAAA,CAAaC,IAAAA,CAAAA;QAC/B,OAAOM,oBAAAA,CAAqBC,cAAAA,EAAgBC,OAAAA,EAASS,SAAAA,EAAWP,aAAAA,CAAAA;AAClE,IAAA;AAEA,IAAA,IAAIA,yBAAyBG,YAAAA,EAAc;QACzC,OAAON,cAAAA;AACT,IAAA;;;IAKAW,MAAAA,CAAOC,GAAG,CAACf,KAAK,CAACM,aAAAA,CAAAA;;;;;;;;AASjB,IAAA,MAAMU,YAAYd,oBAAAA,CAChB;QAAEE,OAAAA,EAAS,uBAAA;AAAyBa,QAAAA,IAAAA,EAAMd,eAAec;AAAK,KAAA,EAC9D,yBACA,uBAAA,EACA;QAAErB,IAAAA,EAAM,qBAAA;QAAuBQ,OAAAA,EAAS;AAAwB,KAAA,CAAA;;;;IAKlE,IAAID,cAAAA,CAAee,SAAS,IAAI,IAAA,EAAM;QACpCC,MAAAA,CAAOC,cAAc,CAACJ,SAAAA,EAAW,WAAA,EAAa;AAC5CK,YAAAA,KAAAA,EAAOlB,eAAee,SAAS;YAC/BI,UAAAA,EAAY,IAAA;YACZC,QAAAA,EAAU,IAAA;YACVC,YAAAA,EAAc;AAChB,SAAA,CAAA;AACF,IAAA;IACA,OAAOR,SAAAA;AACT;;;;"}
@@ -6,14 +6,14 @@ 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
@@ -54,7 +54,7 @@ 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.includes(type);
57
+ const isIgnoredType = introspectionQueries.has(type);
58
58
  if (!isGraphQLObjectType || isIgnoredType) {
59
59
  return;
60
60
  }
@@ -1 +1 @@
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 = [\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);\n }\n\n if (typeof middleware === 'object') {\n const { name, options = {} } = middleware;\n\n return strapi.middleware(name)(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.includes(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","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","includes","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","hasConfig","isAuthDisabled","verify","parent"],"mappings":"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"}
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);\n }\n\n if (typeof middleware === 'object') {\n const { name, options = {} } = middleware;\n\n return strapi.middleware(name)(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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"}
@@ -4,14 +4,14 @@ import { errors } from '@strapi/utils';
4
4
  import { createPoliciesMiddleware } from './policy.mjs';
5
5
 
6
6
  const { ForbiddenError } = errors;
7
- const introspectionQueries = [
7
+ const introspectionQueries = new Set([
8
8
  '__Schema',
9
9
  '__Type',
10
10
  '__Field',
11
11
  '__InputValue',
12
12
  '__EnumValue',
13
13
  '__Directive'
14
- ];
14
+ ]);
15
15
  /**
16
16
  * Get & parse middlewares definitions from the resolver's config
17
17
  * @param {object} resolverConfig
@@ -52,7 +52,7 @@ const introspectionQueries = [
52
52
  const typeMap = schema.getTypeMap();
53
53
  Object.entries(typeMap).forEach(([type, definition])=>{
54
54
  const isGraphQLObjectType = definition instanceof GraphQLObjectType;
55
- const isIgnoredType = introspectionQueries.includes(type);
55
+ const isIgnoredType = introspectionQueries.has(type);
56
56
  if (!isGraphQLObjectType || isIgnoredType) {
57
57
  return;
58
58
  }
@@ -1 +1 @@
1
- {"version":3,"file":"wrap-resolvers.mjs","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 = [\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);\n }\n\n if (typeof middleware === 'object') {\n const { name, options = {} } = middleware;\n\n return strapi.middleware(name)(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.includes(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","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","includes","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","hasConfig","isAuthDisabled","verify","parent"],"mappings":"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"}
1
+ {"version":3,"file":"wrap-resolvers.mjs","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);\n }\n\n if (typeof middleware === 'object') {\n const { name, options = {} } = middleware;\n\n return strapi.middleware(name)(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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"}
@@ -40,11 +40,11 @@ var createShadowCRUDManager = (()=>{
40
40
  return !this.areMutationsEnabled();
41
41
  },
42
42
  isActionEnabled (action) {
43
- const matchingActions = [
43
+ const matchingActions = new Set([
44
44
  action,
45
45
  ALL_ACTIONS
46
- ];
47
- return configs.get(uid).disabledActions.every((action)=>!matchingActions.includes(action));
46
+ ]);
47
+ return configs.get(uid).disabledActions.every((action)=>!matchingActions.has(action));
48
48
  },
49
49
  isActionDisabled (action) {
50
50
  return !this.isActionEnabled(action);
@@ -1 +1 @@
1
- {"version":3,"file":"shadow-crud-manager.js","sources":["../../../../server/src/services/extension/shadow-crud-manager.ts"],"sourcesContent":["export type ContentTypeConfig = {\n enabled: boolean;\n\n mutations: boolean;\n queries: boolean;\n\n disabledActions: string[];\n fields: Map<string, FieldConfig>;\n};\n\nexport type FieldConfig = {\n enabled: boolean;\n\n input: boolean;\n output: boolean;\n\n filters: boolean;\n};\n\nconst getDefaultContentTypeConfig = (): ContentTypeConfig => ({\n enabled: true,\n\n mutations: true,\n queries: true,\n\n disabledActions: [],\n fields: new Map(),\n});\n\nconst getDefaultFieldConfig = (): FieldConfig => ({\n enabled: true,\n\n input: true,\n output: true,\n\n filters: true,\n});\n\nconst ALL_ACTIONS = '*';\n\nexport default () => {\n const configs = new Map<string, ContentTypeConfig>();\n\n return (uid: string) => {\n if (!configs.has(uid)) {\n configs.set(uid, getDefaultContentTypeConfig());\n }\n\n return {\n isEnabled() {\n return configs.get(uid)!.enabled;\n },\n\n isDisabled() {\n return !this.isEnabled();\n },\n\n areQueriesEnabled() {\n return configs.get(uid)!.queries;\n },\n\n areQueriesDisabled() {\n return !this.areQueriesEnabled();\n },\n\n areMutationsEnabled() {\n return configs.get(uid)!.mutations;\n },\n\n areMutationsDisabled() {\n return !this.areMutationsEnabled();\n },\n\n isActionEnabled(action: string) {\n const matchingActions = [action, ALL_ACTIONS];\n\n return configs\n .get(uid)!\n .disabledActions.every((action) => !matchingActions.includes(action));\n },\n\n isActionDisabled(action: string) {\n return !this.isActionEnabled(action);\n },\n\n disable() {\n configs.get(uid)!.enabled = false;\n\n return this;\n },\n\n disableQueries() {\n configs.get(uid)!.queries = false;\n\n return this;\n },\n\n disableMutations() {\n configs.get(uid)!.mutations = false;\n\n return this;\n },\n\n disableAction(action: string) {\n const config = configs.get(uid)!;\n\n if (!config.disabledActions.includes(action)) {\n config.disabledActions.push(action);\n }\n\n return this;\n },\n\n disableActions(actions = []) {\n actions.forEach((action) => this.disableAction(action));\n\n return this;\n },\n\n field(fieldName: string) {\n const { fields } = configs.get(uid)!;\n\n if (!fields.has(fieldName)) {\n fields.set(fieldName, getDefaultFieldConfig());\n }\n\n return {\n isEnabled() {\n return fields.get(fieldName)!.enabled;\n },\n\n hasInputEnabled() {\n return fields.get(fieldName)!.input;\n },\n\n hasOutputEnabled() {\n return fields.get(fieldName)!.output;\n },\n\n hasFiltersEnabeld() {\n return fields.get(fieldName)!.filters;\n },\n\n disable() {\n fields.set(fieldName, {\n enabled: false,\n\n output: false,\n input: false,\n\n filters: false,\n });\n\n return this;\n },\n\n disableOutput() {\n fields.get(fieldName)!.output = false;\n\n return this;\n },\n\n disableInput() {\n fields.get(fieldName)!.input = false;\n\n return this;\n },\n\n disableFilters() {\n fields.get(fieldName)!.filters = false;\n\n return this;\n },\n };\n },\n };\n };\n};\n"],"names":["getDefaultContentTypeConfig","enabled","mutations","queries","disabledActions","fields","Map","getDefaultFieldConfig","input","output","filters","ALL_ACTIONS","configs","uid","has","set","isEnabled","get","isDisabled","areQueriesEnabled","areQueriesDisabled","areMutationsEnabled","areMutationsDisabled","isActionEnabled","action","matchingActions","every","includes","isActionDisabled","disable","disableQueries","disableMutations","disableAction","config","push","disableActions","actions","forEach","field","fieldName","hasInputEnabled","hasOutputEnabled","hasFiltersEnabeld","disableOutput","disableInput","disableFilters"],"mappings":"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"}
1
+ {"version":3,"file":"shadow-crud-manager.js","sources":["../../../../server/src/services/extension/shadow-crud-manager.ts"],"sourcesContent":["export type ContentTypeConfig = {\n enabled: boolean;\n\n mutations: boolean;\n queries: boolean;\n\n disabledActions: string[];\n fields: Map<string, FieldConfig>;\n};\n\nexport type FieldConfig = {\n enabled: boolean;\n\n input: boolean;\n output: boolean;\n\n filters: boolean;\n};\n\nconst getDefaultContentTypeConfig = (): ContentTypeConfig => ({\n enabled: true,\n\n mutations: true,\n queries: true,\n\n disabledActions: [],\n fields: new Map(),\n});\n\nconst getDefaultFieldConfig = (): FieldConfig => ({\n enabled: true,\n\n input: true,\n output: true,\n\n filters: true,\n});\n\nconst ALL_ACTIONS = '*';\n\nexport default () => {\n const configs = new Map<string, ContentTypeConfig>();\n\n return (uid: string) => {\n if (!configs.has(uid)) {\n configs.set(uid, getDefaultContentTypeConfig());\n }\n\n return {\n isEnabled() {\n return configs.get(uid)!.enabled;\n },\n\n isDisabled() {\n return !this.isEnabled();\n },\n\n areQueriesEnabled() {\n return configs.get(uid)!.queries;\n },\n\n areQueriesDisabled() {\n return !this.areQueriesEnabled();\n },\n\n areMutationsEnabled() {\n return configs.get(uid)!.mutations;\n },\n\n areMutationsDisabled() {\n return !this.areMutationsEnabled();\n },\n\n isActionEnabled(action: string) {\n const matchingActions = new Set([action, ALL_ACTIONS]);\n\n return configs.get(uid)!.disabledActions.every((action) => !matchingActions.has(action));\n },\n\n isActionDisabled(action: string) {\n return !this.isActionEnabled(action);\n },\n\n disable() {\n configs.get(uid)!.enabled = false;\n\n return this;\n },\n\n disableQueries() {\n configs.get(uid)!.queries = false;\n\n return this;\n },\n\n disableMutations() {\n configs.get(uid)!.mutations = false;\n\n return this;\n },\n\n disableAction(action: string) {\n const config = configs.get(uid)!;\n\n if (!config.disabledActions.includes(action)) {\n config.disabledActions.push(action);\n }\n\n return this;\n },\n\n disableActions(actions = []) {\n actions.forEach((action) => this.disableAction(action));\n\n return this;\n },\n\n field(fieldName: string) {\n const { fields } = configs.get(uid)!;\n\n if (!fields.has(fieldName)) {\n fields.set(fieldName, getDefaultFieldConfig());\n }\n\n return {\n isEnabled() {\n return fields.get(fieldName)!.enabled;\n },\n\n hasInputEnabled() {\n return fields.get(fieldName)!.input;\n },\n\n hasOutputEnabled() {\n return fields.get(fieldName)!.output;\n },\n\n hasFiltersEnabeld() {\n return fields.get(fieldName)!.filters;\n },\n\n disable() {\n fields.set(fieldName, {\n enabled: false,\n\n output: false,\n input: false,\n\n filters: false,\n });\n\n return this;\n },\n\n disableOutput() {\n fields.get(fieldName)!.output = false;\n\n return this;\n },\n\n disableInput() {\n fields.get(fieldName)!.input = false;\n\n return this;\n },\n\n disableFilters() {\n fields.get(fieldName)!.filters = false;\n\n return this;\n },\n };\n },\n };\n };\n};\n"],"names":["getDefaultContentTypeConfig","enabled","mutations","queries","disabledActions","fields","Map","getDefaultFieldConfig","input","output","filters","ALL_ACTIONS","configs","uid","has","set","isEnabled","get","isDisabled","areQueriesEnabled","areQueriesDisabled","areMutationsEnabled","areMutationsDisabled","isActionEnabled","action","matchingActions","Set","every","isActionDisabled","disable","disableQueries","disableMutations","disableAction","config","includes","push","disableActions","actions","forEach","field","fieldName","hasInputEnabled","hasOutputEnabled","hasFiltersEnabeld","disableOutput","disableInput","disableFilters"],"mappings":"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"}
@@ -38,11 +38,11 @@ var createShadowCRUDManager = (()=>{
38
38
  return !this.areMutationsEnabled();
39
39
  },
40
40
  isActionEnabled (action) {
41
- const matchingActions = [
41
+ const matchingActions = new Set([
42
42
  action,
43
43
  ALL_ACTIONS
44
- ];
45
- return configs.get(uid).disabledActions.every((action)=>!matchingActions.includes(action));
44
+ ]);
45
+ return configs.get(uid).disabledActions.every((action)=>!matchingActions.has(action));
46
46
  },
47
47
  isActionDisabled (action) {
48
48
  return !this.isActionEnabled(action);
@@ -1 +1 @@
1
- {"version":3,"file":"shadow-crud-manager.mjs","sources":["../../../../server/src/services/extension/shadow-crud-manager.ts"],"sourcesContent":["export type ContentTypeConfig = {\n enabled: boolean;\n\n mutations: boolean;\n queries: boolean;\n\n disabledActions: string[];\n fields: Map<string, FieldConfig>;\n};\n\nexport type FieldConfig = {\n enabled: boolean;\n\n input: boolean;\n output: boolean;\n\n filters: boolean;\n};\n\nconst getDefaultContentTypeConfig = (): ContentTypeConfig => ({\n enabled: true,\n\n mutations: true,\n queries: true,\n\n disabledActions: [],\n fields: new Map(),\n});\n\nconst getDefaultFieldConfig = (): FieldConfig => ({\n enabled: true,\n\n input: true,\n output: true,\n\n filters: true,\n});\n\nconst ALL_ACTIONS = '*';\n\nexport default () => {\n const configs = new Map<string, ContentTypeConfig>();\n\n return (uid: string) => {\n if (!configs.has(uid)) {\n configs.set(uid, getDefaultContentTypeConfig());\n }\n\n return {\n isEnabled() {\n return configs.get(uid)!.enabled;\n },\n\n isDisabled() {\n return !this.isEnabled();\n },\n\n areQueriesEnabled() {\n return configs.get(uid)!.queries;\n },\n\n areQueriesDisabled() {\n return !this.areQueriesEnabled();\n },\n\n areMutationsEnabled() {\n return configs.get(uid)!.mutations;\n },\n\n areMutationsDisabled() {\n return !this.areMutationsEnabled();\n },\n\n isActionEnabled(action: string) {\n const matchingActions = [action, ALL_ACTIONS];\n\n return configs\n .get(uid)!\n .disabledActions.every((action) => !matchingActions.includes(action));\n },\n\n isActionDisabled(action: string) {\n return !this.isActionEnabled(action);\n },\n\n disable() {\n configs.get(uid)!.enabled = false;\n\n return this;\n },\n\n disableQueries() {\n configs.get(uid)!.queries = false;\n\n return this;\n },\n\n disableMutations() {\n configs.get(uid)!.mutations = false;\n\n return this;\n },\n\n disableAction(action: string) {\n const config = configs.get(uid)!;\n\n if (!config.disabledActions.includes(action)) {\n config.disabledActions.push(action);\n }\n\n return this;\n },\n\n disableActions(actions = []) {\n actions.forEach((action) => this.disableAction(action));\n\n return this;\n },\n\n field(fieldName: string) {\n const { fields } = configs.get(uid)!;\n\n if (!fields.has(fieldName)) {\n fields.set(fieldName, getDefaultFieldConfig());\n }\n\n return {\n isEnabled() {\n return fields.get(fieldName)!.enabled;\n },\n\n hasInputEnabled() {\n return fields.get(fieldName)!.input;\n },\n\n hasOutputEnabled() {\n return fields.get(fieldName)!.output;\n },\n\n hasFiltersEnabeld() {\n return fields.get(fieldName)!.filters;\n },\n\n disable() {\n fields.set(fieldName, {\n enabled: false,\n\n output: false,\n input: false,\n\n filters: false,\n });\n\n return this;\n },\n\n disableOutput() {\n fields.get(fieldName)!.output = false;\n\n return this;\n },\n\n disableInput() {\n fields.get(fieldName)!.input = false;\n\n return this;\n },\n\n disableFilters() {\n fields.get(fieldName)!.filters = false;\n\n return this;\n },\n };\n },\n };\n };\n};\n"],"names":["getDefaultContentTypeConfig","enabled","mutations","queries","disabledActions","fields","Map","getDefaultFieldConfig","input","output","filters","ALL_ACTIONS","configs","uid","has","set","isEnabled","get","isDisabled","areQueriesEnabled","areQueriesDisabled","areMutationsEnabled","areMutationsDisabled","isActionEnabled","action","matchingActions","every","includes","isActionDisabled","disable","disableQueries","disableMutations","disableAction","config","push","disableActions","actions","forEach","field","fieldName","hasInputEnabled","hasOutputEnabled","hasFiltersEnabeld","disableOutput","disableInput","disableFilters"],"mappings":"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"}
1
+ {"version":3,"file":"shadow-crud-manager.mjs","sources":["../../../../server/src/services/extension/shadow-crud-manager.ts"],"sourcesContent":["export type ContentTypeConfig = {\n enabled: boolean;\n\n mutations: boolean;\n queries: boolean;\n\n disabledActions: string[];\n fields: Map<string, FieldConfig>;\n};\n\nexport type FieldConfig = {\n enabled: boolean;\n\n input: boolean;\n output: boolean;\n\n filters: boolean;\n};\n\nconst getDefaultContentTypeConfig = (): ContentTypeConfig => ({\n enabled: true,\n\n mutations: true,\n queries: true,\n\n disabledActions: [],\n fields: new Map(),\n});\n\nconst getDefaultFieldConfig = (): FieldConfig => ({\n enabled: true,\n\n input: true,\n output: true,\n\n filters: true,\n});\n\nconst ALL_ACTIONS = '*';\n\nexport default () => {\n const configs = new Map<string, ContentTypeConfig>();\n\n return (uid: string) => {\n if (!configs.has(uid)) {\n configs.set(uid, getDefaultContentTypeConfig());\n }\n\n return {\n isEnabled() {\n return configs.get(uid)!.enabled;\n },\n\n isDisabled() {\n return !this.isEnabled();\n },\n\n areQueriesEnabled() {\n return configs.get(uid)!.queries;\n },\n\n areQueriesDisabled() {\n return !this.areQueriesEnabled();\n },\n\n areMutationsEnabled() {\n return configs.get(uid)!.mutations;\n },\n\n areMutationsDisabled() {\n return !this.areMutationsEnabled();\n },\n\n isActionEnabled(action: string) {\n const matchingActions = new Set([action, ALL_ACTIONS]);\n\n return configs.get(uid)!.disabledActions.every((action) => !matchingActions.has(action));\n },\n\n isActionDisabled(action: string) {\n return !this.isActionEnabled(action);\n },\n\n disable() {\n configs.get(uid)!.enabled = false;\n\n return this;\n },\n\n disableQueries() {\n configs.get(uid)!.queries = false;\n\n return this;\n },\n\n disableMutations() {\n configs.get(uid)!.mutations = false;\n\n return this;\n },\n\n disableAction(action: string) {\n const config = configs.get(uid)!;\n\n if (!config.disabledActions.includes(action)) {\n config.disabledActions.push(action);\n }\n\n return this;\n },\n\n disableActions(actions = []) {\n actions.forEach((action) => this.disableAction(action));\n\n return this;\n },\n\n field(fieldName: string) {\n const { fields } = configs.get(uid)!;\n\n if (!fields.has(fieldName)) {\n fields.set(fieldName, getDefaultFieldConfig());\n }\n\n return {\n isEnabled() {\n return fields.get(fieldName)!.enabled;\n },\n\n hasInputEnabled() {\n return fields.get(fieldName)!.input;\n },\n\n hasOutputEnabled() {\n return fields.get(fieldName)!.output;\n },\n\n hasFiltersEnabeld() {\n return fields.get(fieldName)!.filters;\n },\n\n disable() {\n fields.set(fieldName, {\n enabled: false,\n\n output: false,\n input: false,\n\n filters: false,\n });\n\n return this;\n },\n\n disableOutput() {\n fields.get(fieldName)!.output = false;\n\n return this;\n },\n\n disableInput() {\n fields.get(fieldName)!.input = false;\n\n return this;\n },\n\n disableFilters() {\n fields.get(fieldName)!.filters = false;\n\n return this;\n },\n };\n },\n };\n };\n};\n"],"names":["getDefaultContentTypeConfig","enabled","mutations","queries","disabledActions","fields","Map","getDefaultFieldConfig","input","output","filters","ALL_ACTIONS","configs","uid","has","set","isEnabled","get","isDisabled","areQueriesEnabled","areQueriesDisabled","areMutationsEnabled","areMutationsDisabled","isActionEnabled","action","matchingActions","Set","every","isActionDisabled","disable","disableQueries","disableMutations","disableAction","config","includes","push","disableActions","actions","forEach","field","fieldName","hasInputEnabled","hasOutputEnabled","hasFiltersEnabeld","disableOutput","disableInput","disableFilters"],"mappings":"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"}
@@ -3,10 +3,10 @@
3
3
  var lodash = require('lodash');
4
4
 
5
5
  // todo[v4]: Find a way to get that dynamically
6
- const virtualScalarAttributes = [
6
+ const virtualScalarAttributes = new Set([
7
7
  'id',
8
8
  'documentId'
9
- ];
9
+ ]);
10
10
  var graphQLFiltersToStrapiQuery = (({ strapi })=>{
11
11
  const { service: getService } = strapi.plugin('graphql');
12
12
  const recursivelyReplaceScalarOperators = (data)=>{
@@ -52,14 +52,14 @@ var graphQLFiltersToStrapiQuery = (({ strapi })=>{
52
52
  const resultMap = {};
53
53
  const { attributes } = contentType;
54
54
  const isAttribute = (attributeName)=>{
55
- return virtualScalarAttributes.includes(attributeName) || lodash.has(attributes, attributeName);
55
+ return virtualScalarAttributes.has(attributeName) || lodash.has(attributes, attributeName);
56
56
  };
57
57
  for (const [key, value] of Object.entries(filters)){
58
58
  // If the key is an attribute, update the value
59
59
  if (isAttribute(key)) {
60
60
  const attribute = attributes[key];
61
61
  // If it's a scalar attribute
62
- if (virtualScalarAttributes.includes(key) || isStrapiScalar(attribute)) {
62
+ if (virtualScalarAttributes.has(key) || isStrapiScalar(attribute)) {
63
63
  // Replace (recursively) every GraphQL scalar operator with the associated Strapi operator
64
64
  resultMap[key] = recursivelyReplaceScalarOperators(value);
65
65
  } else if (isRelation(attribute) || isMedia(attribute)) {
@@ -1 +1 @@
1
- {"version":3,"file":"graphql-filters-to-strapi-query.js","sources":["../../../../../server/src/services/utils/mappers/graphql-filters-to-strapi-query.ts"],"sourcesContent":["import { isDate, isObject, has, matchesProperty } from 'lodash';\nimport type { Struct } from '@strapi/types';\nimport type { Context } from '../../types';\n\n// todo[v4]: Find a way to get that dynamically\nconst virtualScalarAttributes = ['id', 'documentId'];\n\nexport default ({ strapi }: Context) => {\n const { service: getService } = strapi.plugin('graphql');\n\n const recursivelyReplaceScalarOperators = (data: any): any => {\n const { operators } = getService('builders').filters;\n\n if (Array.isArray(data)) {\n return data.map(recursivelyReplaceScalarOperators);\n }\n\n // Note: We need to make an exception for date since GraphQL\n // automatically cast date strings to date instances in args\n if (isDate(data) || !isObject(data)) {\n return data;\n }\n\n const result: any = {};\n\n for (const [key, value] of Object.entries(data)) {\n const isOperator = !!operators[key];\n\n const newKey = isOperator ? operators[key].strapiOperator : key;\n\n result[newKey] = recursivelyReplaceScalarOperators(value);\n }\n\n return result;\n };\n\n return {\n /**\n * Transform one or many GraphQL filters object into a valid Strapi query\n * @param {object | object[]} filters\n * @param {object} contentType\n * @return {object | object[]}\n */\n graphQLFiltersToStrapiQuery(filters: any, contentType: Struct.Schema): any {\n const { isStrapiScalar, isMedia, isRelation, isComponent } = getService('utils').attributes;\n const { operators } = getService('builders').filters;\n\n const ROOT_LEVEL_OPERATORS = [operators.and, operators.or, operators.not];\n\n // Handle unwanted scenario where there is no filters defined\n if (filters == null) {\n return {};\n }\n\n // If filters is a collection, then apply the transformation to every item of the list\n if (Array.isArray(filters)) {\n return filters.map((filtersItem) =>\n this.graphQLFiltersToStrapiQuery(filtersItem, contentType)\n );\n }\n\n const resultMap: any = {};\n const { attributes } = contentType;\n\n const isAttribute = (attributeName: string) => {\n return virtualScalarAttributes.includes(attributeName) || has(attributes, attributeName);\n };\n\n for (const [key, value] of Object.entries(filters)) {\n // If the key is an attribute, update the value\n if (isAttribute(key)) {\n const attribute: any = attributes[key];\n\n // If it's a scalar attribute\n if (virtualScalarAttributes.includes(key) || isStrapiScalar(attribute)) {\n // Replace (recursively) every GraphQL scalar operator with the associated Strapi operator\n resultMap[key] = recursivelyReplaceScalarOperators(value);\n }\n\n // If it's a deep filter on a relation\n else if (isRelation(attribute) || isMedia(attribute)) {\n // Fetch the model from the relation\n const relModel = strapi.getModel(attribute.target);\n\n // Recursively apply the mapping to the value using the fetched model,\n // and update the value within `resultMap`\n resultMap[key] = this.graphQLFiltersToStrapiQuery(value, relModel);\n }\n\n // If it's a deep filter on a component\n else if (isComponent(attribute)) {\n // Fetch the model from the component attribute\n const componentModel = strapi.getModel(attribute.component);\n\n // Recursively apply the mapping to the value using the fetched model,\n // and update the value within `resultMap`\n resultMap[key] = this.graphQLFiltersToStrapiQuery(value, componentModel);\n }\n }\n\n // Handle the case where the key is not an attribute (operator, ...)\n else {\n const rootLevelOperator = ROOT_LEVEL_OPERATORS.find(matchesProperty('fieldName', key));\n\n // If it's a root level operator (AND, NOT, OR, ...)\n if (rootLevelOperator) {\n const { strapiOperator } = rootLevelOperator;\n\n // Transform the current value recursively and add it to the resultMap\n // object using the strapiOperator equivalent of the GraphQL key\n resultMap[strapiOperator] = this.graphQLFiltersToStrapiQuery(value, contentType);\n }\n }\n }\n\n return resultMap;\n },\n };\n};\n"],"names":["virtualScalarAttributes","strapi","service","getService","plugin","recursivelyReplaceScalarOperators","data","operators","filters","Array","isArray","map","isDate","isObject","result","key","value","Object","entries","isOperator","newKey","strapiOperator","graphQLFiltersToStrapiQuery","contentType","isStrapiScalar","isMedia","isRelation","isComponent","attributes","ROOT_LEVEL_OPERATORS","and","or","not","filtersItem","resultMap","isAttribute","attributeName","includes","has","attribute","relModel","getModel","target","componentModel","component","rootLevelOperator","find","matchesProperty"],"mappings":"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"}
1
+ {"version":3,"file":"graphql-filters-to-strapi-query.js","sources":["../../../../../server/src/services/utils/mappers/graphql-filters-to-strapi-query.ts"],"sourcesContent":["import { isDate, isObject, has, matchesProperty } from 'lodash';\nimport type { Struct } from '@strapi/types';\nimport type { Context } from '../../types';\n\n// todo[v4]: Find a way to get that dynamically\nconst virtualScalarAttributes = new Set(['id', 'documentId']);\n\nexport default ({ strapi }: Context) => {\n const { service: getService } = strapi.plugin('graphql');\n\n const recursivelyReplaceScalarOperators = (data: any): any => {\n const { operators } = getService('builders').filters;\n\n if (Array.isArray(data)) {\n return data.map(recursivelyReplaceScalarOperators);\n }\n\n // Note: We need to make an exception for date since GraphQL\n // automatically cast date strings to date instances in args\n if (isDate(data) || !isObject(data)) {\n return data;\n }\n\n const result: any = {};\n\n for (const [key, value] of Object.entries(data)) {\n const isOperator = !!operators[key];\n\n const newKey = isOperator ? operators[key].strapiOperator : key;\n\n result[newKey] = recursivelyReplaceScalarOperators(value);\n }\n\n return result;\n };\n\n return {\n /**\n * Transform one or many GraphQL filters object into a valid Strapi query\n * @param {object | object[]} filters\n * @param {object} contentType\n * @return {object | object[]}\n */\n graphQLFiltersToStrapiQuery(filters: any, contentType: Struct.Schema): any {\n const { isStrapiScalar, isMedia, isRelation, isComponent } = getService('utils').attributes;\n const { operators } = getService('builders').filters;\n\n const ROOT_LEVEL_OPERATORS = [operators.and, operators.or, operators.not];\n\n // Handle unwanted scenario where there is no filters defined\n if (filters == null) {\n return {};\n }\n\n // If filters is a collection, then apply the transformation to every item of the list\n if (Array.isArray(filters)) {\n return filters.map((filtersItem) =>\n this.graphQLFiltersToStrapiQuery(filtersItem, contentType)\n );\n }\n\n const resultMap: any = {};\n const { attributes } = contentType;\n\n const isAttribute = (attributeName: string) => {\n return virtualScalarAttributes.has(attributeName) || has(attributes, attributeName);\n };\n\n for (const [key, value] of Object.entries(filters)) {\n // If the key is an attribute, update the value\n if (isAttribute(key)) {\n const attribute: any = attributes[key];\n\n // If it's a scalar attribute\n if (virtualScalarAttributes.has(key) || isStrapiScalar(attribute)) {\n // Replace (recursively) every GraphQL scalar operator with the associated Strapi operator\n resultMap[key] = recursivelyReplaceScalarOperators(value);\n }\n\n // If it's a deep filter on a relation\n else if (isRelation(attribute) || isMedia(attribute)) {\n // Fetch the model from the relation\n const relModel = strapi.getModel(attribute.target);\n\n // Recursively apply the mapping to the value using the fetched model,\n // and update the value within `resultMap`\n resultMap[key] = this.graphQLFiltersToStrapiQuery(value, relModel);\n }\n\n // If it's a deep filter on a component\n else if (isComponent(attribute)) {\n // Fetch the model from the component attribute\n const componentModel = strapi.getModel(attribute.component);\n\n // Recursively apply the mapping to the value using the fetched model,\n // and update the value within `resultMap`\n resultMap[key] = this.graphQLFiltersToStrapiQuery(value, componentModel);\n }\n }\n\n // Handle the case where the key is not an attribute (operator, ...)\n else {\n const rootLevelOperator = ROOT_LEVEL_OPERATORS.find(matchesProperty('fieldName', key));\n\n // If it's a root level operator (AND, NOT, OR, ...)\n if (rootLevelOperator) {\n const { strapiOperator } = rootLevelOperator;\n\n // Transform the current value recursively and add it to the resultMap\n // object using the strapiOperator equivalent of the GraphQL key\n resultMap[strapiOperator] = this.graphQLFiltersToStrapiQuery(value, contentType);\n }\n }\n }\n\n return resultMap;\n },\n };\n};\n"],"names":["virtualScalarAttributes","Set","strapi","service","getService","plugin","recursivelyReplaceScalarOperators","data","operators","filters","Array","isArray","map","isDate","isObject","result","key","value","Object","entries","isOperator","newKey","strapiOperator","graphQLFiltersToStrapiQuery","contentType","isStrapiScalar","isMedia","isRelation","isComponent","attributes","ROOT_LEVEL_OPERATORS","and","or","not","filtersItem","resultMap","isAttribute","attributeName","has","attribute","relModel","getModel","target","componentModel","component","rootLevelOperator","find","matchesProperty"],"mappings":";;;;AAIA;AACA,MAAMA,uBAAAA,GAA0B,IAAIC,GAAAA,CAAI;AAAC,IAAA,IAAA;AAAM,IAAA;AAAa,CAAA,CAAA;AAE5D,kCAAe,CAAA,CAAC,EAAEC,MAAM,EAAW,GAAA;AACjC,IAAA,MAAM,EAAEC,OAAAA,EAASC,UAAU,EAAE,GAAGF,MAAAA,CAAOG,MAAM,CAAC,SAAA,CAAA;AAE9C,IAAA,MAAMC,oCAAoC,CAACC,IAAAA,GAAAA;AACzC,QAAA,MAAM,EAAEC,SAAS,EAAE,GAAGJ,UAAAA,CAAW,YAAYK,OAAO;QAEpD,IAAIC,KAAAA,CAAMC,OAAO,CAACJ,IAAAA,CAAAA,EAAO;YACvB,OAAOA,IAAAA,CAAKK,GAAG,CAACN,iCAAAA,CAAAA;AAClB,QAAA;;;AAIA,QAAA,IAAIO,aAAAA,CAAON,IAAAA,CAAAA,IAAS,CAACO,eAAAA,CAASP,IAAAA,CAAAA,EAAO;YACnC,OAAOA,IAAAA;AACT,QAAA;AAEA,QAAA,MAAMQ,SAAc,EAAC;QAErB,KAAK,MAAM,CAACC,GAAAA,EAAKC,KAAAA,CAAM,IAAIC,MAAAA,CAAOC,OAAO,CAACZ,IAAAA,CAAAA,CAAO;AAC/C,YAAA,MAAMa,UAAAA,GAAa,CAAC,CAACZ,SAAS,CAACQ,GAAAA,CAAI;AAEnC,YAAA,MAAMK,SAASD,UAAAA,GAAaZ,SAAS,CAACQ,GAAAA,CAAI,CAACM,cAAc,GAAGN,GAAAA;YAE5DD,MAAM,CAACM,MAAAA,CAAO,GAAGf,iCAAAA,CAAkCW,KAAAA,CAAAA;AACrD,QAAA;QAEA,OAAOF,MAAAA;AACT,IAAA,CAAA;IAEA,OAAO;AACL;;;;;QAMAQ,2BAAAA,CAAAA,CAA4Bd,OAAY,EAAEe,WAA0B,EAAA;AAClE,YAAA,MAAM,EAAEC,cAAc,EAAEC,OAAO,EAAEC,UAAU,EAAEC,WAAW,EAAE,GAAGxB,UAAAA,CAAW,OAAA,CAAA,CAASyB,UAAU;AAC3F,YAAA,MAAM,EAAErB,SAAS,EAAE,GAAGJ,UAAAA,CAAW,YAAYK,OAAO;AAEpD,YAAA,MAAMqB,oBAAAA,GAAuB;AAACtB,gBAAAA,SAAAA,CAAUuB,GAAG;AAAEvB,gBAAAA,SAAAA,CAAUwB,EAAE;AAAExB,gBAAAA,SAAAA,CAAUyB;AAAI,aAAA;;AAGzE,YAAA,IAAIxB,WAAW,IAAA,EAAM;AACnB,gBAAA,OAAO,EAAC;AACV,YAAA;;YAGA,IAAIC,KAAAA,CAAMC,OAAO,CAACF,OAAAA,CAAAA,EAAU;gBAC1B,OAAOA,OAAAA,CAAQG,GAAG,CAAC,CAACsB,cAClB,IAAI,CAACX,2BAA2B,CAACW,WAAAA,EAAaV,WAAAA,CAAAA,CAAAA;AAElD,YAAA;AAEA,YAAA,MAAMW,YAAiB,EAAC;YACxB,MAAM,EAAEN,UAAU,EAAE,GAAGL,WAAAA;AAEvB,YAAA,MAAMY,cAAc,CAACC,aAAAA,GAAAA;AACnB,gBAAA,OAAOrC,uBAAAA,CAAwBsC,GAAG,CAACD,aAAAA,CAAAA,IAAkBC,WAAIT,UAAAA,EAAYQ,aAAAA,CAAAA;AACvE,YAAA,CAAA;YAEA,KAAK,MAAM,CAACrB,GAAAA,EAAKC,KAAAA,CAAM,IAAIC,MAAAA,CAAOC,OAAO,CAACV,OAAAA,CAAAA,CAAU;;AAElD,gBAAA,IAAI2B,YAAYpB,GAAAA,CAAAA,EAAM;oBACpB,MAAMuB,SAAAA,GAAiBV,UAAU,CAACb,GAAAA,CAAI;;AAGtC,oBAAA,IAAIhB,uBAAAA,CAAwBsC,GAAG,CAACtB,GAAAA,CAAAA,IAAQS,eAAec,SAAAA,CAAAA,EAAY;;wBAEjEJ,SAAS,CAACnB,GAAAA,CAAI,GAAGV,iCAAAA,CAAkCW,KAAAA,CAAAA;AACrD,oBAAA,CAAA,MAGK,IAAIU,UAAAA,CAAWY,SAAAA,CAAAA,IAAcb,OAAAA,CAAQa,SAAAA,CAAAA,EAAY;;AAEpD,wBAAA,MAAMC,QAAAA,GAAWtC,MAAAA,CAAOuC,QAAQ,CAACF,UAAUG,MAAM,CAAA;;;AAIjDP,wBAAAA,SAAS,CAACnB,GAAAA,CAAI,GAAG,IAAI,CAACO,2BAA2B,CAACN,KAAAA,EAAOuB,QAAAA,CAAAA;oBAC3D,CAAA,MAGK,IAAIZ,YAAYW,SAAAA,CAAAA,EAAY;;AAE/B,wBAAA,MAAMI,cAAAA,GAAiBzC,MAAAA,CAAOuC,QAAQ,CAACF,UAAUK,SAAS,CAAA;;;AAI1DT,wBAAAA,SAAS,CAACnB,GAAAA,CAAI,GAAG,IAAI,CAACO,2BAA2B,CAACN,KAAAA,EAAO0B,cAAAA,CAAAA;AAC3D,oBAAA;gBACF,CAAA,MAGK;AACH,oBAAA,MAAME,iBAAAA,GAAoBf,oBAAAA,CAAqBgB,IAAI,CAACC,uBAAgB,WAAA,EAAa/B,GAAAA,CAAAA,CAAAA;;AAGjF,oBAAA,IAAI6B,iBAAAA,EAAmB;wBACrB,MAAM,EAAEvB,cAAc,EAAE,GAAGuB,iBAAAA;;;AAI3BV,wBAAAA,SAAS,CAACb,cAAAA,CAAe,GAAG,IAAI,CAACC,2BAA2B,CAACN,KAAAA,EAAOO,WAAAA,CAAAA;AACtE,oBAAA;AACF,gBAAA;AACF,YAAA;YAEA,OAAOW,SAAAA;AACT,QAAA;AACF,KAAA;AACF,CAAA;;;;"}
@@ -1,10 +1,10 @@
1
1
  import { matchesProperty, isDate, isObject, has } from 'lodash';
2
2
 
3
3
  // todo[v4]: Find a way to get that dynamically
4
- const virtualScalarAttributes = [
4
+ const virtualScalarAttributes = new Set([
5
5
  'id',
6
6
  'documentId'
7
- ];
7
+ ]);
8
8
  var graphQLFiltersToStrapiQuery = (({ strapi })=>{
9
9
  const { service: getService } = strapi.plugin('graphql');
10
10
  const recursivelyReplaceScalarOperators = (data)=>{
@@ -50,14 +50,14 @@ var graphQLFiltersToStrapiQuery = (({ strapi })=>{
50
50
  const resultMap = {};
51
51
  const { attributes } = contentType;
52
52
  const isAttribute = (attributeName)=>{
53
- return virtualScalarAttributes.includes(attributeName) || has(attributes, attributeName);
53
+ return virtualScalarAttributes.has(attributeName) || has(attributes, attributeName);
54
54
  };
55
55
  for (const [key, value] of Object.entries(filters)){
56
56
  // If the key is an attribute, update the value
57
57
  if (isAttribute(key)) {
58
58
  const attribute = attributes[key];
59
59
  // If it's a scalar attribute
60
- if (virtualScalarAttributes.includes(key) || isStrapiScalar(attribute)) {
60
+ if (virtualScalarAttributes.has(key) || isStrapiScalar(attribute)) {
61
61
  // Replace (recursively) every GraphQL scalar operator with the associated Strapi operator
62
62
  resultMap[key] = recursivelyReplaceScalarOperators(value);
63
63
  } else if (isRelation(attribute) || isMedia(attribute)) {
@@ -1 +1 @@
1
- {"version":3,"file":"graphql-filters-to-strapi-query.mjs","sources":["../../../../../server/src/services/utils/mappers/graphql-filters-to-strapi-query.ts"],"sourcesContent":["import { isDate, isObject, has, matchesProperty } from 'lodash';\nimport type { Struct } from '@strapi/types';\nimport type { Context } from '../../types';\n\n// todo[v4]: Find a way to get that dynamically\nconst virtualScalarAttributes = ['id', 'documentId'];\n\nexport default ({ strapi }: Context) => {\n const { service: getService } = strapi.plugin('graphql');\n\n const recursivelyReplaceScalarOperators = (data: any): any => {\n const { operators } = getService('builders').filters;\n\n if (Array.isArray(data)) {\n return data.map(recursivelyReplaceScalarOperators);\n }\n\n // Note: We need to make an exception for date since GraphQL\n // automatically cast date strings to date instances in args\n if (isDate(data) || !isObject(data)) {\n return data;\n }\n\n const result: any = {};\n\n for (const [key, value] of Object.entries(data)) {\n const isOperator = !!operators[key];\n\n const newKey = isOperator ? operators[key].strapiOperator : key;\n\n result[newKey] = recursivelyReplaceScalarOperators(value);\n }\n\n return result;\n };\n\n return {\n /**\n * Transform one or many GraphQL filters object into a valid Strapi query\n * @param {object | object[]} filters\n * @param {object} contentType\n * @return {object | object[]}\n */\n graphQLFiltersToStrapiQuery(filters: any, contentType: Struct.Schema): any {\n const { isStrapiScalar, isMedia, isRelation, isComponent } = getService('utils').attributes;\n const { operators } = getService('builders').filters;\n\n const ROOT_LEVEL_OPERATORS = [operators.and, operators.or, operators.not];\n\n // Handle unwanted scenario where there is no filters defined\n if (filters == null) {\n return {};\n }\n\n // If filters is a collection, then apply the transformation to every item of the list\n if (Array.isArray(filters)) {\n return filters.map((filtersItem) =>\n this.graphQLFiltersToStrapiQuery(filtersItem, contentType)\n );\n }\n\n const resultMap: any = {};\n const { attributes } = contentType;\n\n const isAttribute = (attributeName: string) => {\n return virtualScalarAttributes.includes(attributeName) || has(attributes, attributeName);\n };\n\n for (const [key, value] of Object.entries(filters)) {\n // If the key is an attribute, update the value\n if (isAttribute(key)) {\n const attribute: any = attributes[key];\n\n // If it's a scalar attribute\n if (virtualScalarAttributes.includes(key) || isStrapiScalar(attribute)) {\n // Replace (recursively) every GraphQL scalar operator with the associated Strapi operator\n resultMap[key] = recursivelyReplaceScalarOperators(value);\n }\n\n // If it's a deep filter on a relation\n else if (isRelation(attribute) || isMedia(attribute)) {\n // Fetch the model from the relation\n const relModel = strapi.getModel(attribute.target);\n\n // Recursively apply the mapping to the value using the fetched model,\n // and update the value within `resultMap`\n resultMap[key] = this.graphQLFiltersToStrapiQuery(value, relModel);\n }\n\n // If it's a deep filter on a component\n else if (isComponent(attribute)) {\n // Fetch the model from the component attribute\n const componentModel = strapi.getModel(attribute.component);\n\n // Recursively apply the mapping to the value using the fetched model,\n // and update the value within `resultMap`\n resultMap[key] = this.graphQLFiltersToStrapiQuery(value, componentModel);\n }\n }\n\n // Handle the case where the key is not an attribute (operator, ...)\n else {\n const rootLevelOperator = ROOT_LEVEL_OPERATORS.find(matchesProperty('fieldName', key));\n\n // If it's a root level operator (AND, NOT, OR, ...)\n if (rootLevelOperator) {\n const { strapiOperator } = rootLevelOperator;\n\n // Transform the current value recursively and add it to the resultMap\n // object using the strapiOperator equivalent of the GraphQL key\n resultMap[strapiOperator] = this.graphQLFiltersToStrapiQuery(value, contentType);\n }\n }\n }\n\n return resultMap;\n },\n };\n};\n"],"names":["virtualScalarAttributes","strapi","service","getService","plugin","recursivelyReplaceScalarOperators","data","operators","filters","Array","isArray","map","isDate","isObject","result","key","value","Object","entries","isOperator","newKey","strapiOperator","graphQLFiltersToStrapiQuery","contentType","isStrapiScalar","isMedia","isRelation","isComponent","attributes","ROOT_LEVEL_OPERATORS","and","or","not","filtersItem","resultMap","isAttribute","attributeName","includes","has","attribute","relModel","getModel","target","componentModel","component","rootLevelOperator","find","matchesProperty"],"mappings":"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"}
1
+ {"version":3,"file":"graphql-filters-to-strapi-query.mjs","sources":["../../../../../server/src/services/utils/mappers/graphql-filters-to-strapi-query.ts"],"sourcesContent":["import { isDate, isObject, has, matchesProperty } from 'lodash';\nimport type { Struct } from '@strapi/types';\nimport type { Context } from '../../types';\n\n// todo[v4]: Find a way to get that dynamically\nconst virtualScalarAttributes = new Set(['id', 'documentId']);\n\nexport default ({ strapi }: Context) => {\n const { service: getService } = strapi.plugin('graphql');\n\n const recursivelyReplaceScalarOperators = (data: any): any => {\n const { operators } = getService('builders').filters;\n\n if (Array.isArray(data)) {\n return data.map(recursivelyReplaceScalarOperators);\n }\n\n // Note: We need to make an exception for date since GraphQL\n // automatically cast date strings to date instances in args\n if (isDate(data) || !isObject(data)) {\n return data;\n }\n\n const result: any = {};\n\n for (const [key, value] of Object.entries(data)) {\n const isOperator = !!operators[key];\n\n const newKey = isOperator ? operators[key].strapiOperator : key;\n\n result[newKey] = recursivelyReplaceScalarOperators(value);\n }\n\n return result;\n };\n\n return {\n /**\n * Transform one or many GraphQL filters object into a valid Strapi query\n * @param {object | object[]} filters\n * @param {object} contentType\n * @return {object | object[]}\n */\n graphQLFiltersToStrapiQuery(filters: any, contentType: Struct.Schema): any {\n const { isStrapiScalar, isMedia, isRelation, isComponent } = getService('utils').attributes;\n const { operators } = getService('builders').filters;\n\n const ROOT_LEVEL_OPERATORS = [operators.and, operators.or, operators.not];\n\n // Handle unwanted scenario where there is no filters defined\n if (filters == null) {\n return {};\n }\n\n // If filters is a collection, then apply the transformation to every item of the list\n if (Array.isArray(filters)) {\n return filters.map((filtersItem) =>\n this.graphQLFiltersToStrapiQuery(filtersItem, contentType)\n );\n }\n\n const resultMap: any = {};\n const { attributes } = contentType;\n\n const isAttribute = (attributeName: string) => {\n return virtualScalarAttributes.has(attributeName) || has(attributes, attributeName);\n };\n\n for (const [key, value] of Object.entries(filters)) {\n // If the key is an attribute, update the value\n if (isAttribute(key)) {\n const attribute: any = attributes[key];\n\n // If it's a scalar attribute\n if (virtualScalarAttributes.has(key) || isStrapiScalar(attribute)) {\n // Replace (recursively) every GraphQL scalar operator with the associated Strapi operator\n resultMap[key] = recursivelyReplaceScalarOperators(value);\n }\n\n // If it's a deep filter on a relation\n else if (isRelation(attribute) || isMedia(attribute)) {\n // Fetch the model from the relation\n const relModel = strapi.getModel(attribute.target);\n\n // Recursively apply the mapping to the value using the fetched model,\n // and update the value within `resultMap`\n resultMap[key] = this.graphQLFiltersToStrapiQuery(value, relModel);\n }\n\n // If it's a deep filter on a component\n else if (isComponent(attribute)) {\n // Fetch the model from the component attribute\n const componentModel = strapi.getModel(attribute.component);\n\n // Recursively apply the mapping to the value using the fetched model,\n // and update the value within `resultMap`\n resultMap[key] = this.graphQLFiltersToStrapiQuery(value, componentModel);\n }\n }\n\n // Handle the case where the key is not an attribute (operator, ...)\n else {\n const rootLevelOperator = ROOT_LEVEL_OPERATORS.find(matchesProperty('fieldName', key));\n\n // If it's a root level operator (AND, NOT, OR, ...)\n if (rootLevelOperator) {\n const { strapiOperator } = rootLevelOperator;\n\n // Transform the current value recursively and add it to the resultMap\n // object using the strapiOperator equivalent of the GraphQL key\n resultMap[strapiOperator] = this.graphQLFiltersToStrapiQuery(value, contentType);\n }\n }\n }\n\n return resultMap;\n },\n };\n};\n"],"names":["virtualScalarAttributes","Set","strapi","service","getService","plugin","recursivelyReplaceScalarOperators","data","operators","filters","Array","isArray","map","isDate","isObject","result","key","value","Object","entries","isOperator","newKey","strapiOperator","graphQLFiltersToStrapiQuery","contentType","isStrapiScalar","isMedia","isRelation","isComponent","attributes","ROOT_LEVEL_OPERATORS","and","or","not","filtersItem","resultMap","isAttribute","attributeName","has","attribute","relModel","getModel","target","componentModel","component","rootLevelOperator","find","matchesProperty"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"format-graphql-error.d.ts","sourceRoot":"","sources":["../../../server/src/format-graphql-error.ts"],"names":[],"mappings":"AAGA,OAAO,EAAgB,KAAK,qBAAqB,EAAE,MAAM,SAAS,CAAC;AA2BnE;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,cAAc,EAAE,qBAAqB,EAAE,KAAK,EAAE,OAAO,yBAuCvF"}
1
+ {"version":3,"file":"format-graphql-error.d.ts","sourceRoot":"","sources":["../../../server/src/format-graphql-error.ts"],"names":[],"mappings":"AAGA,OAAO,EAAgB,KAAK,qBAAqB,EAAE,MAAM,SAAS,CAAC;AA2BnE;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,cAAc,EAAE,qBAAqB,EAAE,KAAK,EAAE,OAAO,yBA2DvF"}
@@ -1 +1 @@
1
- {"version":3,"file":"shadow-crud-manager.d.ts","sourceRoot":"","sources":["../../../../../server/src/services/extension/shadow-crud-manager.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,iBAAiB,GAAG;IAC9B,OAAO,EAAE,OAAO,CAAC;IAEjB,SAAS,EAAE,OAAO,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;IAEjB,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;CAClC,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG;IACxB,OAAO,EAAE,OAAO,CAAC;IAEjB,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,OAAO,CAAC;IAEhB,OAAO,EAAE,OAAO,CAAC;CAClB,CAAC;+BA0BQ,KAAK,MAAM;;;;;;;4BA8BS,MAAM;6BAQL,MAAM;;;;0BAsBT,MAAM;;qBAgBX,MAAM;;;;;;;;;;;AA/E7B,wBAyIE"}
1
+ {"version":3,"file":"shadow-crud-manager.d.ts","sourceRoot":"","sources":["../../../../../server/src/services/extension/shadow-crud-manager.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,iBAAiB,GAAG;IAC9B,OAAO,EAAE,OAAO,CAAC;IAEjB,SAAS,EAAE,OAAO,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;IAEjB,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;CAClC,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG;IACxB,OAAO,EAAE,OAAO,CAAC;IAEjB,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,OAAO,CAAC;IAEhB,OAAO,EAAE,OAAO,CAAC;CAClB,CAAC;+BA0BQ,KAAK,MAAM;;;;;;;4BA8BS,MAAM;6BAML,MAAM;;;;0BAsBT,MAAM;;qBAgBX,MAAM;;;;;;;;;;;AA7E7B,wBAuIE"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@strapi/plugin-graphql",
3
- "version": "5.57.0",
3
+ "version": "5.59.0",
4
4
  "description": "Adds GraphQL endpoint with default API methods.",
5
5
  "homepage": "https://strapi.io",
6
6
  "bugs": {
@@ -67,7 +67,7 @@
67
67
  "@koa/cors": "5.0.0",
68
68
  "@strapi/design-system": "2.2.4",
69
69
  "@strapi/icons": "2.2.4",
70
- "@strapi/utils": "5.57.0",
70
+ "@strapi/utils": "5.59.0",
71
71
  "graphql": "^16.8.1",
72
72
  "graphql-depth-limit": "^1.1.0",
73
73
  "graphql-playground-middleware-koa": "^1.6.21",
@@ -79,24 +79,24 @@
79
79
  "pluralize": "8.0.0"
80
80
  },
81
81
  "devDependencies": {
82
- "@strapi/admin": "5.57.0",
83
- "@strapi/strapi": "5.57.0",
84
- "@strapi/types": "5.57.0",
82
+ "@strapi/admin": "5.59.0",
83
+ "@strapi/strapi": "5.59.0",
84
+ "@strapi/types": "5.59.0",
85
85
  "@types/graphql-depth-limit": "1.1.5",
86
86
  "@types/koa-bodyparser": "4.3.12",
87
87
  "@types/koa__cors": "5.0.0",
88
88
  "@types/node": "20.19.41",
89
89
  "cross-env": "^7.0.3",
90
- "eslint-config-custom": "5.57.0",
90
+ "eslint-config-custom": "5.59.0",
91
91
  "koa": "2.16.4",
92
92
  "react": "18.3.1",
93
93
  "react-dom": "18.3.1",
94
94
  "react-router-dom": "6.30.6",
95
95
  "styled-components": "6.4.1",
96
- "tsconfig": "5.57.0",
96
+ "tsconfig": "5.59.0",
97
97
  "typescript": "5.9.3",
98
98
  "vitest": "catalog:",
99
- "vitest-config": "5.57.0"
99
+ "vitest-config": "5.59.0"
100
100
  },
101
101
  "peerDependencies": {
102
102
  "@strapi/admin": "^5.0.0",