@strapi/core 0.0.0-experimental.838b114ef86c9081f990c3b46f5843a41088ec64 → 0.0.0-experimental.8478bb287dfba93afd007cad7697c0f88853a2d8

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.

Potentially problematic release.


This version of @strapi/core might be problematic. Click here for more details.

@@ -17,7 +17,7 @@ function createController({ contentType }) {
17
17
  return transform.transformResponse(data, meta, {
18
18
  contentType,
19
19
  useJsonAPIFormat: ctx?.headers?.['strapi-response-format'] === 'v4',
20
- encodeSourceMaps: ctx?.headers?.['encode-source-maps'] === 'true'
20
+ encodeSourceMaps: ctx?.headers?.['strapi-encode-source-maps'] === 'true'
21
21
  });
22
22
  },
23
23
  async sanitizeOutput (data, ctx) {
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../../src/core-api/controller/index.ts"],"sourcesContent":["import { prop } from 'lodash/fp';\nimport type Koa from 'koa';\nimport { contentTypes as contentTypeUtils } from '@strapi/utils';\nimport type { Core, Struct } from '@strapi/types';\n\nimport { transformResponse } from './transform';\nimport { createSingleTypeController } from './single-type';\nimport { createCollectionTypeController } from './collection-type';\nimport requestCtx from '../../services/request-context';\n\nconst isSingleType = (\n contentType: Struct.ContentTypeSchema\n): contentType is Struct.SingleTypeSchema => contentTypeUtils.isSingleType(contentType);\n\nconst getAuthFromKoaContext = (ctx: Koa.Context) => prop('state.auth', ctx) ?? {};\n\nfunction createController<T extends Struct.SingleTypeSchema | Struct.CollectionTypeSchema>(opts: {\n contentType: T;\n}): T extends Struct.SingleTypeSchema\n ? Core.CoreAPI.Controller.SingleType\n : Core.CoreAPI.Controller.CollectionType;\nfunction createController({\n contentType,\n}: {\n contentType: Struct.SingleTypeSchema | Struct.CollectionTypeSchema;\n}) {\n // TODO: replace with Base class + SingleType and CollectionType classes\n\n const proto: Core.CoreAPI.Controller.Base = {\n transformResponse(data, meta) {\n const ctx = requestCtx.get();\n return transformResponse(data, meta, {\n contentType,\n useJsonAPIFormat: ctx?.headers?.['strapi-response-format'] === 'v4',\n encodeSourceMaps: ctx?.headers?.['encode-source-maps'] === 'true',\n });\n },\n\n async sanitizeOutput(data, ctx) {\n const auth = getAuthFromKoaContext(ctx);\n\n return strapi.contentAPI.sanitize.output(data, contentType, { auth });\n },\n\n async sanitizeInput(data, ctx) {\n const auth = getAuthFromKoaContext(ctx);\n\n return strapi.contentAPI.sanitize.input(data, contentType, { auth });\n },\n\n async sanitizeQuery(ctx) {\n const auth = getAuthFromKoaContext(ctx);\n\n return strapi.contentAPI.sanitize.query(ctx.query, contentType, { auth });\n },\n\n async validateQuery(ctx) {\n const auth = getAuthFromKoaContext(ctx);\n\n return strapi.contentAPI.validate.query(ctx.query, contentType, { auth });\n },\n\n async validateInput(data, ctx) {\n const auth = getAuthFromKoaContext(ctx);\n\n return strapi.contentAPI.validate.input(data, contentType, { auth });\n },\n };\n\n let ctrl;\n\n if (isSingleType(contentType)) {\n ctrl = createSingleTypeController({ contentType });\n } else {\n ctrl = createCollectionTypeController({ contentType });\n }\n\n return Object.assign(Object.create(proto), ctrl);\n}\n\nexport { createController };\n"],"names":["isSingleType","contentType","contentTypeUtils","getAuthFromKoaContext","ctx","prop","createController","proto","transformResponse","data","meta","requestCtx","get","useJsonAPIFormat","headers","encodeSourceMaps","sanitizeOutput","auth","strapi","contentAPI","sanitize","output","sanitizeInput","input","sanitizeQuery","query","validateQuery","validate","validateInput","ctrl","createSingleTypeController","createCollectionTypeController","Object","assign","create"],"mappings":";;;;;;;;;AAUA,MAAMA,YAAe,GAAA,CACnBC,WAC2CC,GAAAA,wBAAAA,CAAiBF,YAAY,CAACC,WAAAA,CAAAA;AAE3E,MAAME,wBAAwB,CAACC,GAAAA,GAAqBC,OAAK,CAAA,YAAA,EAAcD,QAAQ,EAAC;AAOhF,SAASE,gBAAAA,CAAiB,EACxBL,WAAW,EAGZ,EAAA;;AAGC,IAAA,MAAMM,KAAsC,GAAA;QAC1CC,iBAAkBC,CAAAA,CAAAA,IAAI,EAAEC,IAAI,EAAA;YAC1B,MAAMN,GAAAA,GAAMO,eAAWC,GAAG,EAAA;YAC1B,OAAOJ,2BAAAA,CAAkBC,MAAMC,IAAM,EAAA;AACnCT,gBAAAA,WAAAA;AACAY,gBAAAA,gBAAAA,EAAkBT,GAAKU,EAAAA,OAAAA,GAAU,wBAAA,CAAyB,KAAK,IAAA;AAC/DC,gBAAAA,gBAAAA,EAAkBX,GAAKU,EAAAA,OAAAA,GAAU,oBAAA,CAAqB,KAAK;AAC7D,aAAA,CAAA;AACF,SAAA;QAEA,MAAME,cAAAA,CAAAA,CAAeP,IAAI,EAAEL,GAAG,EAAA;AAC5B,YAAA,MAAMa,OAAOd,qBAAsBC,CAAAA,GAAAA,CAAAA;YAEnC,OAAOc,MAAAA,CAAOC,UAAU,CAACC,QAAQ,CAACC,MAAM,CAACZ,MAAMR,WAAa,EAAA;AAAEgB,gBAAAA;AAAK,aAAA,CAAA;AACrE,SAAA;QAEA,MAAMK,aAAAA,CAAAA,CAAcb,IAAI,EAAEL,GAAG,EAAA;AAC3B,YAAA,MAAMa,OAAOd,qBAAsBC,CAAAA,GAAAA,CAAAA;YAEnC,OAAOc,MAAAA,CAAOC,UAAU,CAACC,QAAQ,CAACG,KAAK,CAACd,MAAMR,WAAa,EAAA;AAAEgB,gBAAAA;AAAK,aAAA,CAAA;AACpE,SAAA;AAEA,QAAA,MAAMO,eAAcpB,GAAG,EAAA;AACrB,YAAA,MAAMa,OAAOd,qBAAsBC,CAAAA,GAAAA,CAAAA;YAEnC,OAAOc,MAAAA,CAAOC,UAAU,CAACC,QAAQ,CAACK,KAAK,CAACrB,GAAAA,CAAIqB,KAAK,EAAExB,WAAa,EAAA;AAAEgB,gBAAAA;AAAK,aAAA,CAAA;AACzE,SAAA;AAEA,QAAA,MAAMS,eAActB,GAAG,EAAA;AACrB,YAAA,MAAMa,OAAOd,qBAAsBC,CAAAA,GAAAA,CAAAA;YAEnC,OAAOc,MAAAA,CAAOC,UAAU,CAACQ,QAAQ,CAACF,KAAK,CAACrB,GAAAA,CAAIqB,KAAK,EAAExB,WAAa,EAAA;AAAEgB,gBAAAA;AAAK,aAAA,CAAA;AACzE,SAAA;QAEA,MAAMW,aAAAA,CAAAA,CAAcnB,IAAI,EAAEL,GAAG,EAAA;AAC3B,YAAA,MAAMa,OAAOd,qBAAsBC,CAAAA,GAAAA,CAAAA;YAEnC,OAAOc,MAAAA,CAAOC,UAAU,CAACQ,QAAQ,CAACJ,KAAK,CAACd,MAAMR,WAAa,EAAA;AAAEgB,gBAAAA;AAAK,aAAA,CAAA;AACpE;AACF,KAAA;IAEA,IAAIY,IAAAA;AAEJ,IAAA,IAAI7B,aAAaC,WAAc,CAAA,EAAA;AAC7B4B,QAAAA,IAAAA,GAAOC,qCAA2B,CAAA;AAAE7B,YAAAA;AAAY,SAAA,CAAA;KAC3C,MAAA;AACL4B,QAAAA,IAAAA,GAAOE,6CAA+B,CAAA;AAAE9B,YAAAA;AAAY,SAAA,CAAA;AACtD;AAEA,IAAA,OAAO+B,OAAOC,MAAM,CAACD,MAAOE,CAAAA,MAAM,CAAC3B,KAAQsB,CAAAA,EAAAA,IAAAA,CAAAA;AAC7C;;;;"}
1
+ {"version":3,"file":"index.js","sources":["../../../src/core-api/controller/index.ts"],"sourcesContent":["import { prop } from 'lodash/fp';\nimport type Koa from 'koa';\nimport { contentTypes as contentTypeUtils } from '@strapi/utils';\nimport type { Core, Struct } from '@strapi/types';\n\nimport { transformResponse } from './transform';\nimport { createSingleTypeController } from './single-type';\nimport { createCollectionTypeController } from './collection-type';\nimport requestCtx from '../../services/request-context';\n\nconst isSingleType = (\n contentType: Struct.ContentTypeSchema\n): contentType is Struct.SingleTypeSchema => contentTypeUtils.isSingleType(contentType);\n\nconst getAuthFromKoaContext = (ctx: Koa.Context) => prop('state.auth', ctx) ?? {};\n\nfunction createController<T extends Struct.SingleTypeSchema | Struct.CollectionTypeSchema>(opts: {\n contentType: T;\n}): T extends Struct.SingleTypeSchema\n ? Core.CoreAPI.Controller.SingleType\n : Core.CoreAPI.Controller.CollectionType;\nfunction createController({\n contentType,\n}: {\n contentType: Struct.SingleTypeSchema | Struct.CollectionTypeSchema;\n}) {\n // TODO: replace with Base class + SingleType and CollectionType classes\n\n const proto: Core.CoreAPI.Controller.Base = {\n transformResponse(data, meta) {\n const ctx = requestCtx.get();\n return transformResponse(data, meta, {\n contentType,\n useJsonAPIFormat: ctx?.headers?.['strapi-response-format'] === 'v4',\n encodeSourceMaps: ctx?.headers?.['strapi-encode-source-maps'] === 'true',\n });\n },\n\n async sanitizeOutput(data, ctx) {\n const auth = getAuthFromKoaContext(ctx);\n\n return strapi.contentAPI.sanitize.output(data, contentType, { auth });\n },\n\n async sanitizeInput(data, ctx) {\n const auth = getAuthFromKoaContext(ctx);\n\n return strapi.contentAPI.sanitize.input(data, contentType, { auth });\n },\n\n async sanitizeQuery(ctx) {\n const auth = getAuthFromKoaContext(ctx);\n\n return strapi.contentAPI.sanitize.query(ctx.query, contentType, { auth });\n },\n\n async validateQuery(ctx) {\n const auth = getAuthFromKoaContext(ctx);\n\n return strapi.contentAPI.validate.query(ctx.query, contentType, { auth });\n },\n\n async validateInput(data, ctx) {\n const auth = getAuthFromKoaContext(ctx);\n\n return strapi.contentAPI.validate.input(data, contentType, { auth });\n },\n };\n\n let ctrl;\n\n if (isSingleType(contentType)) {\n ctrl = createSingleTypeController({ contentType });\n } else {\n ctrl = createCollectionTypeController({ contentType });\n }\n\n return Object.assign(Object.create(proto), ctrl);\n}\n\nexport { createController };\n"],"names":["isSingleType","contentType","contentTypeUtils","getAuthFromKoaContext","ctx","prop","createController","proto","transformResponse","data","meta","requestCtx","get","useJsonAPIFormat","headers","encodeSourceMaps","sanitizeOutput","auth","strapi","contentAPI","sanitize","output","sanitizeInput","input","sanitizeQuery","query","validateQuery","validate","validateInput","ctrl","createSingleTypeController","createCollectionTypeController","Object","assign","create"],"mappings":";;;;;;;;;AAUA,MAAMA,YAAe,GAAA,CACnBC,WAC2CC,GAAAA,wBAAAA,CAAiBF,YAAY,CAACC,WAAAA,CAAAA;AAE3E,MAAME,wBAAwB,CAACC,GAAAA,GAAqBC,OAAK,CAAA,YAAA,EAAcD,QAAQ,EAAC;AAOhF,SAASE,gBAAAA,CAAiB,EACxBL,WAAW,EAGZ,EAAA;;AAGC,IAAA,MAAMM,KAAsC,GAAA;QAC1CC,iBAAkBC,CAAAA,CAAAA,IAAI,EAAEC,IAAI,EAAA;YAC1B,MAAMN,GAAAA,GAAMO,eAAWC,GAAG,EAAA;YAC1B,OAAOJ,2BAAAA,CAAkBC,MAAMC,IAAM,EAAA;AACnCT,gBAAAA,WAAAA;AACAY,gBAAAA,gBAAAA,EAAkBT,GAAKU,EAAAA,OAAAA,GAAU,wBAAA,CAAyB,KAAK,IAAA;AAC/DC,gBAAAA,gBAAAA,EAAkBX,GAAKU,EAAAA,OAAAA,GAAU,2BAAA,CAA4B,KAAK;AACpE,aAAA,CAAA;AACF,SAAA;QAEA,MAAME,cAAAA,CAAAA,CAAeP,IAAI,EAAEL,GAAG,EAAA;AAC5B,YAAA,MAAMa,OAAOd,qBAAsBC,CAAAA,GAAAA,CAAAA;YAEnC,OAAOc,MAAAA,CAAOC,UAAU,CAACC,QAAQ,CAACC,MAAM,CAACZ,MAAMR,WAAa,EAAA;AAAEgB,gBAAAA;AAAK,aAAA,CAAA;AACrE,SAAA;QAEA,MAAMK,aAAAA,CAAAA,CAAcb,IAAI,EAAEL,GAAG,EAAA;AAC3B,YAAA,MAAMa,OAAOd,qBAAsBC,CAAAA,GAAAA,CAAAA;YAEnC,OAAOc,MAAAA,CAAOC,UAAU,CAACC,QAAQ,CAACG,KAAK,CAACd,MAAMR,WAAa,EAAA;AAAEgB,gBAAAA;AAAK,aAAA,CAAA;AACpE,SAAA;AAEA,QAAA,MAAMO,eAAcpB,GAAG,EAAA;AACrB,YAAA,MAAMa,OAAOd,qBAAsBC,CAAAA,GAAAA,CAAAA;YAEnC,OAAOc,MAAAA,CAAOC,UAAU,CAACC,QAAQ,CAACK,KAAK,CAACrB,GAAAA,CAAIqB,KAAK,EAAExB,WAAa,EAAA;AAAEgB,gBAAAA;AAAK,aAAA,CAAA;AACzE,SAAA;AAEA,QAAA,MAAMS,eAActB,GAAG,EAAA;AACrB,YAAA,MAAMa,OAAOd,qBAAsBC,CAAAA,GAAAA,CAAAA;YAEnC,OAAOc,MAAAA,CAAOC,UAAU,CAACQ,QAAQ,CAACF,KAAK,CAACrB,GAAAA,CAAIqB,KAAK,EAAExB,WAAa,EAAA;AAAEgB,gBAAAA;AAAK,aAAA,CAAA;AACzE,SAAA;QAEA,MAAMW,aAAAA,CAAAA,CAAcnB,IAAI,EAAEL,GAAG,EAAA;AAC3B,YAAA,MAAMa,OAAOd,qBAAsBC,CAAAA,GAAAA,CAAAA;YAEnC,OAAOc,MAAAA,CAAOC,UAAU,CAACQ,QAAQ,CAACJ,KAAK,CAACd,MAAMR,WAAa,EAAA;AAAEgB,gBAAAA;AAAK,aAAA,CAAA;AACpE;AACF,KAAA;IAEA,IAAIY,IAAAA;AAEJ,IAAA,IAAI7B,aAAaC,WAAc,CAAA,EAAA;AAC7B4B,QAAAA,IAAAA,GAAOC,qCAA2B,CAAA;AAAE7B,YAAAA;AAAY,SAAA,CAAA;KAC3C,MAAA;AACL4B,QAAAA,IAAAA,GAAOE,6CAA+B,CAAA;AAAE9B,YAAAA;AAAY,SAAA,CAAA;AACtD;AAEA,IAAA,OAAO+B,OAAOC,MAAM,CAACD,MAAOE,CAAAA,MAAM,CAAC3B,KAAQsB,CAAAA,EAAAA,IAAAA,CAAAA;AAC7C;;;;"}
@@ -15,7 +15,7 @@ function createController({ contentType }) {
15
15
  return transformResponse(data, meta, {
16
16
  contentType,
17
17
  useJsonAPIFormat: ctx?.headers?.['strapi-response-format'] === 'v4',
18
- encodeSourceMaps: ctx?.headers?.['encode-source-maps'] === 'true'
18
+ encodeSourceMaps: ctx?.headers?.['strapi-encode-source-maps'] === 'true'
19
19
  });
20
20
  },
21
21
  async sanitizeOutput (data, ctx) {
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","sources":["../../../src/core-api/controller/index.ts"],"sourcesContent":["import { prop } from 'lodash/fp';\nimport type Koa from 'koa';\nimport { contentTypes as contentTypeUtils } from '@strapi/utils';\nimport type { Core, Struct } from '@strapi/types';\n\nimport { transformResponse } from './transform';\nimport { createSingleTypeController } from './single-type';\nimport { createCollectionTypeController } from './collection-type';\nimport requestCtx from '../../services/request-context';\n\nconst isSingleType = (\n contentType: Struct.ContentTypeSchema\n): contentType is Struct.SingleTypeSchema => contentTypeUtils.isSingleType(contentType);\n\nconst getAuthFromKoaContext = (ctx: Koa.Context) => prop('state.auth', ctx) ?? {};\n\nfunction createController<T extends Struct.SingleTypeSchema | Struct.CollectionTypeSchema>(opts: {\n contentType: T;\n}): T extends Struct.SingleTypeSchema\n ? Core.CoreAPI.Controller.SingleType\n : Core.CoreAPI.Controller.CollectionType;\nfunction createController({\n contentType,\n}: {\n contentType: Struct.SingleTypeSchema | Struct.CollectionTypeSchema;\n}) {\n // TODO: replace with Base class + SingleType and CollectionType classes\n\n const proto: Core.CoreAPI.Controller.Base = {\n transformResponse(data, meta) {\n const ctx = requestCtx.get();\n return transformResponse(data, meta, {\n contentType,\n useJsonAPIFormat: ctx?.headers?.['strapi-response-format'] === 'v4',\n encodeSourceMaps: ctx?.headers?.['encode-source-maps'] === 'true',\n });\n },\n\n async sanitizeOutput(data, ctx) {\n const auth = getAuthFromKoaContext(ctx);\n\n return strapi.contentAPI.sanitize.output(data, contentType, { auth });\n },\n\n async sanitizeInput(data, ctx) {\n const auth = getAuthFromKoaContext(ctx);\n\n return strapi.contentAPI.sanitize.input(data, contentType, { auth });\n },\n\n async sanitizeQuery(ctx) {\n const auth = getAuthFromKoaContext(ctx);\n\n return strapi.contentAPI.sanitize.query(ctx.query, contentType, { auth });\n },\n\n async validateQuery(ctx) {\n const auth = getAuthFromKoaContext(ctx);\n\n return strapi.contentAPI.validate.query(ctx.query, contentType, { auth });\n },\n\n async validateInput(data, ctx) {\n const auth = getAuthFromKoaContext(ctx);\n\n return strapi.contentAPI.validate.input(data, contentType, { auth });\n },\n };\n\n let ctrl;\n\n if (isSingleType(contentType)) {\n ctrl = createSingleTypeController({ contentType });\n } else {\n ctrl = createCollectionTypeController({ contentType });\n }\n\n return Object.assign(Object.create(proto), ctrl);\n}\n\nexport { createController };\n"],"names":["isSingleType","contentType","contentTypeUtils","getAuthFromKoaContext","ctx","prop","createController","proto","transformResponse","data","meta","requestCtx","get","useJsonAPIFormat","headers","encodeSourceMaps","sanitizeOutput","auth","strapi","contentAPI","sanitize","output","sanitizeInput","input","sanitizeQuery","query","validateQuery","validate","validateInput","ctrl","createSingleTypeController","createCollectionTypeController","Object","assign","create"],"mappings":";;;;;;;AAUA,MAAMA,YAAe,GAAA,CACnBC,WAC2CC,GAAAA,YAAAA,CAAiBF,YAAY,CAACC,WAAAA,CAAAA;AAE3E,MAAME,wBAAwB,CAACC,GAAAA,GAAqBC,IAAK,CAAA,YAAA,EAAcD,QAAQ,EAAC;AAOhF,SAASE,gBAAAA,CAAiB,EACxBL,WAAW,EAGZ,EAAA;;AAGC,IAAA,MAAMM,KAAsC,GAAA;QAC1CC,iBAAkBC,CAAAA,CAAAA,IAAI,EAAEC,IAAI,EAAA;YAC1B,MAAMN,GAAAA,GAAMO,WAAWC,GAAG,EAAA;YAC1B,OAAOJ,iBAAAA,CAAkBC,MAAMC,IAAM,EAAA;AACnCT,gBAAAA,WAAAA;AACAY,gBAAAA,gBAAAA,EAAkBT,GAAKU,EAAAA,OAAAA,GAAU,wBAAA,CAAyB,KAAK,IAAA;AAC/DC,gBAAAA,gBAAAA,EAAkBX,GAAKU,EAAAA,OAAAA,GAAU,oBAAA,CAAqB,KAAK;AAC7D,aAAA,CAAA;AACF,SAAA;QAEA,MAAME,cAAAA,CAAAA,CAAeP,IAAI,EAAEL,GAAG,EAAA;AAC5B,YAAA,MAAMa,OAAOd,qBAAsBC,CAAAA,GAAAA,CAAAA;YAEnC,OAAOc,MAAAA,CAAOC,UAAU,CAACC,QAAQ,CAACC,MAAM,CAACZ,MAAMR,WAAa,EAAA;AAAEgB,gBAAAA;AAAK,aAAA,CAAA;AACrE,SAAA;QAEA,MAAMK,aAAAA,CAAAA,CAAcb,IAAI,EAAEL,GAAG,EAAA;AAC3B,YAAA,MAAMa,OAAOd,qBAAsBC,CAAAA,GAAAA,CAAAA;YAEnC,OAAOc,MAAAA,CAAOC,UAAU,CAACC,QAAQ,CAACG,KAAK,CAACd,MAAMR,WAAa,EAAA;AAAEgB,gBAAAA;AAAK,aAAA,CAAA;AACpE,SAAA;AAEA,QAAA,MAAMO,eAAcpB,GAAG,EAAA;AACrB,YAAA,MAAMa,OAAOd,qBAAsBC,CAAAA,GAAAA,CAAAA;YAEnC,OAAOc,MAAAA,CAAOC,UAAU,CAACC,QAAQ,CAACK,KAAK,CAACrB,GAAAA,CAAIqB,KAAK,EAAExB,WAAa,EAAA;AAAEgB,gBAAAA;AAAK,aAAA,CAAA;AACzE,SAAA;AAEA,QAAA,MAAMS,eAActB,GAAG,EAAA;AACrB,YAAA,MAAMa,OAAOd,qBAAsBC,CAAAA,GAAAA,CAAAA;YAEnC,OAAOc,MAAAA,CAAOC,UAAU,CAACQ,QAAQ,CAACF,KAAK,CAACrB,GAAAA,CAAIqB,KAAK,EAAExB,WAAa,EAAA;AAAEgB,gBAAAA;AAAK,aAAA,CAAA;AACzE,SAAA;QAEA,MAAMW,aAAAA,CAAAA,CAAcnB,IAAI,EAAEL,GAAG,EAAA;AAC3B,YAAA,MAAMa,OAAOd,qBAAsBC,CAAAA,GAAAA,CAAAA;YAEnC,OAAOc,MAAAA,CAAOC,UAAU,CAACQ,QAAQ,CAACJ,KAAK,CAACd,MAAMR,WAAa,EAAA;AAAEgB,gBAAAA;AAAK,aAAA,CAAA;AACpE;AACF,KAAA;IAEA,IAAIY,IAAAA;AAEJ,IAAA,IAAI7B,aAAaC,WAAc,CAAA,EAAA;AAC7B4B,QAAAA,IAAAA,GAAOC,0BAA2B,CAAA;AAAE7B,YAAAA;AAAY,SAAA,CAAA;KAC3C,MAAA;AACL4B,QAAAA,IAAAA,GAAOE,8BAA+B,CAAA;AAAE9B,YAAAA;AAAY,SAAA,CAAA;AACtD;AAEA,IAAA,OAAO+B,OAAOC,MAAM,CAACD,MAAOE,CAAAA,MAAM,CAAC3B,KAAQsB,CAAAA,EAAAA,IAAAA,CAAAA;AAC7C;;;;"}
1
+ {"version":3,"file":"index.mjs","sources":["../../../src/core-api/controller/index.ts"],"sourcesContent":["import { prop } from 'lodash/fp';\nimport type Koa from 'koa';\nimport { contentTypes as contentTypeUtils } from '@strapi/utils';\nimport type { Core, Struct } from '@strapi/types';\n\nimport { transformResponse } from './transform';\nimport { createSingleTypeController } from './single-type';\nimport { createCollectionTypeController } from './collection-type';\nimport requestCtx from '../../services/request-context';\n\nconst isSingleType = (\n contentType: Struct.ContentTypeSchema\n): contentType is Struct.SingleTypeSchema => contentTypeUtils.isSingleType(contentType);\n\nconst getAuthFromKoaContext = (ctx: Koa.Context) => prop('state.auth', ctx) ?? {};\n\nfunction createController<T extends Struct.SingleTypeSchema | Struct.CollectionTypeSchema>(opts: {\n contentType: T;\n}): T extends Struct.SingleTypeSchema\n ? Core.CoreAPI.Controller.SingleType\n : Core.CoreAPI.Controller.CollectionType;\nfunction createController({\n contentType,\n}: {\n contentType: Struct.SingleTypeSchema | Struct.CollectionTypeSchema;\n}) {\n // TODO: replace with Base class + SingleType and CollectionType classes\n\n const proto: Core.CoreAPI.Controller.Base = {\n transformResponse(data, meta) {\n const ctx = requestCtx.get();\n return transformResponse(data, meta, {\n contentType,\n useJsonAPIFormat: ctx?.headers?.['strapi-response-format'] === 'v4',\n encodeSourceMaps: ctx?.headers?.['strapi-encode-source-maps'] === 'true',\n });\n },\n\n async sanitizeOutput(data, ctx) {\n const auth = getAuthFromKoaContext(ctx);\n\n return strapi.contentAPI.sanitize.output(data, contentType, { auth });\n },\n\n async sanitizeInput(data, ctx) {\n const auth = getAuthFromKoaContext(ctx);\n\n return strapi.contentAPI.sanitize.input(data, contentType, { auth });\n },\n\n async sanitizeQuery(ctx) {\n const auth = getAuthFromKoaContext(ctx);\n\n return strapi.contentAPI.sanitize.query(ctx.query, contentType, { auth });\n },\n\n async validateQuery(ctx) {\n const auth = getAuthFromKoaContext(ctx);\n\n return strapi.contentAPI.validate.query(ctx.query, contentType, { auth });\n },\n\n async validateInput(data, ctx) {\n const auth = getAuthFromKoaContext(ctx);\n\n return strapi.contentAPI.validate.input(data, contentType, { auth });\n },\n };\n\n let ctrl;\n\n if (isSingleType(contentType)) {\n ctrl = createSingleTypeController({ contentType });\n } else {\n ctrl = createCollectionTypeController({ contentType });\n }\n\n return Object.assign(Object.create(proto), ctrl);\n}\n\nexport { createController };\n"],"names":["isSingleType","contentType","contentTypeUtils","getAuthFromKoaContext","ctx","prop","createController","proto","transformResponse","data","meta","requestCtx","get","useJsonAPIFormat","headers","encodeSourceMaps","sanitizeOutput","auth","strapi","contentAPI","sanitize","output","sanitizeInput","input","sanitizeQuery","query","validateQuery","validate","validateInput","ctrl","createSingleTypeController","createCollectionTypeController","Object","assign","create"],"mappings":";;;;;;;AAUA,MAAMA,YAAe,GAAA,CACnBC,WAC2CC,GAAAA,YAAAA,CAAiBF,YAAY,CAACC,WAAAA,CAAAA;AAE3E,MAAME,wBAAwB,CAACC,GAAAA,GAAqBC,IAAK,CAAA,YAAA,EAAcD,QAAQ,EAAC;AAOhF,SAASE,gBAAAA,CAAiB,EACxBL,WAAW,EAGZ,EAAA;;AAGC,IAAA,MAAMM,KAAsC,GAAA;QAC1CC,iBAAkBC,CAAAA,CAAAA,IAAI,EAAEC,IAAI,EAAA;YAC1B,MAAMN,GAAAA,GAAMO,WAAWC,GAAG,EAAA;YAC1B,OAAOJ,iBAAAA,CAAkBC,MAAMC,IAAM,EAAA;AACnCT,gBAAAA,WAAAA;AACAY,gBAAAA,gBAAAA,EAAkBT,GAAKU,EAAAA,OAAAA,GAAU,wBAAA,CAAyB,KAAK,IAAA;AAC/DC,gBAAAA,gBAAAA,EAAkBX,GAAKU,EAAAA,OAAAA,GAAU,2BAAA,CAA4B,KAAK;AACpE,aAAA,CAAA;AACF,SAAA;QAEA,MAAME,cAAAA,CAAAA,CAAeP,IAAI,EAAEL,GAAG,EAAA;AAC5B,YAAA,MAAMa,OAAOd,qBAAsBC,CAAAA,GAAAA,CAAAA;YAEnC,OAAOc,MAAAA,CAAOC,UAAU,CAACC,QAAQ,CAACC,MAAM,CAACZ,MAAMR,WAAa,EAAA;AAAEgB,gBAAAA;AAAK,aAAA,CAAA;AACrE,SAAA;QAEA,MAAMK,aAAAA,CAAAA,CAAcb,IAAI,EAAEL,GAAG,EAAA;AAC3B,YAAA,MAAMa,OAAOd,qBAAsBC,CAAAA,GAAAA,CAAAA;YAEnC,OAAOc,MAAAA,CAAOC,UAAU,CAACC,QAAQ,CAACG,KAAK,CAACd,MAAMR,WAAa,EAAA;AAAEgB,gBAAAA;AAAK,aAAA,CAAA;AACpE,SAAA;AAEA,QAAA,MAAMO,eAAcpB,GAAG,EAAA;AACrB,YAAA,MAAMa,OAAOd,qBAAsBC,CAAAA,GAAAA,CAAAA;YAEnC,OAAOc,MAAAA,CAAOC,UAAU,CAACC,QAAQ,CAACK,KAAK,CAACrB,GAAAA,CAAIqB,KAAK,EAAExB,WAAa,EAAA;AAAEgB,gBAAAA;AAAK,aAAA,CAAA;AACzE,SAAA;AAEA,QAAA,MAAMS,eAActB,GAAG,EAAA;AACrB,YAAA,MAAMa,OAAOd,qBAAsBC,CAAAA,GAAAA,CAAAA;YAEnC,OAAOc,MAAAA,CAAOC,UAAU,CAACQ,QAAQ,CAACF,KAAK,CAACrB,GAAAA,CAAIqB,KAAK,EAAExB,WAAa,EAAA;AAAEgB,gBAAAA;AAAK,aAAA,CAAA;AACzE,SAAA;QAEA,MAAMW,aAAAA,CAAAA,CAAcnB,IAAI,EAAEL,GAAG,EAAA;AAC3B,YAAA,MAAMa,OAAOd,qBAAsBC,CAAAA,GAAAA,CAAAA;YAEnC,OAAOc,MAAAA,CAAOC,UAAU,CAACQ,QAAQ,CAACJ,KAAK,CAACd,MAAMR,WAAa,EAAA;AAAEgB,gBAAAA;AAAK,aAAA,CAAA;AACpE;AACF,KAAA;IAEA,IAAIY,IAAAA;AAEJ,IAAA,IAAI7B,aAAaC,WAAc,CAAA,EAAA;AAC7B4B,QAAAA,IAAAA,GAAOC,0BAA2B,CAAA;AAAE7B,YAAAA;AAAY,SAAA,CAAA;KAC3C,MAAA;AACL4B,QAAAA,IAAAA,GAAOE,8BAA+B,CAAA;AAAE9B,YAAAA;AAAY,SAAA,CAAA;AACtD;AAEA,IAAA,OAAO+B,OAAOC,MAAM,CAACD,MAAOE,CAAAA,MAAM,CAAC3B,KAAQsB,CAAAA,EAAAA,IAAAA,CAAAA;AAC7C;;;;"}
@@ -23,7 +23,7 @@ const transformResponse = async (resource, meta = {}, opts = {
23
23
  const applyJsonApiFormat = async (data)=>opts.useJsonAPIFormat ? transformEntry(data, opts?.contentType) : data;
24
24
  const applySourceMapEncoding = async (data)=>opts.encodeSourceMaps && opts.contentType ? strapi.get('content-source-maps').encodeSourceMaps({
25
25
  data,
26
- contentType: opts.contentType
26
+ schema: opts.contentType
27
27
  }) : data;
28
28
  // Process data through transformation pipeline
29
29
  const data = await strapiUtils.async.pipe(applyJsonApiFormat, applySourceMapEncoding)(resource);
@@ -1 +1 @@
1
- {"version":3,"file":"transform.js","sources":["../../../src/core-api/controller/transform.ts"],"sourcesContent":["import { isNil, isPlainObject } from 'lodash/fp';\nimport type { UID, Struct, Data } from '@strapi/types';\nimport { async } from '@strapi/utils';\n\ntype TransformedEntry = {\n id: string;\n documentId?: Data.DocumentID | null;\n attributes: Record<string, unknown>;\n};\n\ntype TransformedComponent = {\n id: string;\n [key: string]: unknown;\n};\n\ntype Entry = {\n id: string;\n documentId: Data.DocumentID | null;\n [key: string]: Entry | Entry[] | string | number | null | boolean | Date;\n};\n\nfunction isEntry(property: unknown): property is Entry | Entry[] {\n return property === null || isPlainObject(property) || Array.isArray(property);\n}\n\nfunction isDZEntries(property: unknown): property is (Entry & { __component: UID.Component })[] {\n return Array.isArray(property);\n}\n\ninterface TransformOptions {\n contentType?: Struct.ContentTypeSchema | Struct.ComponentSchema;\n /**\n * @deprecated this option is deprecated and will be removed in the next major version\n */\n useJsonAPIFormat?: boolean;\n encodeSourceMaps?: boolean;\n}\n\nconst transformResponse = async (\n resource: any,\n meta: unknown = {},\n opts: TransformOptions = {\n useJsonAPIFormat: false,\n encodeSourceMaps: false,\n }\n) => {\n if (isNil(resource)) {\n return resource;\n }\n\n if (!isPlainObject(resource) && !Array.isArray(resource)) {\n throw new Error('Entry must be an object or an array of objects');\n }\n\n // Transform pipeline functions\n const applyJsonApiFormat = async (data: any) =>\n opts.useJsonAPIFormat ? transformEntry(data, opts?.contentType) : data;\n\n const applySourceMapEncoding = async (data: any) =>\n opts.encodeSourceMaps && opts.contentType\n ? strapi.get('content-source-maps').encodeSourceMaps({ data, contentType: opts.contentType })\n : data;\n\n // Process data through transformation pipeline\n const data = await async.pipe(applyJsonApiFormat, applySourceMapEncoding)(resource);\n\n return {\n data,\n meta,\n };\n};\n\nfunction transformComponent<T extends Entry | Entry[] | null>(\n data: T,\n component: Struct.ComponentSchema\n): T extends Entry[] ? TransformedComponent[] : T extends Entry ? TransformedComponent : null;\nfunction transformComponent(\n data: Entry | Entry[] | null,\n component: Struct.ComponentSchema\n): TransformedComponent | TransformedComponent[] | null {\n if (Array.isArray(data)) {\n return data.map((datum) => transformComponent(datum, component));\n }\n\n const res = transformEntry(data, component);\n\n if (isNil(res)) {\n return res;\n }\n\n const { id, attributes } = res;\n return { id, ...attributes };\n}\n\nfunction transformEntry<T extends Entry | Entry[] | null>(\n entry: T,\n type?: Struct.Schema\n): T extends Entry[] ? TransformedEntry[] : T extends Entry ? TransformedEntry : null;\nfunction transformEntry(\n entry: Entry | Entry[] | null,\n type?: Struct.Schema\n): TransformedEntry | TransformedEntry[] | null {\n if (isNil(entry)) {\n return entry;\n }\n\n if (Array.isArray(entry)) {\n return entry.map((singleEntry) => transformEntry(singleEntry, type));\n }\n\n if (!isPlainObject(entry)) {\n throw new Error('Entry must be an object');\n }\n\n const { id, documentId, ...properties } = entry;\n\n const attributeValues: Record<string, unknown> = {};\n\n for (const key of Object.keys(properties)) {\n const property = properties[key];\n const attribute = type && type.attributes[key];\n\n if (attribute && attribute.type === 'relation' && isEntry(property) && 'target' in attribute) {\n const data = transformEntry(property, strapi.contentType(attribute.target));\n\n attributeValues[key] = { data };\n } else if (attribute && attribute.type === 'component' && isEntry(property)) {\n attributeValues[key] = transformComponent(property, strapi.components[attribute.component]);\n } else if (attribute && attribute.type === 'dynamiczone' && isDZEntries(property)) {\n if (isNil(property)) {\n attributeValues[key] = property;\n }\n\n attributeValues[key] = property.map((subProperty) => {\n return transformComponent(subProperty, strapi.components[subProperty.__component]);\n });\n } else if (attribute && attribute.type === 'media' && isEntry(property)) {\n const data = transformEntry(property, strapi.contentType('plugin::upload.file'));\n\n attributeValues[key] = { data };\n } else {\n attributeValues[key] = property;\n }\n }\n\n return {\n id,\n documentId,\n attributes: attributeValues,\n };\n}\n\nexport { transformResponse };\n"],"names":["isEntry","property","isPlainObject","Array","isArray","isDZEntries","transformResponse","resource","meta","opts","useJsonAPIFormat","encodeSourceMaps","isNil","Error","applyJsonApiFormat","data","transformEntry","contentType","applySourceMapEncoding","strapi","get","async","pipe","transformComponent","component","map","datum","res","id","attributes","entry","type","singleEntry","documentId","properties","attributeValues","key","Object","keys","attribute","target","components","subProperty","__component"],"mappings":"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"}
1
+ {"version":3,"file":"transform.js","sources":["../../../src/core-api/controller/transform.ts"],"sourcesContent":["import { isNil, isPlainObject } from 'lodash/fp';\nimport type { UID, Struct, Data } from '@strapi/types';\nimport { async } from '@strapi/utils';\n\ntype TransformedEntry = {\n id: string;\n documentId?: Data.DocumentID | null;\n attributes: Record<string, unknown>;\n};\n\ntype TransformedComponent = {\n id: string;\n [key: string]: unknown;\n};\n\ntype Entry = {\n id: string;\n documentId: Data.DocumentID | null;\n [key: string]: Entry | Entry[] | string | number | null | boolean | Date;\n};\n\nfunction isEntry(property: unknown): property is Entry | Entry[] {\n return property === null || isPlainObject(property) || Array.isArray(property);\n}\n\nfunction isDZEntries(property: unknown): property is (Entry & { __component: UID.Component })[] {\n return Array.isArray(property);\n}\n\ninterface TransformOptions {\n contentType?: Struct.ContentTypeSchema | Struct.ComponentSchema;\n /**\n * @deprecated this option is deprecated and will be removed in the next major version\n */\n useJsonAPIFormat?: boolean;\n encodeSourceMaps?: boolean;\n}\n\nconst transformResponse = async (\n resource: any,\n meta: unknown = {},\n opts: TransformOptions = {\n useJsonAPIFormat: false,\n encodeSourceMaps: false,\n }\n) => {\n if (isNil(resource)) {\n return resource;\n }\n\n if (!isPlainObject(resource) && !Array.isArray(resource)) {\n throw new Error('Entry must be an object or an array of objects');\n }\n\n // Transform pipeline functions\n const applyJsonApiFormat = async (data: any) =>\n opts.useJsonAPIFormat ? transformEntry(data, opts?.contentType) : data;\n\n const applySourceMapEncoding = async (data: any) =>\n opts.encodeSourceMaps && opts.contentType\n ? strapi.get('content-source-maps').encodeSourceMaps({ data, schema: opts.contentType })\n : data;\n\n // Process data through transformation pipeline\n const data = await async.pipe(applyJsonApiFormat, applySourceMapEncoding)(resource);\n\n return {\n data,\n meta,\n };\n};\n\nfunction transformComponent<T extends Entry | Entry[] | null>(\n data: T,\n component: Struct.ComponentSchema\n): T extends Entry[] ? TransformedComponent[] : T extends Entry ? TransformedComponent : null;\nfunction transformComponent(\n data: Entry | Entry[] | null,\n component: Struct.ComponentSchema\n): TransformedComponent | TransformedComponent[] | null {\n if (Array.isArray(data)) {\n return data.map((datum) => transformComponent(datum, component));\n }\n\n const res = transformEntry(data, component);\n\n if (isNil(res)) {\n return res;\n }\n\n const { id, attributes } = res;\n return { id, ...attributes };\n}\n\nfunction transformEntry<T extends Entry | Entry[] | null>(\n entry: T,\n type?: Struct.Schema\n): T extends Entry[] ? TransformedEntry[] : T extends Entry ? TransformedEntry : null;\nfunction transformEntry(\n entry: Entry | Entry[] | null,\n type?: Struct.Schema\n): TransformedEntry | TransformedEntry[] | null {\n if (isNil(entry)) {\n return entry;\n }\n\n if (Array.isArray(entry)) {\n return entry.map((singleEntry) => transformEntry(singleEntry, type));\n }\n\n if (!isPlainObject(entry)) {\n throw new Error('Entry must be an object');\n }\n\n const { id, documentId, ...properties } = entry;\n\n const attributeValues: Record<string, unknown> = {};\n\n for (const key of Object.keys(properties)) {\n const property = properties[key];\n const attribute = type && type.attributes[key];\n\n if (attribute && attribute.type === 'relation' && isEntry(property) && 'target' in attribute) {\n const data = transformEntry(property, strapi.contentType(attribute.target));\n\n attributeValues[key] = { data };\n } else if (attribute && attribute.type === 'component' && isEntry(property)) {\n attributeValues[key] = transformComponent(property, strapi.components[attribute.component]);\n } else if (attribute && attribute.type === 'dynamiczone' && isDZEntries(property)) {\n if (isNil(property)) {\n attributeValues[key] = property;\n }\n\n attributeValues[key] = property.map((subProperty) => {\n return transformComponent(subProperty, strapi.components[subProperty.__component]);\n });\n } else if (attribute && attribute.type === 'media' && isEntry(property)) {\n const data = transformEntry(property, strapi.contentType('plugin::upload.file'));\n\n attributeValues[key] = { data };\n } else {\n attributeValues[key] = property;\n }\n }\n\n return {\n id,\n documentId,\n attributes: attributeValues,\n };\n}\n\nexport { transformResponse };\n"],"names":["isEntry","property","isPlainObject","Array","isArray","isDZEntries","transformResponse","resource","meta","opts","useJsonAPIFormat","encodeSourceMaps","isNil","Error","applyJsonApiFormat","data","transformEntry","contentType","applySourceMapEncoding","strapi","get","schema","async","pipe","transformComponent","component","map","datum","res","id","attributes","entry","type","singleEntry","documentId","properties","attributeValues","key","Object","keys","attribute","target","components","subProperty","__component"],"mappings":"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"}
@@ -21,7 +21,7 @@ const transformResponse = async (resource, meta = {}, opts = {
21
21
  const applyJsonApiFormat = async (data)=>opts.useJsonAPIFormat ? transformEntry(data, opts?.contentType) : data;
22
22
  const applySourceMapEncoding = async (data)=>opts.encodeSourceMaps && opts.contentType ? strapi.get('content-source-maps').encodeSourceMaps({
23
23
  data,
24
- contentType: opts.contentType
24
+ schema: opts.contentType
25
25
  }) : data;
26
26
  // Process data through transformation pipeline
27
27
  const data = await async.pipe(applyJsonApiFormat, applySourceMapEncoding)(resource);
@@ -1 +1 @@
1
- {"version":3,"file":"transform.mjs","sources":["../../../src/core-api/controller/transform.ts"],"sourcesContent":["import { isNil, isPlainObject } from 'lodash/fp';\nimport type { UID, Struct, Data } from '@strapi/types';\nimport { async } from '@strapi/utils';\n\ntype TransformedEntry = {\n id: string;\n documentId?: Data.DocumentID | null;\n attributes: Record<string, unknown>;\n};\n\ntype TransformedComponent = {\n id: string;\n [key: string]: unknown;\n};\n\ntype Entry = {\n id: string;\n documentId: Data.DocumentID | null;\n [key: string]: Entry | Entry[] | string | number | null | boolean | Date;\n};\n\nfunction isEntry(property: unknown): property is Entry | Entry[] {\n return property === null || isPlainObject(property) || Array.isArray(property);\n}\n\nfunction isDZEntries(property: unknown): property is (Entry & { __component: UID.Component })[] {\n return Array.isArray(property);\n}\n\ninterface TransformOptions {\n contentType?: Struct.ContentTypeSchema | Struct.ComponentSchema;\n /**\n * @deprecated this option is deprecated and will be removed in the next major version\n */\n useJsonAPIFormat?: boolean;\n encodeSourceMaps?: boolean;\n}\n\nconst transformResponse = async (\n resource: any,\n meta: unknown = {},\n opts: TransformOptions = {\n useJsonAPIFormat: false,\n encodeSourceMaps: false,\n }\n) => {\n if (isNil(resource)) {\n return resource;\n }\n\n if (!isPlainObject(resource) && !Array.isArray(resource)) {\n throw new Error('Entry must be an object or an array of objects');\n }\n\n // Transform pipeline functions\n const applyJsonApiFormat = async (data: any) =>\n opts.useJsonAPIFormat ? transformEntry(data, opts?.contentType) : data;\n\n const applySourceMapEncoding = async (data: any) =>\n opts.encodeSourceMaps && opts.contentType\n ? strapi.get('content-source-maps').encodeSourceMaps({ data, contentType: opts.contentType })\n : data;\n\n // Process data through transformation pipeline\n const data = await async.pipe(applyJsonApiFormat, applySourceMapEncoding)(resource);\n\n return {\n data,\n meta,\n };\n};\n\nfunction transformComponent<T extends Entry | Entry[] | null>(\n data: T,\n component: Struct.ComponentSchema\n): T extends Entry[] ? TransformedComponent[] : T extends Entry ? TransformedComponent : null;\nfunction transformComponent(\n data: Entry | Entry[] | null,\n component: Struct.ComponentSchema\n): TransformedComponent | TransformedComponent[] | null {\n if (Array.isArray(data)) {\n return data.map((datum) => transformComponent(datum, component));\n }\n\n const res = transformEntry(data, component);\n\n if (isNil(res)) {\n return res;\n }\n\n const { id, attributes } = res;\n return { id, ...attributes };\n}\n\nfunction transformEntry<T extends Entry | Entry[] | null>(\n entry: T,\n type?: Struct.Schema\n): T extends Entry[] ? TransformedEntry[] : T extends Entry ? TransformedEntry : null;\nfunction transformEntry(\n entry: Entry | Entry[] | null,\n type?: Struct.Schema\n): TransformedEntry | TransformedEntry[] | null {\n if (isNil(entry)) {\n return entry;\n }\n\n if (Array.isArray(entry)) {\n return entry.map((singleEntry) => transformEntry(singleEntry, type));\n }\n\n if (!isPlainObject(entry)) {\n throw new Error('Entry must be an object');\n }\n\n const { id, documentId, ...properties } = entry;\n\n const attributeValues: Record<string, unknown> = {};\n\n for (const key of Object.keys(properties)) {\n const property = properties[key];\n const attribute = type && type.attributes[key];\n\n if (attribute && attribute.type === 'relation' && isEntry(property) && 'target' in attribute) {\n const data = transformEntry(property, strapi.contentType(attribute.target));\n\n attributeValues[key] = { data };\n } else if (attribute && attribute.type === 'component' && isEntry(property)) {\n attributeValues[key] = transformComponent(property, strapi.components[attribute.component]);\n } else if (attribute && attribute.type === 'dynamiczone' && isDZEntries(property)) {\n if (isNil(property)) {\n attributeValues[key] = property;\n }\n\n attributeValues[key] = property.map((subProperty) => {\n return transformComponent(subProperty, strapi.components[subProperty.__component]);\n });\n } else if (attribute && attribute.type === 'media' && isEntry(property)) {\n const data = transformEntry(property, strapi.contentType('plugin::upload.file'));\n\n attributeValues[key] = { data };\n } else {\n attributeValues[key] = property;\n }\n }\n\n return {\n id,\n documentId,\n attributes: attributeValues,\n };\n}\n\nexport { transformResponse };\n"],"names":["isEntry","property","isPlainObject","Array","isArray","isDZEntries","transformResponse","resource","meta","opts","useJsonAPIFormat","encodeSourceMaps","isNil","Error","applyJsonApiFormat","data","transformEntry","contentType","applySourceMapEncoding","strapi","get","async","pipe","transformComponent","component","map","datum","res","id","attributes","entry","type","singleEntry","documentId","properties","attributeValues","key","Object","keys","attribute","target","components","subProperty","__component"],"mappings":"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"}
1
+ {"version":3,"file":"transform.mjs","sources":["../../../src/core-api/controller/transform.ts"],"sourcesContent":["import { isNil, isPlainObject } from 'lodash/fp';\nimport type { UID, Struct, Data } from '@strapi/types';\nimport { async } from '@strapi/utils';\n\ntype TransformedEntry = {\n id: string;\n documentId?: Data.DocumentID | null;\n attributes: Record<string, unknown>;\n};\n\ntype TransformedComponent = {\n id: string;\n [key: string]: unknown;\n};\n\ntype Entry = {\n id: string;\n documentId: Data.DocumentID | null;\n [key: string]: Entry | Entry[] | string | number | null | boolean | Date;\n};\n\nfunction isEntry(property: unknown): property is Entry | Entry[] {\n return property === null || isPlainObject(property) || Array.isArray(property);\n}\n\nfunction isDZEntries(property: unknown): property is (Entry & { __component: UID.Component })[] {\n return Array.isArray(property);\n}\n\ninterface TransformOptions {\n contentType?: Struct.ContentTypeSchema | Struct.ComponentSchema;\n /**\n * @deprecated this option is deprecated and will be removed in the next major version\n */\n useJsonAPIFormat?: boolean;\n encodeSourceMaps?: boolean;\n}\n\nconst transformResponse = async (\n resource: any,\n meta: unknown = {},\n opts: TransformOptions = {\n useJsonAPIFormat: false,\n encodeSourceMaps: false,\n }\n) => {\n if (isNil(resource)) {\n return resource;\n }\n\n if (!isPlainObject(resource) && !Array.isArray(resource)) {\n throw new Error('Entry must be an object or an array of objects');\n }\n\n // Transform pipeline functions\n const applyJsonApiFormat = async (data: any) =>\n opts.useJsonAPIFormat ? transformEntry(data, opts?.contentType) : data;\n\n const applySourceMapEncoding = async (data: any) =>\n opts.encodeSourceMaps && opts.contentType\n ? strapi.get('content-source-maps').encodeSourceMaps({ data, schema: opts.contentType })\n : data;\n\n // Process data through transformation pipeline\n const data = await async.pipe(applyJsonApiFormat, applySourceMapEncoding)(resource);\n\n return {\n data,\n meta,\n };\n};\n\nfunction transformComponent<T extends Entry | Entry[] | null>(\n data: T,\n component: Struct.ComponentSchema\n): T extends Entry[] ? TransformedComponent[] : T extends Entry ? TransformedComponent : null;\nfunction transformComponent(\n data: Entry | Entry[] | null,\n component: Struct.ComponentSchema\n): TransformedComponent | TransformedComponent[] | null {\n if (Array.isArray(data)) {\n return data.map((datum) => transformComponent(datum, component));\n }\n\n const res = transformEntry(data, component);\n\n if (isNil(res)) {\n return res;\n }\n\n const { id, attributes } = res;\n return { id, ...attributes };\n}\n\nfunction transformEntry<T extends Entry | Entry[] | null>(\n entry: T,\n type?: Struct.Schema\n): T extends Entry[] ? TransformedEntry[] : T extends Entry ? TransformedEntry : null;\nfunction transformEntry(\n entry: Entry | Entry[] | null,\n type?: Struct.Schema\n): TransformedEntry | TransformedEntry[] | null {\n if (isNil(entry)) {\n return entry;\n }\n\n if (Array.isArray(entry)) {\n return entry.map((singleEntry) => transformEntry(singleEntry, type));\n }\n\n if (!isPlainObject(entry)) {\n throw new Error('Entry must be an object');\n }\n\n const { id, documentId, ...properties } = entry;\n\n const attributeValues: Record<string, unknown> = {};\n\n for (const key of Object.keys(properties)) {\n const property = properties[key];\n const attribute = type && type.attributes[key];\n\n if (attribute && attribute.type === 'relation' && isEntry(property) && 'target' in attribute) {\n const data = transformEntry(property, strapi.contentType(attribute.target));\n\n attributeValues[key] = { data };\n } else if (attribute && attribute.type === 'component' && isEntry(property)) {\n attributeValues[key] = transformComponent(property, strapi.components[attribute.component]);\n } else if (attribute && attribute.type === 'dynamiczone' && isDZEntries(property)) {\n if (isNil(property)) {\n attributeValues[key] = property;\n }\n\n attributeValues[key] = property.map((subProperty) => {\n return transformComponent(subProperty, strapi.components[subProperty.__component]);\n });\n } else if (attribute && attribute.type === 'media' && isEntry(property)) {\n const data = transformEntry(property, strapi.contentType('plugin::upload.file'));\n\n attributeValues[key] = { data };\n } else {\n attributeValues[key] = property;\n }\n }\n\n return {\n id,\n documentId,\n attributes: attributeValues,\n };\n}\n\nexport { transformResponse };\n"],"names":["isEntry","property","isPlainObject","Array","isArray","isDZEntries","transformResponse","resource","meta","opts","useJsonAPIFormat","encodeSourceMaps","isNil","Error","applyJsonApiFormat","data","transformEntry","contentType","applySourceMapEncoding","strapi","get","schema","async","pipe","transformComponent","component","map","datum","res","id","attributes","entry","type","singleEntry","documentId","properties","attributeValues","key","Object","keys","attribute","target","components","subProperty","__component"],"mappings":"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"}
@@ -3,7 +3,7 @@
3
3
  Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
5
  var name = "@strapi/core";
6
- var version = "0.0.0-experimental.838b114ef86c9081f990c3b46f5843a41088ec64";
6
+ var version = "0.0.0-experimental.8478bb287dfba93afd007cad7697c0f88853a2d8";
7
7
  var description = "Core of Strapi";
8
8
  var homepage = "https://strapi.io";
9
9
  var bugs = {
@@ -59,14 +59,14 @@ var dependencies = {
59
59
  "@koa/cors": "5.0.0",
60
60
  "@koa/router": "12.0.2",
61
61
  "@paralleldrive/cuid2": "2.2.2",
62
- "@strapi/admin": "0.0.0-experimental.838b114ef86c9081f990c3b46f5843a41088ec64",
63
- "@strapi/database": "0.0.0-experimental.838b114ef86c9081f990c3b46f5843a41088ec64",
64
- "@strapi/generators": "0.0.0-experimental.838b114ef86c9081f990c3b46f5843a41088ec64",
65
- "@strapi/logger": "0.0.0-experimental.838b114ef86c9081f990c3b46f5843a41088ec64",
66
- "@strapi/permissions": "0.0.0-experimental.838b114ef86c9081f990c3b46f5843a41088ec64",
67
- "@strapi/types": "0.0.0-experimental.838b114ef86c9081f990c3b46f5843a41088ec64",
68
- "@strapi/typescript-utils": "0.0.0-experimental.838b114ef86c9081f990c3b46f5843a41088ec64",
69
- "@strapi/utils": "0.0.0-experimental.838b114ef86c9081f990c3b46f5843a41088ec64",
62
+ "@strapi/admin": "0.0.0-experimental.8478bb287dfba93afd007cad7697c0f88853a2d8",
63
+ "@strapi/database": "0.0.0-experimental.8478bb287dfba93afd007cad7697c0f88853a2d8",
64
+ "@strapi/generators": "0.0.0-experimental.8478bb287dfba93afd007cad7697c0f88853a2d8",
65
+ "@strapi/logger": "0.0.0-experimental.8478bb287dfba93afd007cad7697c0f88853a2d8",
66
+ "@strapi/permissions": "0.0.0-experimental.8478bb287dfba93afd007cad7697c0f88853a2d8",
67
+ "@strapi/types": "0.0.0-experimental.8478bb287dfba93afd007cad7697c0f88853a2d8",
68
+ "@strapi/typescript-utils": "0.0.0-experimental.8478bb287dfba93afd007cad7697c0f88853a2d8",
69
+ "@strapi/utils": "0.0.0-experimental.8478bb287dfba93afd007cad7697c0f88853a2d8",
70
70
  "@vercel/stega": "0.1.2",
71
71
  bcryptjs: "2.4.3",
72
72
  boxen: "5.1.2",
@@ -133,9 +133,9 @@ var devDependencies = {
133
133
  "@types/node": "18.19.24",
134
134
  "@types/node-schedule": "2.1.7",
135
135
  "@types/statuses": "2.0.1",
136
- "eslint-config-custom": "0.0.0-experimental.838b114ef86c9081f990c3b46f5843a41088ec64",
136
+ "eslint-config-custom": "0.0.0-experimental.8478bb287dfba93afd007cad7697c0f88853a2d8",
137
137
  supertest: "6.3.3",
138
- tsconfig: "0.0.0-experimental.838b114ef86c9081f990c3b46f5843a41088ec64"
138
+ tsconfig: "0.0.0-experimental.8478bb287dfba93afd007cad7697c0f88853a2d8"
139
139
  };
140
140
  var engines = {
141
141
  node: ">=18.0.0 <=22.x.x",
@@ -1,5 +1,5 @@
1
1
  var name = "@strapi/core";
2
- var version = "0.0.0-experimental.838b114ef86c9081f990c3b46f5843a41088ec64";
2
+ var version = "0.0.0-experimental.8478bb287dfba93afd007cad7697c0f88853a2d8";
3
3
  var description = "Core of Strapi";
4
4
  var homepage = "https://strapi.io";
5
5
  var bugs = {
@@ -55,14 +55,14 @@ var dependencies = {
55
55
  "@koa/cors": "5.0.0",
56
56
  "@koa/router": "12.0.2",
57
57
  "@paralleldrive/cuid2": "2.2.2",
58
- "@strapi/admin": "0.0.0-experimental.838b114ef86c9081f990c3b46f5843a41088ec64",
59
- "@strapi/database": "0.0.0-experimental.838b114ef86c9081f990c3b46f5843a41088ec64",
60
- "@strapi/generators": "0.0.0-experimental.838b114ef86c9081f990c3b46f5843a41088ec64",
61
- "@strapi/logger": "0.0.0-experimental.838b114ef86c9081f990c3b46f5843a41088ec64",
62
- "@strapi/permissions": "0.0.0-experimental.838b114ef86c9081f990c3b46f5843a41088ec64",
63
- "@strapi/types": "0.0.0-experimental.838b114ef86c9081f990c3b46f5843a41088ec64",
64
- "@strapi/typescript-utils": "0.0.0-experimental.838b114ef86c9081f990c3b46f5843a41088ec64",
65
- "@strapi/utils": "0.0.0-experimental.838b114ef86c9081f990c3b46f5843a41088ec64",
58
+ "@strapi/admin": "0.0.0-experimental.8478bb287dfba93afd007cad7697c0f88853a2d8",
59
+ "@strapi/database": "0.0.0-experimental.8478bb287dfba93afd007cad7697c0f88853a2d8",
60
+ "@strapi/generators": "0.0.0-experimental.8478bb287dfba93afd007cad7697c0f88853a2d8",
61
+ "@strapi/logger": "0.0.0-experimental.8478bb287dfba93afd007cad7697c0f88853a2d8",
62
+ "@strapi/permissions": "0.0.0-experimental.8478bb287dfba93afd007cad7697c0f88853a2d8",
63
+ "@strapi/types": "0.0.0-experimental.8478bb287dfba93afd007cad7697c0f88853a2d8",
64
+ "@strapi/typescript-utils": "0.0.0-experimental.8478bb287dfba93afd007cad7697c0f88853a2d8",
65
+ "@strapi/utils": "0.0.0-experimental.8478bb287dfba93afd007cad7697c0f88853a2d8",
66
66
  "@vercel/stega": "0.1.2",
67
67
  bcryptjs: "2.4.3",
68
68
  boxen: "5.1.2",
@@ -129,9 +129,9 @@ var devDependencies = {
129
129
  "@types/node": "18.19.24",
130
130
  "@types/node-schedule": "2.1.7",
131
131
  "@types/statuses": "2.0.1",
132
- "eslint-config-custom": "0.0.0-experimental.838b114ef86c9081f990c3b46f5843a41088ec64",
132
+ "eslint-config-custom": "0.0.0-experimental.8478bb287dfba93afd007cad7697c0f88853a2d8",
133
133
  supertest: "6.3.3",
134
- tsconfig: "0.0.0-experimental.838b114ef86c9081f990c3b46f5843a41088ec64"
134
+ tsconfig: "0.0.0-experimental.8478bb287dfba93afd007cad7697c0f88853a2d8"
135
135
  };
136
136
  var engines = {
137
137
  node: ">=18.0.0 <=22.x.x",
@@ -47,7 +47,7 @@ declare const createContentAPI: (strapi: Core.Strapi) => {
47
47
  controllers: Record<string, string[]>;
48
48
  }>;
49
49
  };
50
- getRoutesMap: () => Promise<Record<string, Core.Route[]>>;
50
+ getRoutesMap: () => Promise<Record<string, unknown>>;
51
51
  sanitize: {
52
52
  input: sanitize.SanitizeFunc;
53
53
  output: sanitize.SanitizeFunc;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/services/content-api/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAEnD,OAAO,KAAK,EAAE,IAAI,EAAO,MAAM,eAAe,CAAC;AAgB/C;;GAEG;AACH,QAAA,MAAM,gBAAgB,WAAY,KAAK,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgF5C,CAAC;AAEF,eAAe,gBAAgB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/services/content-api/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAqC,MAAM,eAAe,CAAC;AAEtF,OAAO,KAAK,EAAE,IAAI,EAAO,MAAM,eAAe,CAAC;AAgB/C;;GAEG;AACH,QAAA,MAAM,gBAAgB,WAAY,KAAK,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgF5C,CAAC;AAEF,eAAe,gBAAgB,CAAC"}
@@ -49,7 +49,7 @@ const filterContentAPI = (route)=>route.info.type === 'content-api';
49
49
  path: `${apiPrefix}${route.path}`
50
50
  }));
51
51
  });
52
- return routesMap;
52
+ return strapiUtils.sanitizeRoutesMapForSerialization(routesMap);
53
53
  };
54
54
  const sanitizer = strapiUtils.sanitize.createAPISanitizers({
55
55
  getModel (uid) {
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../../src/services/content-api/index.ts"],"sourcesContent":["import _ from 'lodash';\nimport { sanitize, validate } from '@strapi/utils';\n\nimport type { Core, UID } from '@strapi/types';\n\nimport instantiatePermissionsUtilities from './permissions';\n\nconst transformRoutePrefixFor = (pluginName: string) => (route: Core.Route) => {\n const prefix = route.config && route.config.prefix;\n const path = prefix !== undefined ? `${prefix}${route.path}` : `/${pluginName}${route.path}`;\n\n return {\n ...route,\n path,\n };\n};\n\nconst filterContentAPI = (route: Core.Route) => route.info.type === 'content-api';\n\n/**\n * Create a content API container that holds logic, tools and utils. (eg: permissions, ...)\n */\nconst createContentAPI = (strapi: Core.Strapi) => {\n const getRoutesMap = async () => {\n const routesMap: Record<string, Core.Route[]> = {};\n\n _.forEach(strapi.apis, (api, apiName) => {\n const routes = _.flatMap(api.routes, (route) => {\n if ('routes' in route) {\n return route.routes;\n }\n\n return route;\n }).filter(filterContentAPI);\n\n if (routes.length === 0) {\n return;\n }\n\n const apiPrefix = strapi.config.get('api.rest.prefix');\n routesMap[`api::${apiName}`] = routes.map((route) => ({\n ...route,\n path: `${apiPrefix}${route.path}`,\n }));\n });\n\n _.forEach(strapi.plugins, (plugin, pluginName) => {\n const transformPrefix = transformRoutePrefixFor(pluginName);\n\n if (Array.isArray(plugin.routes)) {\n return plugin.routes.map(transformPrefix).filter(filterContentAPI);\n }\n\n const routes = _.flatMap(plugin.routes, (route) => route.routes.map(transformPrefix)).filter(\n filterContentAPI\n );\n\n if (routes.length === 0) {\n return;\n }\n\n const apiPrefix = strapi.config.get('api.rest.prefix');\n routesMap[`plugin::${pluginName}`] = routes.map((route) => ({\n ...route,\n path: `${apiPrefix}${route.path}`,\n }));\n });\n\n return routesMap;\n };\n\n const sanitizer = sanitize.createAPISanitizers({\n getModel(uid: string) {\n return strapi.getModel(uid as UID.Schema);\n },\n // NOTE: use lazy access to allow registration of sanitizers after the creation of the container\n get sanitizers() {\n return {\n input: strapi.sanitizers.get('content-api.input'),\n output: strapi.sanitizers.get('content-api.output'),\n };\n },\n });\n\n const validator = validate.createAPIValidators({\n getModel(uid: string) {\n return strapi.getModel(uid as UID.Schema);\n },\n // NOTE: use lazy access to allow registration of validators after the creation of the container\n get validators() {\n return {\n input: strapi.validators.get('content-api.input'),\n };\n },\n });\n\n return {\n permissions: instantiatePermissionsUtilities(strapi),\n getRoutesMap,\n sanitize: sanitizer,\n validate: validator,\n };\n};\n\nexport default createContentAPI;\n"],"names":["transformRoutePrefixFor","pluginName","route","prefix","config","path","undefined","filterContentAPI","info","type","createContentAPI","strapi","getRoutesMap","routesMap","_","forEach","apis","api","apiName","routes","flatMap","filter","length","apiPrefix","get","map","plugins","plugin","transformPrefix","Array","isArray","sanitizer","sanitize","createAPISanitizers","getModel","uid","sanitizers","input","output","validator","validate","createAPIValidators","validators","permissions","instantiatePermissionsUtilities"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../../../src/services/content-api/index.ts"],"sourcesContent":["import _ from 'lodash';\nimport { sanitize, validate, sanitizeRoutesMapForSerialization } from '@strapi/utils';\n\nimport type { Core, UID } from '@strapi/types';\n\nimport instantiatePermissionsUtilities from './permissions';\n\nconst transformRoutePrefixFor = (pluginName: string) => (route: Core.Route) => {\n const prefix = route.config && route.config.prefix;\n const path = prefix !== undefined ? `${prefix}${route.path}` : `/${pluginName}${route.path}`;\n\n return {\n ...route,\n path,\n };\n};\n\nconst filterContentAPI = (route: Core.Route) => route.info.type === 'content-api';\n\n/**\n * Create a content API container that holds logic, tools and utils. (eg: permissions, ...)\n */\nconst createContentAPI = (strapi: Core.Strapi) => {\n const getRoutesMap = async () => {\n const routesMap: Record<string, Core.Route[]> = {};\n\n _.forEach(strapi.apis, (api, apiName) => {\n const routes = _.flatMap(api.routes, (route) => {\n if ('routes' in route) {\n return route.routes;\n }\n\n return route;\n }).filter(filterContentAPI);\n\n if (routes.length === 0) {\n return;\n }\n\n const apiPrefix = strapi.config.get('api.rest.prefix');\n routesMap[`api::${apiName}`] = routes.map((route) => ({\n ...route,\n path: `${apiPrefix}${route.path}`,\n }));\n });\n\n _.forEach(strapi.plugins, (plugin, pluginName) => {\n const transformPrefix = transformRoutePrefixFor(pluginName);\n\n if (Array.isArray(plugin.routes)) {\n return plugin.routes.map(transformPrefix).filter(filterContentAPI);\n }\n\n const routes = _.flatMap(plugin.routes, (route) => route.routes.map(transformPrefix)).filter(\n filterContentAPI\n );\n\n if (routes.length === 0) {\n return;\n }\n\n const apiPrefix = strapi.config.get('api.rest.prefix');\n routesMap[`plugin::${pluginName}`] = routes.map((route) => ({\n ...route,\n path: `${apiPrefix}${route.path}`,\n }));\n });\n\n return sanitizeRoutesMapForSerialization(routesMap);\n };\n\n const sanitizer = sanitize.createAPISanitizers({\n getModel(uid: string) {\n return strapi.getModel(uid as UID.Schema);\n },\n // NOTE: use lazy access to allow registration of sanitizers after the creation of the container\n get sanitizers() {\n return {\n input: strapi.sanitizers.get('content-api.input'),\n output: strapi.sanitizers.get('content-api.output'),\n };\n },\n });\n\n const validator = validate.createAPIValidators({\n getModel(uid: string) {\n return strapi.getModel(uid as UID.Schema);\n },\n // NOTE: use lazy access to allow registration of validators after the creation of the container\n get validators() {\n return {\n input: strapi.validators.get('content-api.input'),\n };\n },\n });\n\n return {\n permissions: instantiatePermissionsUtilities(strapi),\n getRoutesMap,\n sanitize: sanitizer,\n validate: validator,\n };\n};\n\nexport default createContentAPI;\n"],"names":["transformRoutePrefixFor","pluginName","route","prefix","config","path","undefined","filterContentAPI","info","type","createContentAPI","strapi","getRoutesMap","routesMap","_","forEach","apis","api","apiName","routes","flatMap","filter","length","apiPrefix","get","map","plugins","plugin","transformPrefix","Array","isArray","sanitizeRoutesMapForSerialization","sanitizer","sanitize","createAPISanitizers","getModel","uid","sanitizers","input","output","validator","validate","createAPIValidators","validators","permissions","instantiatePermissionsUtilities"],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import _ from 'lodash';
2
- import { sanitize, validate } from '@strapi/utils';
2
+ import { sanitize, validate, sanitizeRoutesMapForSerialization } from '@strapi/utils';
3
3
  import instantiatePermissionsUtilities from './permissions/index.mjs';
4
4
 
5
5
  const transformRoutePrefixFor = (pluginName)=>(route)=>{
@@ -47,7 +47,7 @@ const filterContentAPI = (route)=>route.info.type === 'content-api';
47
47
  path: `${apiPrefix}${route.path}`
48
48
  }));
49
49
  });
50
- return routesMap;
50
+ return sanitizeRoutesMapForSerialization(routesMap);
51
51
  };
52
52
  const sanitizer = sanitize.createAPISanitizers({
53
53
  getModel (uid) {
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","sources":["../../../src/services/content-api/index.ts"],"sourcesContent":["import _ from 'lodash';\nimport { sanitize, validate } from '@strapi/utils';\n\nimport type { Core, UID } from '@strapi/types';\n\nimport instantiatePermissionsUtilities from './permissions';\n\nconst transformRoutePrefixFor = (pluginName: string) => (route: Core.Route) => {\n const prefix = route.config && route.config.prefix;\n const path = prefix !== undefined ? `${prefix}${route.path}` : `/${pluginName}${route.path}`;\n\n return {\n ...route,\n path,\n };\n};\n\nconst filterContentAPI = (route: Core.Route) => route.info.type === 'content-api';\n\n/**\n * Create a content API container that holds logic, tools and utils. (eg: permissions, ...)\n */\nconst createContentAPI = (strapi: Core.Strapi) => {\n const getRoutesMap = async () => {\n const routesMap: Record<string, Core.Route[]> = {};\n\n _.forEach(strapi.apis, (api, apiName) => {\n const routes = _.flatMap(api.routes, (route) => {\n if ('routes' in route) {\n return route.routes;\n }\n\n return route;\n }).filter(filterContentAPI);\n\n if (routes.length === 0) {\n return;\n }\n\n const apiPrefix = strapi.config.get('api.rest.prefix');\n routesMap[`api::${apiName}`] = routes.map((route) => ({\n ...route,\n path: `${apiPrefix}${route.path}`,\n }));\n });\n\n _.forEach(strapi.plugins, (plugin, pluginName) => {\n const transformPrefix = transformRoutePrefixFor(pluginName);\n\n if (Array.isArray(plugin.routes)) {\n return plugin.routes.map(transformPrefix).filter(filterContentAPI);\n }\n\n const routes = _.flatMap(plugin.routes, (route) => route.routes.map(transformPrefix)).filter(\n filterContentAPI\n );\n\n if (routes.length === 0) {\n return;\n }\n\n const apiPrefix = strapi.config.get('api.rest.prefix');\n routesMap[`plugin::${pluginName}`] = routes.map((route) => ({\n ...route,\n path: `${apiPrefix}${route.path}`,\n }));\n });\n\n return routesMap;\n };\n\n const sanitizer = sanitize.createAPISanitizers({\n getModel(uid: string) {\n return strapi.getModel(uid as UID.Schema);\n },\n // NOTE: use lazy access to allow registration of sanitizers after the creation of the container\n get sanitizers() {\n return {\n input: strapi.sanitizers.get('content-api.input'),\n output: strapi.sanitizers.get('content-api.output'),\n };\n },\n });\n\n const validator = validate.createAPIValidators({\n getModel(uid: string) {\n return strapi.getModel(uid as UID.Schema);\n },\n // NOTE: use lazy access to allow registration of validators after the creation of the container\n get validators() {\n return {\n input: strapi.validators.get('content-api.input'),\n };\n },\n });\n\n return {\n permissions: instantiatePermissionsUtilities(strapi),\n getRoutesMap,\n sanitize: sanitizer,\n validate: validator,\n };\n};\n\nexport default createContentAPI;\n"],"names":["transformRoutePrefixFor","pluginName","route","prefix","config","path","undefined","filterContentAPI","info","type","createContentAPI","strapi","getRoutesMap","routesMap","_","forEach","apis","api","apiName","routes","flatMap","filter","length","apiPrefix","get","map","plugins","plugin","transformPrefix","Array","isArray","sanitizer","sanitize","createAPISanitizers","getModel","uid","sanitizers","input","output","validator","validate","createAPIValidators","validators","permissions","instantiatePermissionsUtilities"],"mappings":"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"}
1
+ {"version":3,"file":"index.mjs","sources":["../../../src/services/content-api/index.ts"],"sourcesContent":["import _ from 'lodash';\nimport { sanitize, validate, sanitizeRoutesMapForSerialization } from '@strapi/utils';\n\nimport type { Core, UID } from '@strapi/types';\n\nimport instantiatePermissionsUtilities from './permissions';\n\nconst transformRoutePrefixFor = (pluginName: string) => (route: Core.Route) => {\n const prefix = route.config && route.config.prefix;\n const path = prefix !== undefined ? `${prefix}${route.path}` : `/${pluginName}${route.path}`;\n\n return {\n ...route,\n path,\n };\n};\n\nconst filterContentAPI = (route: Core.Route) => route.info.type === 'content-api';\n\n/**\n * Create a content API container that holds logic, tools and utils. (eg: permissions, ...)\n */\nconst createContentAPI = (strapi: Core.Strapi) => {\n const getRoutesMap = async () => {\n const routesMap: Record<string, Core.Route[]> = {};\n\n _.forEach(strapi.apis, (api, apiName) => {\n const routes = _.flatMap(api.routes, (route) => {\n if ('routes' in route) {\n return route.routes;\n }\n\n return route;\n }).filter(filterContentAPI);\n\n if (routes.length === 0) {\n return;\n }\n\n const apiPrefix = strapi.config.get('api.rest.prefix');\n routesMap[`api::${apiName}`] = routes.map((route) => ({\n ...route,\n path: `${apiPrefix}${route.path}`,\n }));\n });\n\n _.forEach(strapi.plugins, (plugin, pluginName) => {\n const transformPrefix = transformRoutePrefixFor(pluginName);\n\n if (Array.isArray(plugin.routes)) {\n return plugin.routes.map(transformPrefix).filter(filterContentAPI);\n }\n\n const routes = _.flatMap(plugin.routes, (route) => route.routes.map(transformPrefix)).filter(\n filterContentAPI\n );\n\n if (routes.length === 0) {\n return;\n }\n\n const apiPrefix = strapi.config.get('api.rest.prefix');\n routesMap[`plugin::${pluginName}`] = routes.map((route) => ({\n ...route,\n path: `${apiPrefix}${route.path}`,\n }));\n });\n\n return sanitizeRoutesMapForSerialization(routesMap);\n };\n\n const sanitizer = sanitize.createAPISanitizers({\n getModel(uid: string) {\n return strapi.getModel(uid as UID.Schema);\n },\n // NOTE: use lazy access to allow registration of sanitizers after the creation of the container\n get sanitizers() {\n return {\n input: strapi.sanitizers.get('content-api.input'),\n output: strapi.sanitizers.get('content-api.output'),\n };\n },\n });\n\n const validator = validate.createAPIValidators({\n getModel(uid: string) {\n return strapi.getModel(uid as UID.Schema);\n },\n // NOTE: use lazy access to allow registration of validators after the creation of the container\n get validators() {\n return {\n input: strapi.validators.get('content-api.input'),\n };\n },\n });\n\n return {\n permissions: instantiatePermissionsUtilities(strapi),\n getRoutesMap,\n sanitize: sanitizer,\n validate: validator,\n };\n};\n\nexport default createContentAPI;\n"],"names":["transformRoutePrefixFor","pluginName","route","prefix","config","path","undefined","filterContentAPI","info","type","createContentAPI","strapi","getRoutesMap","routesMap","_","forEach","apis","api","apiName","routes","flatMap","filter","length","apiPrefix","get","map","plugins","plugin","transformPrefix","Array","isArray","sanitizeRoutesMapForSerialization","sanitizer","sanitize","createAPISanitizers","getModel","uid","sanitizers","input","output","validator","validate","createAPIValidators","validators","permissions","instantiatePermissionsUtilities"],"mappings":";;;;AAOA,MAAMA,uBAAAA,GAA0B,CAACC,UAAAA,GAAuB,CAACC,KAAAA,GAAAA;AACvD,QAAA,MAAMC,SAASD,KAAME,CAAAA,MAAM,IAAIF,KAAME,CAAAA,MAAM,CAACD,MAAM;QAClD,MAAME,IAAAA,GAAOF,WAAWG,SAAY,GAAA,CAAC,EAAEH,MAAO,CAAA,EAAED,MAAMG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,EAAEJ,UAAAA,CAAW,EAAEC,KAAMG,CAAAA,IAAI,CAAC,CAAC;QAE5F,OAAO;AACL,YAAA,GAAGH,KAAK;AACRG,YAAAA;AACF,SAAA;AACF,KAAA;AAEA,MAAME,mBAAmB,CAACL,KAAAA,GAAsBA,MAAMM,IAAI,CAACC,IAAI,KAAK,aAAA;AAEpE;;IAGA,MAAMC,mBAAmB,CAACC,MAAAA,GAAAA;AACxB,IAAA,MAAMC,YAAe,GAAA,UAAA;AACnB,QAAA,MAAMC,YAA0C,EAAC;AAEjDC,QAAAA,CAAAA,CAAEC,OAAO,CAACJ,MAAAA,CAAOK,IAAI,EAAE,CAACC,GAAKC,EAAAA,OAAAA,GAAAA;AAC3B,YAAA,MAAMC,SAASL,CAAEM,CAAAA,OAAO,CAACH,GAAIE,CAAAA,MAAM,EAAE,CAACjB,KAAAA,GAAAA;AACpC,gBAAA,IAAI,YAAYA,KAAO,EAAA;AACrB,oBAAA,OAAOA,MAAMiB,MAAM;AACrB;gBAEA,OAAOjB,KAAAA;AACT,aAAA,CAAA,CAAGmB,MAAM,CAACd,gBAAAA,CAAAA;YAEV,IAAIY,MAAAA,CAAOG,MAAM,KAAK,CAAG,EAAA;AACvB,gBAAA;AACF;AAEA,YAAA,MAAMC,SAAYZ,GAAAA,MAAAA,CAAOP,MAAM,CAACoB,GAAG,CAAC,iBAAA,CAAA;AACpCX,YAAAA,SAAS,CAAC,CAAC,KAAK,EAAEK,OAAQ,CAAA,CAAC,CAAC,GAAGC,MAAOM,CAAAA,GAAG,CAAC,CAACvB,SAAW;AACpD,oBAAA,GAAGA,KAAK;AACRG,oBAAAA,IAAAA,EAAM,CAAC,EAAEkB,SAAAA,CAAU,EAAErB,KAAMG,CAAAA,IAAI,CAAC;iBAClC,CAAA,CAAA;AACF,SAAA,CAAA;AAEAS,QAAAA,CAAAA,CAAEC,OAAO,CAACJ,MAAAA,CAAOe,OAAO,EAAE,CAACC,MAAQ1B,EAAAA,UAAAA,GAAAA;AACjC,YAAA,MAAM2B,kBAAkB5B,uBAAwBC,CAAAA,UAAAA,CAAAA;AAEhD,YAAA,IAAI4B,KAAMC,CAAAA,OAAO,CAACH,MAAAA,CAAOR,MAAM,CAAG,EAAA;AAChC,gBAAA,OAAOQ,OAAOR,MAAM,CAACM,GAAG,CAACG,eAAAA,CAAAA,CAAiBP,MAAM,CAACd,gBAAAA,CAAAA;AACnD;AAEA,YAAA,MAAMY,SAASL,CAAEM,CAAAA,OAAO,CAACO,MAAAA,CAAOR,MAAM,EAAE,CAACjB,KAAUA,GAAAA,KAAAA,CAAMiB,MAAM,CAACM,GAAG,CAACG,eAAAA,CAAAA,CAAAA,CAAkBP,MAAM,CAC1Fd,gBAAAA,CAAAA;YAGF,IAAIY,MAAAA,CAAOG,MAAM,KAAK,CAAG,EAAA;AACvB,gBAAA;AACF;AAEA,YAAA,MAAMC,SAAYZ,GAAAA,MAAAA,CAAOP,MAAM,CAACoB,GAAG,CAAC,iBAAA,CAAA;AACpCX,YAAAA,SAAS,CAAC,CAAC,QAAQ,EAAEZ,UAAW,CAAA,CAAC,CAAC,GAAGkB,MAAOM,CAAAA,GAAG,CAAC,CAACvB,SAAW;AAC1D,oBAAA,GAAGA,KAAK;AACRG,oBAAAA,IAAAA,EAAM,CAAC,EAAEkB,SAAAA,CAAU,EAAErB,KAAMG,CAAAA,IAAI,CAAC;iBAClC,CAAA,CAAA;AACF,SAAA,CAAA;AAEA,QAAA,OAAO0B,iCAAkClB,CAAAA,SAAAA,CAAAA;AAC3C,KAAA;IAEA,MAAMmB,SAAAA,GAAYC,QAASC,CAAAA,mBAAmB,CAAC;AAC7CC,QAAAA,QAAAA,CAAAA,CAASC,GAAW,EAAA;YAClB,OAAOzB,MAAAA,CAAOwB,QAAQ,CAACC,GAAAA,CAAAA;AACzB,SAAA;;AAEA,QAAA,IAAIC,UAAa,CAAA,GAAA;YACf,OAAO;AACLC,gBAAAA,KAAAA,EAAO3B,MAAO0B,CAAAA,UAAU,CAACb,GAAG,CAAC,mBAAA,CAAA;AAC7Be,gBAAAA,MAAAA,EAAQ5B,MAAO0B,CAAAA,UAAU,CAACb,GAAG,CAAC,oBAAA;AAChC,aAAA;AACF;AACF,KAAA,CAAA;IAEA,MAAMgB,SAAAA,GAAYC,QAASC,CAAAA,mBAAmB,CAAC;AAC7CP,QAAAA,QAAAA,CAAAA,CAASC,GAAW,EAAA;YAClB,OAAOzB,MAAAA,CAAOwB,QAAQ,CAACC,GAAAA,CAAAA;AACzB,SAAA;;AAEA,QAAA,IAAIO,UAAa,CAAA,GAAA;YACf,OAAO;AACLL,gBAAAA,KAAAA,EAAO3B,MAAOgC,CAAAA,UAAU,CAACnB,GAAG,CAAC,mBAAA;AAC/B,aAAA;AACF;AACF,KAAA,CAAA;IAEA,OAAO;AACLoB,QAAAA,WAAAA,EAAaC,+BAAgClC,CAAAA,MAAAA,CAAAA;AAC7CC,QAAAA,YAAAA;QACAqB,QAAUD,EAAAA,SAAAA;QACVS,QAAUD,EAAAA;AACZ,KAAA;AACF;;;;"}
@@ -1,18 +1,12 @@
1
1
  import type { Core, Struct } from '@strapi/types';
2
+ interface EncodingInfo {
3
+ data: any;
4
+ schema: Struct.Schema;
5
+ }
2
6
  declare const createContentSourceMapsService: (strapi: Core.Strapi) => {
3
7
  encodeField(text: string, key: string): string;
4
- encodeEntry(options: {
5
- entryRootId: any;
6
- entryRootModel: string;
7
- entryData: any;
8
- model: any;
9
- }): Promise<any>;
10
- encodeSourceMaps(options: {
11
- data: any;
12
- contentType: Struct.ContentTypeSchema;
13
- rootId?: any;
14
- rootModel?: string;
15
- }): Promise<any>;
8
+ encodeEntry({ data, schema }: EncodingInfo): Promise<any>;
9
+ encodeSourceMaps({ data, schema }: EncodingInfo): Promise<any>;
16
10
  };
17
11
  export { createContentSourceMapsService };
18
12
  //# sourceMappingURL=content-source-maps.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"content-source-maps.d.ts","sourceRoot":"","sources":["../../src/services/content-source-maps.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AA2BlD,QAAA,MAAM,8BAA8B,WAAY,KAAK,MAAM;sBAErC,MAAM,OAAO,MAAM,GAAG,MAAM;yBAQnB;QACzB,WAAW,EAAE,GAAG,CAAC;QACjB,cAAc,EAAE,MAAM,CAAC;QACvB,SAAS,EAAE,GAAG,CAAC;QACf,KAAK,EAAE,GAAG,CAAC;KACZ,GAAG,QAAQ,GAAG,CAAC;8BA2HgB;QAC9B,IAAI,EAAE,GAAG,CAAC;QACV,WAAW,EAAE,OAAO,iBAAiB,CAAC;QACtC,MAAM,CAAC,EAAE,GAAG,CAAC;QACb,SAAS,CAAC,EAAE,MAAM,CAAC;KACpB,GAAG,QAAQ,GAAG,CAAC;CA6BnB,CAAC;AAEF,OAAO,EAAE,8BAA8B,EAAE,CAAC"}
1
+ {"version":3,"file":"content-source-maps.d.ts","sourceRoot":"","sources":["../../src/services/content-source-maps.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,EAAO,MAAM,eAAe,CAAC;AAyCvD,UAAU,YAAY;IACpB,IAAI,EAAE,GAAG,CAAC;IACV,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC;CACvB;AAED,QAAA,MAAM,8BAA8B,WAAY,KAAK,MAAM;sBAErC,MAAM,OAAO,MAAM,GAAG,MAAM;kCAQV,YAAY,GAAG,QAAQ,GAAG,CAAC;uCAuBtB,YAAY,GAAG,QAAQ,GAAG,CAAC;CAmBvE,CAAC;AAEF,OAAO,EAAE,8BAA8B,EAAE,CAAC"}
@@ -1,19 +1,25 @@
1
1
  'use strict';
2
2
 
3
3
  var stega = require('@vercel/stega');
4
+ var strapiUtils = require('@strapi/utils');
4
5
 
5
6
  const ENCODABLE_TYPES = [
6
7
  'string',
7
8
  'text',
8
9
  'richtext',
9
- 'uid',
10
- 'enumeration',
11
- 'email',
10
+ 'biginteger',
12
11
  'date',
13
- 'datetime',
14
12
  'time',
15
- 'timestamp'
13
+ 'datetime',
14
+ 'timestamp',
15
+ 'boolean',
16
+ 'enumeration',
17
+ 'json',
18
+ 'media',
19
+ 'email',
20
+ 'password'
16
21
  ];
22
+ // TODO: use a centralized store for these fields that would be shared with the CM and CTB
17
23
  const EXCLUDED_FIELDS = [
18
24
  'id',
19
25
  'documentId',
@@ -34,117 +40,36 @@ const createContentSourceMapsService = (strapi)=>{
34
40
  });
35
41
  return res;
36
42
  },
37
- async encodeEntry (options) {
38
- const { entryRootId, entryRootModel, entryData, model } = options;
39
- if (typeof entryData !== 'object' || entryData === null || entryData === undefined) {
40
- return entryData;
43
+ async encodeEntry ({ data, schema }) {
44
+ if (typeof data !== 'object' || data === null || data === undefined) {
45
+ return data;
41
46
  }
42
- const encodedData = {
43
- ...entryData
44
- };
45
- await Promise.all(Object.keys(entryData).map(async (key)=>{
46
- const value = entryData[key];
47
- if (value === null || value === undefined) {
48
- return;
49
- }
50
- const attribute = model.attributes[key];
47
+ return strapiUtils.traverseEntity(({ key, value, attribute }, { set })=>{
51
48
  if (!attribute || EXCLUDED_FIELDS.includes(key)) {
52
49
  return;
53
50
  }
54
- if (ENCODABLE_TYPES.includes(attribute.type)) {
55
- encodedData[key] = this.encodeField(value, // TODO: smarter metadata than just the key
56
- key);
57
- }
58
- if (attribute.type === 'component') {
59
- const componentModel = strapi.getModel(attribute.component);
60
- if (Array.isArray(value)) {
61
- encodedData[key] = await Promise.all(value.map((item)=>this.encodeEntry({
62
- entryRootId,
63
- entryRootModel,
64
- entryData: item,
65
- model: componentModel
66
- })));
67
- }
68
- encodedData[key] = await this.encodeEntry({
69
- entryRootId,
70
- entryRootModel,
71
- entryData: value,
72
- model: componentModel
73
- });
74
- }
75
- if (attribute.type === 'dynamiczone' && Array.isArray(value)) {
76
- encodedData[key] = await Promise.all(value.map((item)=>this.encodeEntry({
77
- entryRootId,
78
- entryRootModel,
79
- entryData: item,
80
- model: strapi.getModel(item.__component)
81
- })));
82
- }
83
- if (attribute.type === 'relation' && 'target' in attribute) {
84
- const relatedModel = strapi.getModel(attribute.target);
85
- if (Array.isArray(value)) {
86
- encodedData[key] = await Promise.all(value.map((item)=>this.encodeEntry({
87
- entryRootId: item.id,
88
- entryRootModel: relatedModel.uid,
89
- entryData: item,
90
- model: strapi.getModel(attribute.target)
91
- })));
92
- }
93
- encodedData[key] = await this.encodeEntry({
94
- entryRootId: value.id,
95
- entryRootModel: relatedModel.uid,
96
- entryData: value,
97
- model: strapi.getModel(attribute.target)
98
- });
99
- }
100
- if (attribute.type === 'media') {
101
- const fileModel = strapi.getModel('plugin::upload.file');
102
- if (Array.isArray(value.data)) {
103
- const encodedMediaData = await Promise.all(value.data.map((item)=>this.encodeEntry({
104
- entryRootId,
105
- entryRootModel,
106
- entryData: item,
107
- model: fileModel
108
- })));
109
- encodedData[key] = {
110
- ...value,
111
- data: encodedMediaData
112
- };
113
- } else {
114
- const encodedMediaItem = await this.encodeEntry({
115
- entryRootId,
116
- entryRootModel,
117
- entryData: value.data,
118
- model: fileModel
119
- });
120
- encodedData[key] = {
121
- ...value,
122
- data: encodedMediaItem
123
- };
124
- }
51
+ if (ENCODABLE_TYPES.includes(attribute.type) && typeof value === 'string') {
52
+ set(key, this.encodeField(value, key));
125
53
  }
126
- }));
127
- return encodedData;
54
+ }, {
55
+ schema,
56
+ getModel: (uid)=>strapi.getModel(uid)
57
+ }, data);
128
58
  },
129
- async encodeSourceMaps (options) {
130
- const { data, contentType, rootId, rootModel } = options;
59
+ async encodeSourceMaps ({ data, schema }) {
131
60
  try {
132
61
  if (Array.isArray(data)) {
133
62
  return await Promise.all(data.map((item)=>this.encodeSourceMaps({
134
63
  data: item,
135
- contentType
64
+ schema
136
65
  })));
137
66
  }
138
67
  if (typeof data !== 'object' || data === null) {
139
68
  return data;
140
69
  }
141
- const actualRootId = rootId || data.id;
142
- const actualRootModel = rootModel || contentType.uid;
143
70
  return await this.encodeEntry({
144
- entryRootId: actualRootId,
145
- entryRootModel: actualRootModel,
146
- entryData: data,
147
- model: contentType
71
+ data,
72
+ schema
148
73
  });
149
74
  } catch (error) {
150
75
  strapi.log.error('Error encoding source maps:', error);
@@ -1 +1 @@
1
- {"version":3,"file":"content-source-maps.js","sources":["../../src/services/content-source-maps.ts"],"sourcesContent":["import { vercelStegaCombine } from '@vercel/stega';\nimport type { Core, Struct } from '@strapi/types';\n\nconst ENCODABLE_TYPES = [\n 'string',\n 'text',\n 'richtext',\n 'uid',\n 'enumeration',\n 'email',\n 'date',\n 'datetime',\n 'time',\n 'timestamp',\n];\n\nconst EXCLUDED_FIELDS = [\n 'id',\n 'documentId',\n 'locale',\n 'localizations',\n 'created_by',\n 'updated_by',\n 'created_at',\n 'updated_at',\n 'publishedAt',\n];\n\nconst createContentSourceMapsService = (strapi: Core.Strapi) => {\n return {\n encodeField(text: string, key: string): string {\n const res = vercelStegaCombine(text, {\n // TODO: smarter metadata than just the key\n key,\n });\n return res;\n },\n\n async encodeEntry(options: {\n entryRootId: any;\n entryRootModel: string;\n entryData: any;\n model: any;\n }): Promise<any> {\n const { entryRootId, entryRootModel, entryData, model } = options;\n\n if (typeof entryData !== 'object' || entryData === null || entryData === undefined) {\n return entryData;\n }\n\n const encodedData = { ...entryData };\n\n await Promise.all(\n Object.keys(entryData).map(async (key) => {\n const value = entryData[key];\n\n if (value === null || value === undefined) {\n return;\n }\n\n const attribute = model.attributes[key];\n\n if (!attribute || EXCLUDED_FIELDS.includes(key)) {\n return;\n }\n\n if (ENCODABLE_TYPES.includes(attribute.type)) {\n encodedData[key] = this.encodeField(\n value,\n // TODO: smarter metadata than just the key\n key\n );\n }\n\n if (attribute.type === 'component') {\n const componentModel = strapi.getModel(attribute.component);\n\n if (Array.isArray(value)) {\n encodedData[key] = await Promise.all(\n value.map((item) =>\n this.encodeEntry({\n entryRootId,\n entryRootModel,\n entryData: item,\n model: componentModel,\n })\n )\n );\n }\n\n encodedData[key] = await this.encodeEntry({\n entryRootId,\n entryRootModel,\n entryData: value,\n model: componentModel,\n });\n }\n\n if (attribute.type === 'dynamiczone' && Array.isArray(value)) {\n encodedData[key] = await Promise.all(\n value.map((item) =>\n this.encodeEntry({\n entryRootId,\n entryRootModel,\n entryData: item,\n model: strapi.getModel(item.__component),\n })\n )\n );\n }\n\n if (attribute.type === 'relation' && 'target' in attribute) {\n const relatedModel = strapi.getModel(attribute.target);\n\n if (Array.isArray(value)) {\n encodedData[key] = await Promise.all(\n value.map((item: any) =>\n this.encodeEntry({\n entryRootId: item.id,\n entryRootModel: relatedModel.uid,\n entryData: item,\n model: strapi.getModel(attribute.target),\n })\n )\n );\n }\n\n encodedData[key] = await this.encodeEntry({\n entryRootId: value.id,\n entryRootModel: relatedModel.uid,\n entryData: value,\n model: strapi.getModel(attribute.target),\n });\n }\n\n if (attribute.type === 'media') {\n const fileModel = strapi.getModel('plugin::upload.file');\n\n if (Array.isArray(value.data)) {\n const encodedMediaData = await Promise.all(\n value.data.map((item: any) =>\n this.encodeEntry({\n entryRootId,\n entryRootModel,\n entryData: item,\n model: fileModel,\n })\n )\n );\n encodedData[key] = { ...value, data: encodedMediaData };\n } else {\n const encodedMediaItem = await this.encodeEntry({\n entryRootId,\n entryRootModel,\n entryData: value.data,\n model: fileModel,\n });\n encodedData[key] = { ...value, data: encodedMediaItem };\n }\n }\n })\n );\n\n return encodedData;\n },\n\n async encodeSourceMaps(options: {\n data: any;\n contentType: Struct.ContentTypeSchema;\n rootId?: any;\n rootModel?: string;\n }): Promise<any> {\n const { data, contentType, rootId, rootModel } = options;\n\n try {\n if (Array.isArray(data)) {\n return await Promise.all(\n data.map((item) => this.encodeSourceMaps({ data: item, contentType }))\n );\n }\n\n if (typeof data !== 'object' || data === null) {\n return data;\n }\n\n const actualRootId = rootId || data.id;\n const actualRootModel = rootModel || contentType.uid;\n\n return await this.encodeEntry({\n entryRootId: actualRootId,\n entryRootModel: actualRootModel,\n entryData: data,\n model: contentType,\n });\n } catch (error) {\n strapi.log.error('Error encoding source maps:', error);\n return data;\n }\n },\n };\n};\n\nexport { createContentSourceMapsService };\n"],"names":["ENCODABLE_TYPES","EXCLUDED_FIELDS","createContentSourceMapsService","strapi","encodeField","text","key","res","vercelStegaCombine","encodeEntry","options","entryRootId","entryRootModel","entryData","model","undefined","encodedData","Promise","all","Object","keys","map","value","attribute","attributes","includes","type","componentModel","getModel","component","Array","isArray","item","__component","relatedModel","target","id","uid","fileModel","data","encodedMediaData","encodedMediaItem","encodeSourceMaps","contentType","rootId","rootModel","actualRootId","actualRootModel","error","log"],"mappings":"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"}
1
+ {"version":3,"file":"content-source-maps.js","sources":["../../src/services/content-source-maps.ts"],"sourcesContent":["import { vercelStegaCombine } from '@vercel/stega';\nimport type { Core, Struct, UID } from '@strapi/types';\nimport { traverseEntity } from '@strapi/utils';\n\nconst ENCODABLE_TYPES = [\n 'string',\n 'text',\n 'richtext',\n 'biginteger',\n 'date',\n 'time',\n 'datetime',\n 'timestamp',\n 'boolean',\n 'enumeration',\n 'json',\n 'media',\n 'email',\n 'password',\n /**\n * We cannot modify the response shape, so types that aren't based on string cannot be encoded:\n * - json: object\n * - blocks: object, will require a custom implementation in a dedicated PR\n * - integer, float and decimal: number\n * - boolean: boolean (believe it or not)\n * - uid: can be stringified but would mess up URLs\n */\n];\n\n// TODO: use a centralized store for these fields that would be shared with the CM and CTB\nconst EXCLUDED_FIELDS = [\n 'id',\n 'documentId',\n 'locale',\n 'localizations',\n 'created_by',\n 'updated_by',\n 'created_at',\n 'updated_at',\n 'publishedAt',\n];\n\ninterface EncodingInfo {\n data: any;\n schema: Struct.Schema;\n}\n\nconst createContentSourceMapsService = (strapi: Core.Strapi) => {\n return {\n encodeField(text: string, key: string): string {\n const res = vercelStegaCombine(text, {\n // TODO: smarter metadata than just the key\n key,\n });\n return res;\n },\n\n async encodeEntry({ data, schema }: EncodingInfo): Promise<any> {\n if (typeof data !== 'object' || data === null || data === undefined) {\n return data;\n }\n\n return traverseEntity(\n ({ key, value, attribute }, { set }) => {\n if (!attribute || EXCLUDED_FIELDS.includes(key)) {\n return;\n }\n\n if (ENCODABLE_TYPES.includes(attribute.type) && typeof value === 'string') {\n set(key, this.encodeField(value, key) as any);\n }\n },\n {\n schema,\n getModel: (uid) => strapi.getModel(uid as UID.Schema),\n },\n data\n );\n },\n\n async encodeSourceMaps({ data, schema }: EncodingInfo): Promise<any> {\n try {\n if (Array.isArray(data)) {\n return await Promise.all(\n data.map((item) => this.encodeSourceMaps({ data: item, schema }))\n );\n }\n\n if (typeof data !== 'object' || data === null) {\n return data;\n }\n\n return await this.encodeEntry({ data, schema });\n } catch (error) {\n strapi.log.error('Error encoding source maps:', error);\n return data;\n }\n },\n };\n};\n\nexport { createContentSourceMapsService };\n"],"names":["ENCODABLE_TYPES","EXCLUDED_FIELDS","createContentSourceMapsService","strapi","encodeField","text","key","res","vercelStegaCombine","encodeEntry","data","schema","undefined","traverseEntity","value","attribute","set","includes","type","getModel","uid","encodeSourceMaps","Array","isArray","Promise","all","map","item","error","log"],"mappings":";;;;;AAIA,MAAMA,eAAkB,GAAA;AACtB,IAAA,QAAA;AACA,IAAA,MAAA;AACA,IAAA,UAAA;AACA,IAAA,YAAA;AACA,IAAA,MAAA;AACA,IAAA,MAAA;AACA,IAAA,UAAA;AACA,IAAA,WAAA;AACA,IAAA,SAAA;AACA,IAAA,aAAA;AACA,IAAA,MAAA;AACA,IAAA,OAAA;AACA,IAAA,OAAA;AACA,IAAA;AASD,CAAA;AAED;AACA,MAAMC,eAAkB,GAAA;AACtB,IAAA,IAAA;AACA,IAAA,YAAA;AACA,IAAA,QAAA;AACA,IAAA,eAAA;AACA,IAAA,YAAA;AACA,IAAA,YAAA;AACA,IAAA,YAAA;AACA,IAAA,YAAA;AACA,IAAA;AACD,CAAA;AAOD,MAAMC,iCAAiC,CAACC,MAAAA,GAAAA;IACtC,OAAO;QACLC,WAAYC,CAAAA,CAAAA,IAAY,EAAEC,GAAW,EAAA;YACnC,MAAMC,GAAAA,GAAMC,yBAAmBH,IAAM,EAAA;;AAEnCC,gBAAAA;AACF,aAAA,CAAA;YACA,OAAOC,GAAAA;AACT,SAAA;AAEA,QAAA,MAAME,WAAY,CAAA,CAAA,EAAEC,IAAI,EAAEC,MAAM,EAAgB,EAAA;AAC9C,YAAA,IAAI,OAAOD,IAAS,KAAA,QAAA,IAAYA,IAAS,KAAA,IAAA,IAAQA,SAASE,SAAW,EAAA;gBACnE,OAAOF,IAAAA;AACT;AAEA,YAAA,OAAOG,0BACL,CAAA,CAAC,EAAEP,GAAG,EAAEQ,KAAK,EAAEC,SAAS,EAAE,EAAE,EAAEC,GAAG,EAAE,GAAA;AACjC,gBAAA,IAAI,CAACD,SAAAA,IAAad,eAAgBgB,CAAAA,QAAQ,CAACX,GAAM,CAAA,EAAA;AAC/C,oBAAA;AACF;gBAEA,IAAIN,eAAAA,CAAgBiB,QAAQ,CAACF,SAAAA,CAAUG,IAAI,CAAK,IAAA,OAAOJ,UAAU,QAAU,EAAA;AACzEE,oBAAAA,GAAAA,CAAIV,GAAK,EAAA,IAAI,CAACF,WAAW,CAACU,KAAOR,EAAAA,GAAAA,CAAAA,CAAAA;AACnC;aAEF,EAAA;AACEK,gBAAAA,MAAAA;AACAQ,gBAAAA,QAAAA,EAAU,CAACC,GAAAA,GAAQjB,MAAOgB,CAAAA,QAAQ,CAACC,GAAAA;aAErCV,EAAAA,IAAAA,CAAAA;AAEJ,SAAA;AAEA,QAAA,MAAMW,gBAAiB,CAAA,CAAA,EAAEX,IAAI,EAAEC,MAAM,EAAgB,EAAA;YACnD,IAAI;gBACF,IAAIW,KAAAA,CAAMC,OAAO,CAACb,IAAO,CAAA,EAAA;AACvB,oBAAA,OAAO,MAAMc,OAAAA,CAAQC,GAAG,CACtBf,IAAKgB,CAAAA,GAAG,CAAC,CAACC,IAAS,GAAA,IAAI,CAACN,gBAAgB,CAAC;4BAAEX,IAAMiB,EAAAA,IAAAA;AAAMhB,4BAAAA;AAAO,yBAAA,CAAA,CAAA,CAAA;AAElE;AAEA,gBAAA,IAAI,OAAOD,IAAAA,KAAS,QAAYA,IAAAA,IAAAA,KAAS,IAAM,EAAA;oBAC7C,OAAOA,IAAAA;AACT;AAEA,gBAAA,OAAO,MAAM,IAAI,CAACD,WAAW,CAAC;AAAEC,oBAAAA,IAAAA;AAAMC,oBAAAA;AAAO,iBAAA,CAAA;AAC/C,aAAA,CAAE,OAAOiB,KAAO,EAAA;AACdzB,gBAAAA,MAAAA,CAAO0B,GAAG,CAACD,KAAK,CAAC,6BAA+BA,EAAAA,KAAAA,CAAAA;gBAChD,OAAOlB,IAAAA;AACT;AACF;AACF,KAAA;AACF;;;;"}
@@ -1,17 +1,23 @@
1
1
  import { vercelStegaCombine } from '@vercel/stega';
2
+ import { traverseEntity } from '@strapi/utils';
2
3
 
3
4
  const ENCODABLE_TYPES = [
4
5
  'string',
5
6
  'text',
6
7
  'richtext',
7
- 'uid',
8
- 'enumeration',
9
- 'email',
8
+ 'biginteger',
10
9
  'date',
11
- 'datetime',
12
10
  'time',
13
- 'timestamp'
11
+ 'datetime',
12
+ 'timestamp',
13
+ 'boolean',
14
+ 'enumeration',
15
+ 'json',
16
+ 'media',
17
+ 'email',
18
+ 'password'
14
19
  ];
20
+ // TODO: use a centralized store for these fields that would be shared with the CM and CTB
15
21
  const EXCLUDED_FIELDS = [
16
22
  'id',
17
23
  'documentId',
@@ -32,117 +38,36 @@ const createContentSourceMapsService = (strapi)=>{
32
38
  });
33
39
  return res;
34
40
  },
35
- async encodeEntry (options) {
36
- const { entryRootId, entryRootModel, entryData, model } = options;
37
- if (typeof entryData !== 'object' || entryData === null || entryData === undefined) {
38
- return entryData;
41
+ async encodeEntry ({ data, schema }) {
42
+ if (typeof data !== 'object' || data === null || data === undefined) {
43
+ return data;
39
44
  }
40
- const encodedData = {
41
- ...entryData
42
- };
43
- await Promise.all(Object.keys(entryData).map(async (key)=>{
44
- const value = entryData[key];
45
- if (value === null || value === undefined) {
46
- return;
47
- }
48
- const attribute = model.attributes[key];
45
+ return traverseEntity(({ key, value, attribute }, { set })=>{
49
46
  if (!attribute || EXCLUDED_FIELDS.includes(key)) {
50
47
  return;
51
48
  }
52
- if (ENCODABLE_TYPES.includes(attribute.type)) {
53
- encodedData[key] = this.encodeField(value, // TODO: smarter metadata than just the key
54
- key);
55
- }
56
- if (attribute.type === 'component') {
57
- const componentModel = strapi.getModel(attribute.component);
58
- if (Array.isArray(value)) {
59
- encodedData[key] = await Promise.all(value.map((item)=>this.encodeEntry({
60
- entryRootId,
61
- entryRootModel,
62
- entryData: item,
63
- model: componentModel
64
- })));
65
- }
66
- encodedData[key] = await this.encodeEntry({
67
- entryRootId,
68
- entryRootModel,
69
- entryData: value,
70
- model: componentModel
71
- });
72
- }
73
- if (attribute.type === 'dynamiczone' && Array.isArray(value)) {
74
- encodedData[key] = await Promise.all(value.map((item)=>this.encodeEntry({
75
- entryRootId,
76
- entryRootModel,
77
- entryData: item,
78
- model: strapi.getModel(item.__component)
79
- })));
80
- }
81
- if (attribute.type === 'relation' && 'target' in attribute) {
82
- const relatedModel = strapi.getModel(attribute.target);
83
- if (Array.isArray(value)) {
84
- encodedData[key] = await Promise.all(value.map((item)=>this.encodeEntry({
85
- entryRootId: item.id,
86
- entryRootModel: relatedModel.uid,
87
- entryData: item,
88
- model: strapi.getModel(attribute.target)
89
- })));
90
- }
91
- encodedData[key] = await this.encodeEntry({
92
- entryRootId: value.id,
93
- entryRootModel: relatedModel.uid,
94
- entryData: value,
95
- model: strapi.getModel(attribute.target)
96
- });
97
- }
98
- if (attribute.type === 'media') {
99
- const fileModel = strapi.getModel('plugin::upload.file');
100
- if (Array.isArray(value.data)) {
101
- const encodedMediaData = await Promise.all(value.data.map((item)=>this.encodeEntry({
102
- entryRootId,
103
- entryRootModel,
104
- entryData: item,
105
- model: fileModel
106
- })));
107
- encodedData[key] = {
108
- ...value,
109
- data: encodedMediaData
110
- };
111
- } else {
112
- const encodedMediaItem = await this.encodeEntry({
113
- entryRootId,
114
- entryRootModel,
115
- entryData: value.data,
116
- model: fileModel
117
- });
118
- encodedData[key] = {
119
- ...value,
120
- data: encodedMediaItem
121
- };
122
- }
49
+ if (ENCODABLE_TYPES.includes(attribute.type) && typeof value === 'string') {
50
+ set(key, this.encodeField(value, key));
123
51
  }
124
- }));
125
- return encodedData;
52
+ }, {
53
+ schema,
54
+ getModel: (uid)=>strapi.getModel(uid)
55
+ }, data);
126
56
  },
127
- async encodeSourceMaps (options) {
128
- const { data, contentType, rootId, rootModel } = options;
57
+ async encodeSourceMaps ({ data, schema }) {
129
58
  try {
130
59
  if (Array.isArray(data)) {
131
60
  return await Promise.all(data.map((item)=>this.encodeSourceMaps({
132
61
  data: item,
133
- contentType
62
+ schema
134
63
  })));
135
64
  }
136
65
  if (typeof data !== 'object' || data === null) {
137
66
  return data;
138
67
  }
139
- const actualRootId = rootId || data.id;
140
- const actualRootModel = rootModel || contentType.uid;
141
68
  return await this.encodeEntry({
142
- entryRootId: actualRootId,
143
- entryRootModel: actualRootModel,
144
- entryData: data,
145
- model: contentType
69
+ data,
70
+ schema
146
71
  });
147
72
  } catch (error) {
148
73
  strapi.log.error('Error encoding source maps:', error);
@@ -1 +1 @@
1
- {"version":3,"file":"content-source-maps.mjs","sources":["../../src/services/content-source-maps.ts"],"sourcesContent":["import { vercelStegaCombine } from '@vercel/stega';\nimport type { Core, Struct } from '@strapi/types';\n\nconst ENCODABLE_TYPES = [\n 'string',\n 'text',\n 'richtext',\n 'uid',\n 'enumeration',\n 'email',\n 'date',\n 'datetime',\n 'time',\n 'timestamp',\n];\n\nconst EXCLUDED_FIELDS = [\n 'id',\n 'documentId',\n 'locale',\n 'localizations',\n 'created_by',\n 'updated_by',\n 'created_at',\n 'updated_at',\n 'publishedAt',\n];\n\nconst createContentSourceMapsService = (strapi: Core.Strapi) => {\n return {\n encodeField(text: string, key: string): string {\n const res = vercelStegaCombine(text, {\n // TODO: smarter metadata than just the key\n key,\n });\n return res;\n },\n\n async encodeEntry(options: {\n entryRootId: any;\n entryRootModel: string;\n entryData: any;\n model: any;\n }): Promise<any> {\n const { entryRootId, entryRootModel, entryData, model } = options;\n\n if (typeof entryData !== 'object' || entryData === null || entryData === undefined) {\n return entryData;\n }\n\n const encodedData = { ...entryData };\n\n await Promise.all(\n Object.keys(entryData).map(async (key) => {\n const value = entryData[key];\n\n if (value === null || value === undefined) {\n return;\n }\n\n const attribute = model.attributes[key];\n\n if (!attribute || EXCLUDED_FIELDS.includes(key)) {\n return;\n }\n\n if (ENCODABLE_TYPES.includes(attribute.type)) {\n encodedData[key] = this.encodeField(\n value,\n // TODO: smarter metadata than just the key\n key\n );\n }\n\n if (attribute.type === 'component') {\n const componentModel = strapi.getModel(attribute.component);\n\n if (Array.isArray(value)) {\n encodedData[key] = await Promise.all(\n value.map((item) =>\n this.encodeEntry({\n entryRootId,\n entryRootModel,\n entryData: item,\n model: componentModel,\n })\n )\n );\n }\n\n encodedData[key] = await this.encodeEntry({\n entryRootId,\n entryRootModel,\n entryData: value,\n model: componentModel,\n });\n }\n\n if (attribute.type === 'dynamiczone' && Array.isArray(value)) {\n encodedData[key] = await Promise.all(\n value.map((item) =>\n this.encodeEntry({\n entryRootId,\n entryRootModel,\n entryData: item,\n model: strapi.getModel(item.__component),\n })\n )\n );\n }\n\n if (attribute.type === 'relation' && 'target' in attribute) {\n const relatedModel = strapi.getModel(attribute.target);\n\n if (Array.isArray(value)) {\n encodedData[key] = await Promise.all(\n value.map((item: any) =>\n this.encodeEntry({\n entryRootId: item.id,\n entryRootModel: relatedModel.uid,\n entryData: item,\n model: strapi.getModel(attribute.target),\n })\n )\n );\n }\n\n encodedData[key] = await this.encodeEntry({\n entryRootId: value.id,\n entryRootModel: relatedModel.uid,\n entryData: value,\n model: strapi.getModel(attribute.target),\n });\n }\n\n if (attribute.type === 'media') {\n const fileModel = strapi.getModel('plugin::upload.file');\n\n if (Array.isArray(value.data)) {\n const encodedMediaData = await Promise.all(\n value.data.map((item: any) =>\n this.encodeEntry({\n entryRootId,\n entryRootModel,\n entryData: item,\n model: fileModel,\n })\n )\n );\n encodedData[key] = { ...value, data: encodedMediaData };\n } else {\n const encodedMediaItem = await this.encodeEntry({\n entryRootId,\n entryRootModel,\n entryData: value.data,\n model: fileModel,\n });\n encodedData[key] = { ...value, data: encodedMediaItem };\n }\n }\n })\n );\n\n return encodedData;\n },\n\n async encodeSourceMaps(options: {\n data: any;\n contentType: Struct.ContentTypeSchema;\n rootId?: any;\n rootModel?: string;\n }): Promise<any> {\n const { data, contentType, rootId, rootModel } = options;\n\n try {\n if (Array.isArray(data)) {\n return await Promise.all(\n data.map((item) => this.encodeSourceMaps({ data: item, contentType }))\n );\n }\n\n if (typeof data !== 'object' || data === null) {\n return data;\n }\n\n const actualRootId = rootId || data.id;\n const actualRootModel = rootModel || contentType.uid;\n\n return await this.encodeEntry({\n entryRootId: actualRootId,\n entryRootModel: actualRootModel,\n entryData: data,\n model: contentType,\n });\n } catch (error) {\n strapi.log.error('Error encoding source maps:', error);\n return data;\n }\n },\n };\n};\n\nexport { createContentSourceMapsService };\n"],"names":["ENCODABLE_TYPES","EXCLUDED_FIELDS","createContentSourceMapsService","strapi","encodeField","text","key","res","vercelStegaCombine","encodeEntry","options","entryRootId","entryRootModel","entryData","model","undefined","encodedData","Promise","all","Object","keys","map","value","attribute","attributes","includes","type","componentModel","getModel","component","Array","isArray","item","__component","relatedModel","target","id","uid","fileModel","data","encodedMediaData","encodedMediaItem","encodeSourceMaps","contentType","rootId","rootModel","actualRootId","actualRootModel","error","log"],"mappings":"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"}
1
+ {"version":3,"file":"content-source-maps.mjs","sources":["../../src/services/content-source-maps.ts"],"sourcesContent":["import { vercelStegaCombine } from '@vercel/stega';\nimport type { Core, Struct, UID } from '@strapi/types';\nimport { traverseEntity } from '@strapi/utils';\n\nconst ENCODABLE_TYPES = [\n 'string',\n 'text',\n 'richtext',\n 'biginteger',\n 'date',\n 'time',\n 'datetime',\n 'timestamp',\n 'boolean',\n 'enumeration',\n 'json',\n 'media',\n 'email',\n 'password',\n /**\n * We cannot modify the response shape, so types that aren't based on string cannot be encoded:\n * - json: object\n * - blocks: object, will require a custom implementation in a dedicated PR\n * - integer, float and decimal: number\n * - boolean: boolean (believe it or not)\n * - uid: can be stringified but would mess up URLs\n */\n];\n\n// TODO: use a centralized store for these fields that would be shared with the CM and CTB\nconst EXCLUDED_FIELDS = [\n 'id',\n 'documentId',\n 'locale',\n 'localizations',\n 'created_by',\n 'updated_by',\n 'created_at',\n 'updated_at',\n 'publishedAt',\n];\n\ninterface EncodingInfo {\n data: any;\n schema: Struct.Schema;\n}\n\nconst createContentSourceMapsService = (strapi: Core.Strapi) => {\n return {\n encodeField(text: string, key: string): string {\n const res = vercelStegaCombine(text, {\n // TODO: smarter metadata than just the key\n key,\n });\n return res;\n },\n\n async encodeEntry({ data, schema }: EncodingInfo): Promise<any> {\n if (typeof data !== 'object' || data === null || data === undefined) {\n return data;\n }\n\n return traverseEntity(\n ({ key, value, attribute }, { set }) => {\n if (!attribute || EXCLUDED_FIELDS.includes(key)) {\n return;\n }\n\n if (ENCODABLE_TYPES.includes(attribute.type) && typeof value === 'string') {\n set(key, this.encodeField(value, key) as any);\n }\n },\n {\n schema,\n getModel: (uid) => strapi.getModel(uid as UID.Schema),\n },\n data\n );\n },\n\n async encodeSourceMaps({ data, schema }: EncodingInfo): Promise<any> {\n try {\n if (Array.isArray(data)) {\n return await Promise.all(\n data.map((item) => this.encodeSourceMaps({ data: item, schema }))\n );\n }\n\n if (typeof data !== 'object' || data === null) {\n return data;\n }\n\n return await this.encodeEntry({ data, schema });\n } catch (error) {\n strapi.log.error('Error encoding source maps:', error);\n return data;\n }\n },\n };\n};\n\nexport { createContentSourceMapsService };\n"],"names":["ENCODABLE_TYPES","EXCLUDED_FIELDS","createContentSourceMapsService","strapi","encodeField","text","key","res","vercelStegaCombine","encodeEntry","data","schema","undefined","traverseEntity","value","attribute","set","includes","type","getModel","uid","encodeSourceMaps","Array","isArray","Promise","all","map","item","error","log"],"mappings":";;;AAIA,MAAMA,eAAkB,GAAA;AACtB,IAAA,QAAA;AACA,IAAA,MAAA;AACA,IAAA,UAAA;AACA,IAAA,YAAA;AACA,IAAA,MAAA;AACA,IAAA,MAAA;AACA,IAAA,UAAA;AACA,IAAA,WAAA;AACA,IAAA,SAAA;AACA,IAAA,aAAA;AACA,IAAA,MAAA;AACA,IAAA,OAAA;AACA,IAAA,OAAA;AACA,IAAA;AASD,CAAA;AAED;AACA,MAAMC,eAAkB,GAAA;AACtB,IAAA,IAAA;AACA,IAAA,YAAA;AACA,IAAA,QAAA;AACA,IAAA,eAAA;AACA,IAAA,YAAA;AACA,IAAA,YAAA;AACA,IAAA,YAAA;AACA,IAAA,YAAA;AACA,IAAA;AACD,CAAA;AAOD,MAAMC,iCAAiC,CAACC,MAAAA,GAAAA;IACtC,OAAO;QACLC,WAAYC,CAAAA,CAAAA,IAAY,EAAEC,GAAW,EAAA;YACnC,MAAMC,GAAAA,GAAMC,mBAAmBH,IAAM,EAAA;;AAEnCC,gBAAAA;AACF,aAAA,CAAA;YACA,OAAOC,GAAAA;AACT,SAAA;AAEA,QAAA,MAAME,WAAY,CAAA,CAAA,EAAEC,IAAI,EAAEC,MAAM,EAAgB,EAAA;AAC9C,YAAA,IAAI,OAAOD,IAAS,KAAA,QAAA,IAAYA,IAAS,KAAA,IAAA,IAAQA,SAASE,SAAW,EAAA;gBACnE,OAAOF,IAAAA;AACT;AAEA,YAAA,OAAOG,cACL,CAAA,CAAC,EAAEP,GAAG,EAAEQ,KAAK,EAAEC,SAAS,EAAE,EAAE,EAAEC,GAAG,EAAE,GAAA;AACjC,gBAAA,IAAI,CAACD,SAAAA,IAAad,eAAgBgB,CAAAA,QAAQ,CAACX,GAAM,CAAA,EAAA;AAC/C,oBAAA;AACF;gBAEA,IAAIN,eAAAA,CAAgBiB,QAAQ,CAACF,SAAAA,CAAUG,IAAI,CAAK,IAAA,OAAOJ,UAAU,QAAU,EAAA;AACzEE,oBAAAA,GAAAA,CAAIV,GAAK,EAAA,IAAI,CAACF,WAAW,CAACU,KAAOR,EAAAA,GAAAA,CAAAA,CAAAA;AACnC;aAEF,EAAA;AACEK,gBAAAA,MAAAA;AACAQ,gBAAAA,QAAAA,EAAU,CAACC,GAAAA,GAAQjB,MAAOgB,CAAAA,QAAQ,CAACC,GAAAA;aAErCV,EAAAA,IAAAA,CAAAA;AAEJ,SAAA;AAEA,QAAA,MAAMW,gBAAiB,CAAA,CAAA,EAAEX,IAAI,EAAEC,MAAM,EAAgB,EAAA;YACnD,IAAI;gBACF,IAAIW,KAAAA,CAAMC,OAAO,CAACb,IAAO,CAAA,EAAA;AACvB,oBAAA,OAAO,MAAMc,OAAAA,CAAQC,GAAG,CACtBf,IAAKgB,CAAAA,GAAG,CAAC,CAACC,IAAS,GAAA,IAAI,CAACN,gBAAgB,CAAC;4BAAEX,IAAMiB,EAAAA,IAAAA;AAAMhB,4BAAAA;AAAO,yBAAA,CAAA,CAAA,CAAA;AAElE;AAEA,gBAAA,IAAI,OAAOD,IAAAA,KAAS,QAAYA,IAAAA,IAAAA,KAAS,IAAM,EAAA;oBAC7C,OAAOA,IAAAA;AACT;AAEA,gBAAA,OAAO,MAAM,IAAI,CAACD,WAAW,CAAC;AAAEC,oBAAAA,IAAAA;AAAMC,oBAAAA;AAAO,iBAAA,CAAA;AAC/C,aAAA,CAAE,OAAOiB,KAAO,EAAA;AACdzB,gBAAAA,MAAAA,CAAO0B,GAAG,CAACD,KAAK,CAAC,6BAA+BA,EAAAA,KAAAA,CAAAA;gBAChD,OAAOlB,IAAAA;AACT;AACF;AACF,KAAA;AACF;;;;"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@strapi/core",
3
- "version": "0.0.0-experimental.838b114ef86c9081f990c3b46f5843a41088ec64",
3
+ "version": "0.0.0-experimental.8478bb287dfba93afd007cad7697c0f88853a2d8",
4
4
  "description": "Core of Strapi",
5
5
  "homepage": "https://strapi.io",
6
6
  "bugs": {
@@ -56,14 +56,14 @@
56
56
  "@koa/cors": "5.0.0",
57
57
  "@koa/router": "12.0.2",
58
58
  "@paralleldrive/cuid2": "2.2.2",
59
- "@strapi/admin": "0.0.0-experimental.838b114ef86c9081f990c3b46f5843a41088ec64",
60
- "@strapi/database": "0.0.0-experimental.838b114ef86c9081f990c3b46f5843a41088ec64",
61
- "@strapi/generators": "0.0.0-experimental.838b114ef86c9081f990c3b46f5843a41088ec64",
62
- "@strapi/logger": "0.0.0-experimental.838b114ef86c9081f990c3b46f5843a41088ec64",
63
- "@strapi/permissions": "0.0.0-experimental.838b114ef86c9081f990c3b46f5843a41088ec64",
64
- "@strapi/types": "0.0.0-experimental.838b114ef86c9081f990c3b46f5843a41088ec64",
65
- "@strapi/typescript-utils": "0.0.0-experimental.838b114ef86c9081f990c3b46f5843a41088ec64",
66
- "@strapi/utils": "0.0.0-experimental.838b114ef86c9081f990c3b46f5843a41088ec64",
59
+ "@strapi/admin": "0.0.0-experimental.8478bb287dfba93afd007cad7697c0f88853a2d8",
60
+ "@strapi/database": "0.0.0-experimental.8478bb287dfba93afd007cad7697c0f88853a2d8",
61
+ "@strapi/generators": "0.0.0-experimental.8478bb287dfba93afd007cad7697c0f88853a2d8",
62
+ "@strapi/logger": "0.0.0-experimental.8478bb287dfba93afd007cad7697c0f88853a2d8",
63
+ "@strapi/permissions": "0.0.0-experimental.8478bb287dfba93afd007cad7697c0f88853a2d8",
64
+ "@strapi/types": "0.0.0-experimental.8478bb287dfba93afd007cad7697c0f88853a2d8",
65
+ "@strapi/typescript-utils": "0.0.0-experimental.8478bb287dfba93afd007cad7697c0f88853a2d8",
66
+ "@strapi/utils": "0.0.0-experimental.8478bb287dfba93afd007cad7697c0f88853a2d8",
67
67
  "@vercel/stega": "0.1.2",
68
68
  "bcryptjs": "2.4.3",
69
69
  "boxen": "5.1.2",
@@ -130,9 +130,9 @@
130
130
  "@types/node": "18.19.24",
131
131
  "@types/node-schedule": "2.1.7",
132
132
  "@types/statuses": "2.0.1",
133
- "eslint-config-custom": "0.0.0-experimental.838b114ef86c9081f990c3b46f5843a41088ec64",
133
+ "eslint-config-custom": "0.0.0-experimental.8478bb287dfba93afd007cad7697c0f88853a2d8",
134
134
  "supertest": "6.3.3",
135
- "tsconfig": "0.0.0-experimental.838b114ef86c9081f990c3b46f5843a41088ec64"
135
+ "tsconfig": "0.0.0-experimental.8478bb287dfba93afd007cad7697c0f88853a2d8"
136
136
  },
137
137
  "engines": {
138
138
  "node": ">=18.0.0 <=22.x.x",