@strapi/core 5.53.0 → 5.54.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (45) hide show
  1. package/dist/domain/content-type/index.d.ts.map +1 -1
  2. package/dist/domain/content-type/index.js +3 -1
  3. package/dist/domain/content-type/index.js.map +1 -1
  4. package/dist/domain/content-type/index.mjs +3 -1
  5. package/dist/domain/content-type/index.mjs.map +1 -1
  6. package/dist/package.json.js +14 -15
  7. package/dist/package.json.js.map +1 -1
  8. package/dist/package.json.mjs +14 -15
  9. package/dist/package.json.mjs.map +1 -1
  10. package/dist/services/content-source-maps.d.ts +14 -2
  11. package/dist/services/content-source-maps.d.ts.map +1 -1
  12. package/dist/services/content-source-maps.js +134 -1
  13. package/dist/services/content-source-maps.js.map +1 -1
  14. package/dist/services/content-source-maps.mjs +134 -2
  15. package/dist/services/content-source-maps.mjs.map +1 -1
  16. package/dist/services/cron.d.ts +3 -18
  17. package/dist/services/cron.d.ts.map +1 -1
  18. package/dist/services/cron.js +241 -33
  19. package/dist/services/cron.js.map +1 -1
  20. package/dist/services/cron.mjs +241 -33
  21. package/dist/services/cron.mjs.map +1 -1
  22. package/dist/services/document-service/transform/relations/extract/data-ids.d.ts +1 -1
  23. package/dist/services/document-service/transform/relations/extract/data-ids.d.ts.map +1 -1
  24. package/dist/services/document-service/transform/relations/extract/data-ids.js +12 -3
  25. package/dist/services/document-service/transform/relations/extract/data-ids.js.map +1 -1
  26. package/dist/services/document-service/transform/relations/extract/data-ids.mjs +12 -3
  27. package/dist/services/document-service/transform/relations/extract/data-ids.mjs.map +1 -1
  28. package/dist/services/document-service/transform/relations/transform/data-ids.d.ts +1 -1
  29. package/dist/services/document-service/transform/relations/transform/data-ids.d.ts.map +1 -1
  30. package/dist/services/document-service/transform/relations/transform/data-ids.js +12 -3
  31. package/dist/services/document-service/transform/relations/transform/data-ids.js.map +1 -1
  32. package/dist/services/document-service/transform/relations/transform/data-ids.mjs +12 -3
  33. package/dist/services/document-service/transform/relations/transform/data-ids.mjs.map +1 -1
  34. package/dist/services/document-service/transform/relations/utils/map-relation.d.ts +6 -1
  35. package/dist/services/document-service/transform/relations/utils/map-relation.d.ts.map +1 -1
  36. package/dist/services/document-service/transform/relations/utils/map-relation.js +13 -10
  37. package/dist/services/document-service/transform/relations/utils/map-relation.js.map +1 -1
  38. package/dist/services/document-service/transform/relations/utils/map-relation.mjs +13 -10
  39. package/dist/services/document-service/transform/relations/utils/map-relation.mjs.map +1 -1
  40. package/dist/services/features.d.ts.map +1 -1
  41. package/dist/services/features.js +3 -0
  42. package/dist/services/features.js.map +1 -1
  43. package/dist/services/features.mjs +3 -0
  44. package/dist/services/features.mjs.map +1 -1
  45. package/package.json +14 -15
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/domain/content-type/index.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAG5C,MAAM,MAAM,qBAAqB,GAAG;IAClC,MAAM,EAAE,MAAM,CAAC,WAAW,CAAC;IAC3B,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACrC,CAAC;AAWF,QAAA,MAAM,iBAAiB,GAAI,KAAK,MAAM,EAAE,YAAY,qBAAqB,oEAqCxE,CAAC;AAwFF,QAAA,MAAM,WAAW,GAAI,QAAQ,MAAM,CAAC,WAAW,EAAE,SAAS,MAAM,WAK/D,CAAC;AAmBF,OAAO,EAAE,iBAAiB,EAAE,WAAW,EAAE,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/domain/content-type/index.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAG5C,MAAM,MAAM,qBAAqB,GAAG;IAClC,MAAM,EAAE,MAAM,CAAC,WAAW,CAAC;IAC3B,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACrC,CAAC;AAWF,QAAA,MAAM,iBAAiB,GAAI,KAAK,MAAM,EAAE,YAAY,qBAAqB,oEAqCxE,CAAC;AAwFF,QAAA,MAAM,WAAW,GAAI,QAAQ,MAAM,CAAC,WAAW,EAAE,SAAS,MAAM,WAK/D,CAAC;AAqBF,OAAO,EAAE,iBAAiB,EAAE,WAAW,EAAE,CAAC"}
@@ -124,7 +124,9 @@ const pickSchema = (model)=>{
124
124
  'options',
125
125
  'pluginOptions',
126
126
  'attributes',
127
- 'kind'
127
+ 'kind',
128
+ 'indexes',
129
+ 'foreignKeys'
128
130
  ]));
129
131
  schema.kind = model.kind || 'collectionType';
130
132
  return schema;
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../../src/domain/content-type/index.ts"],"sourcesContent":["import { cloneDeep } from 'lodash/fp';\nimport _ from 'lodash';\nimport { yup, contentTypes as contentTypesUtils } from '@strapi/utils';\nimport type { Schema } from '@strapi/types';\nimport { validateContentTypeDefinition } from './validator';\n\nexport type ContentTypeDefinition = {\n schema: Schema.ContentType;\n actions: Record<string, unknown>;\n lifecycles: Record<string, unknown>;\n};\n\nconst {\n CREATED_AT_ATTRIBUTE,\n UPDATED_AT_ATTRIBUTE,\n PUBLISHED_AT_ATTRIBUTE,\n FIRST_PUBLISHED_AT_ATTRIBUTE,\n CREATED_BY_ATTRIBUTE,\n UPDATED_BY_ATTRIBUTE,\n} = contentTypesUtils.constants;\n\nconst createContentType = (uid: string, definition: ContentTypeDefinition) => {\n try {\n validateContentTypeDefinition(definition);\n } catch (e) {\n if (e instanceof yup.ValidationError) {\n throw new Error(`Content Type Definition is invalid for ${uid}'.\\n${e.errors}`);\n }\n\n throw e;\n }\n\n const { schema, actions, lifecycles } = cloneDeep(definition);\n\n // general info\n Object.assign(schema, {\n uid,\n modelType: 'contentType',\n kind: schema.kind || 'collectionType',\n __schema__: pickSchema(definition.schema),\n modelName: definition.schema.info.singularName,\n actions,\n lifecycles,\n });\n\n addTimestamps(schema);\n\n // Published at is added regardless of draft and publish being enabled\n // In case it is not enabled, value will be always published, and it will not contain a draft\n addDraftAndPublish(schema);\n\n addCreatorFields(schema);\n\n addFirstPublishedAt(schema);\n\n warnDraftAndPublishReservedAttributes(uid, schema);\n\n return schema;\n};\n\nconst warnDraftAndPublishReservedAttributes = (uid: string, schema: Schema.ContentType) => {\n if (schema.options?.draftAndPublish !== true) {\n return;\n }\n\n for (const attributeName of contentTypesUtils.findDraftAndPublishReservedAttributeNames(\n Object.keys(schema.attributes)\n )) {\n strapi.log.warn(\n contentTypesUtils.getDraftAndPublishReservedAttributeWarning(uid, attributeName)\n );\n }\n};\n\nconst addTimestamps = (schema: Schema.ContentType) => {\n // attributes\n Object.assign(schema.attributes, {\n [CREATED_AT_ATTRIBUTE]: {\n type: 'datetime',\n },\n // TODO: handle on edit set to new date\n [UPDATED_AT_ATTRIBUTE]: {\n type: 'datetime',\n },\n });\n};\n\nconst addDraftAndPublish = (schema: Schema.ContentType) => {\n if (!_.has(schema, 'options.draftAndPublish')) {\n _.set(schema, 'options.draftAndPublish', false); // Disabled by default\n }\n\n schema.attributes[PUBLISHED_AT_ATTRIBUTE] = {\n type: 'datetime',\n configurable: false,\n writable: true,\n visible: true,\n default() {\n return new Date();\n },\n };\n};\n\nconst addFirstPublishedAt = (schema: Schema.ContentType) => {\n const isEnabled = contentTypesUtils.hasFirstPublishedAtField(schema);\n\n // Note: As an expertimental feature, we are okay if this data is deleted if this feature is\n // switched off. Once \"preserve_attributes\" come into play, this will be updated.\n if (isEnabled) {\n strapi.log.warn(`Experimental feature enabled: firstPublishedAt on ${schema.collectionName}`);\n schema.attributes[FIRST_PUBLISHED_AT_ATTRIBUTE] = {\n type: 'datetime',\n configurable: false,\n writable: true,\n visible: false,\n private: !isEnabled,\n };\n }\n};\n\nconst addCreatorFields = (schema: Schema.ContentType) => {\n const isPrivate = !_.get(schema, 'options.populateCreatorFields', false);\n\n schema.attributes[CREATED_BY_ATTRIBUTE] = {\n type: 'relation',\n relation: 'oneToOne',\n target: 'admin::user',\n configurable: false,\n writable: false,\n visible: false,\n useJoinTable: false,\n private: isPrivate,\n };\n\n schema.attributes[UPDATED_BY_ATTRIBUTE] = {\n type: 'relation',\n relation: 'oneToOne',\n target: 'admin::user',\n configurable: false,\n writable: false,\n visible: false,\n useJoinTable: false,\n private: isPrivate,\n };\n};\n\nconst getGlobalId = (schema: Schema.ContentType, prefix?: string) => {\n const modelName = schema.info.singularName;\n const globalId = prefix ? `${prefix}-${modelName}` : modelName;\n\n return schema.globalId || _.upperFirst(_.camelCase(globalId));\n};\n\nconst pickSchema = (model: Schema.ContentType) => {\n const schema = _.cloneDeep(\n _.pick(model, [\n 'connection',\n 'collectionName',\n 'info',\n 'options',\n 'pluginOptions',\n 'attributes',\n 'kind',\n ])\n );\n\n schema.kind = model.kind || 'collectionType';\n return schema;\n};\n\nexport { createContentType, getGlobalId };\n"],"names":["CREATED_AT_ATTRIBUTE","UPDATED_AT_ATTRIBUTE","PUBLISHED_AT_ATTRIBUTE","FIRST_PUBLISHED_AT_ATTRIBUTE","CREATED_BY_ATTRIBUTE","UPDATED_BY_ATTRIBUTE","contentTypesUtils","constants","createContentType","uid","definition","validateContentTypeDefinition","e","yup","ValidationError","Error","errors","schema","actions","lifecycles","cloneDeep","Object","assign","modelType","kind","__schema__","pickSchema","modelName","info","singularName","addTimestamps","addDraftAndPublish","addCreatorFields","addFirstPublishedAt","warnDraftAndPublishReservedAttributes","options","draftAndPublish","attributeName","findDraftAndPublishReservedAttributeNames","keys","attributes","strapi","log","warn","getDraftAndPublishReservedAttributeWarning","type","_","has","set","configurable","writable","visible","default","Date","isEnabled","hasFirstPublishedAtField","collectionName","private","isPrivate","get","relation","target","useJoinTable","getGlobalId","prefix","globalId","upperFirst","camelCase","model","pick"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../../../src/domain/content-type/index.ts"],"sourcesContent":["import { cloneDeep } from 'lodash/fp';\nimport _ from 'lodash';\nimport { yup, contentTypes as contentTypesUtils } from '@strapi/utils';\nimport type { Schema } from '@strapi/types';\nimport { validateContentTypeDefinition } from './validator';\n\nexport type ContentTypeDefinition = {\n schema: Schema.ContentType;\n actions: Record<string, unknown>;\n lifecycles: Record<string, unknown>;\n};\n\nconst {\n CREATED_AT_ATTRIBUTE,\n UPDATED_AT_ATTRIBUTE,\n PUBLISHED_AT_ATTRIBUTE,\n FIRST_PUBLISHED_AT_ATTRIBUTE,\n CREATED_BY_ATTRIBUTE,\n UPDATED_BY_ATTRIBUTE,\n} = contentTypesUtils.constants;\n\nconst createContentType = (uid: string, definition: ContentTypeDefinition) => {\n try {\n validateContentTypeDefinition(definition);\n } catch (e) {\n if (e instanceof yup.ValidationError) {\n throw new Error(`Content Type Definition is invalid for ${uid}'.\\n${e.errors}`);\n }\n\n throw e;\n }\n\n const { schema, actions, lifecycles } = cloneDeep(definition);\n\n // general info\n Object.assign(schema, {\n uid,\n modelType: 'contentType',\n kind: schema.kind || 'collectionType',\n __schema__: pickSchema(definition.schema),\n modelName: definition.schema.info.singularName,\n actions,\n lifecycles,\n });\n\n addTimestamps(schema);\n\n // Published at is added regardless of draft and publish being enabled\n // In case it is not enabled, value will be always published, and it will not contain a draft\n addDraftAndPublish(schema);\n\n addCreatorFields(schema);\n\n addFirstPublishedAt(schema);\n\n warnDraftAndPublishReservedAttributes(uid, schema);\n\n return schema;\n};\n\nconst warnDraftAndPublishReservedAttributes = (uid: string, schema: Schema.ContentType) => {\n if (schema.options?.draftAndPublish !== true) {\n return;\n }\n\n for (const attributeName of contentTypesUtils.findDraftAndPublishReservedAttributeNames(\n Object.keys(schema.attributes)\n )) {\n strapi.log.warn(\n contentTypesUtils.getDraftAndPublishReservedAttributeWarning(uid, attributeName)\n );\n }\n};\n\nconst addTimestamps = (schema: Schema.ContentType) => {\n // attributes\n Object.assign(schema.attributes, {\n [CREATED_AT_ATTRIBUTE]: {\n type: 'datetime',\n },\n // TODO: handle on edit set to new date\n [UPDATED_AT_ATTRIBUTE]: {\n type: 'datetime',\n },\n });\n};\n\nconst addDraftAndPublish = (schema: Schema.ContentType) => {\n if (!_.has(schema, 'options.draftAndPublish')) {\n _.set(schema, 'options.draftAndPublish', false); // Disabled by default\n }\n\n schema.attributes[PUBLISHED_AT_ATTRIBUTE] = {\n type: 'datetime',\n configurable: false,\n writable: true,\n visible: true,\n default() {\n return new Date();\n },\n };\n};\n\nconst addFirstPublishedAt = (schema: Schema.ContentType) => {\n const isEnabled = contentTypesUtils.hasFirstPublishedAtField(schema);\n\n // Note: As an expertimental feature, we are okay if this data is deleted if this feature is\n // switched off. Once \"preserve_attributes\" come into play, this will be updated.\n if (isEnabled) {\n strapi.log.warn(`Experimental feature enabled: firstPublishedAt on ${schema.collectionName}`);\n schema.attributes[FIRST_PUBLISHED_AT_ATTRIBUTE] = {\n type: 'datetime',\n configurable: false,\n writable: true,\n visible: false,\n private: !isEnabled,\n };\n }\n};\n\nconst addCreatorFields = (schema: Schema.ContentType) => {\n const isPrivate = !_.get(schema, 'options.populateCreatorFields', false);\n\n schema.attributes[CREATED_BY_ATTRIBUTE] = {\n type: 'relation',\n relation: 'oneToOne',\n target: 'admin::user',\n configurable: false,\n writable: false,\n visible: false,\n useJoinTable: false,\n private: isPrivate,\n };\n\n schema.attributes[UPDATED_BY_ATTRIBUTE] = {\n type: 'relation',\n relation: 'oneToOne',\n target: 'admin::user',\n configurable: false,\n writable: false,\n visible: false,\n useJoinTable: false,\n private: isPrivate,\n };\n};\n\nconst getGlobalId = (schema: Schema.ContentType, prefix?: string) => {\n const modelName = schema.info.singularName;\n const globalId = prefix ? `${prefix}-${modelName}` : modelName;\n\n return schema.globalId || _.upperFirst(_.camelCase(globalId));\n};\n\nconst pickSchema = (model: Schema.ContentType) => {\n const schema = _.cloneDeep(\n _.pick(model, [\n 'connection',\n 'collectionName',\n 'info',\n 'options',\n 'pluginOptions',\n 'attributes',\n 'kind',\n 'indexes',\n 'foreignKeys',\n ])\n );\n\n schema.kind = model.kind || 'collectionType';\n return schema;\n};\n\nexport { createContentType, getGlobalId };\n"],"names":["CREATED_AT_ATTRIBUTE","UPDATED_AT_ATTRIBUTE","PUBLISHED_AT_ATTRIBUTE","FIRST_PUBLISHED_AT_ATTRIBUTE","CREATED_BY_ATTRIBUTE","UPDATED_BY_ATTRIBUTE","contentTypesUtils","constants","createContentType","uid","definition","validateContentTypeDefinition","e","yup","ValidationError","Error","errors","schema","actions","lifecycles","cloneDeep","Object","assign","modelType","kind","__schema__","pickSchema","modelName","info","singularName","addTimestamps","addDraftAndPublish","addCreatorFields","addFirstPublishedAt","warnDraftAndPublishReservedAttributes","options","draftAndPublish","attributeName","findDraftAndPublishReservedAttributeNames","keys","attributes","strapi","log","warn","getDraftAndPublishReservedAttributeWarning","type","_","has","set","configurable","writable","visible","default","Date","isEnabled","hasFirstPublishedAtField","collectionName","private","isPrivate","get","relation","target","useJoinTable","getGlobalId","prefix","globalId","upperFirst","camelCase","model","pick"],"mappings":";;;;;;;;;;;AAYA,MAAM,EACJA,oBAAoB,EACpBC,oBAAoB,EACpBC,sBAAsB,EACtBC,4BAA4B,EAC5BC,oBAAoB,EACpBC,oBAAoB,EACrB,GAAGC,yBAAkBC,SAAS;AAE/B,MAAMC,iBAAAA,GAAoB,CAACC,GAAAA,EAAaC,UAAAA,GAAAA;IACtC,IAAI;QACFC,uCAAAA,CAA8BD,UAAAA,CAAAA;AAChC,IAAA,CAAA,CAAE,OAAOE,CAAAA,EAAG;QACV,IAAIA,CAAAA,YAAaC,eAAAA,CAAIC,eAAe,EAAE;YACpC,MAAM,IAAIC,KAAAA,CAAM,CAAC,uCAAuC,EAAEN,IAAI,IAAI,EAAEG,CAAAA,CAAEI,MAAM,CAAA,CAAE,CAAA;AAChF,QAAA;QAEA,MAAMJ,CAAAA;AACR,IAAA;IAEA,MAAM,EAAEK,MAAM,EAAEC,OAAO,EAAEC,UAAU,EAAE,GAAGC,YAAAA,CAAUV,UAAAA,CAAAA;;IAGlDW,MAAAA,CAAOC,MAAM,CAACL,MAAAA,EAAQ;AACpBR,QAAAA,GAAAA;QACAc,SAAAA,EAAW,aAAA;QACXC,IAAAA,EAAMP,MAAAA,CAAOO,IAAI,IAAI,gBAAA;QACrBC,UAAAA,EAAYC,UAAAA,CAAWhB,WAAWO,MAAM,CAAA;AACxCU,QAAAA,SAAAA,EAAWjB,UAAAA,CAAWO,MAAM,CAACW,IAAI,CAACC,YAAY;AAC9CX,QAAAA,OAAAA;AACAC,QAAAA;AACF,KAAA,CAAA;IAEAW,aAAAA,CAAcb,MAAAA,CAAAA;;;IAIdc,kBAAAA,CAAmBd,MAAAA,CAAAA;IAEnBe,gBAAAA,CAAiBf,MAAAA,CAAAA;IAEjBgB,mBAAAA,CAAoBhB,MAAAA,CAAAA;AAEpBiB,IAAAA,qCAAAA,CAAsCzB,GAAAA,EAAKQ,MAAAA,CAAAA;IAE3C,OAAOA,MAAAA;AACT;AAEA,MAAMiB,qCAAAA,GAAwC,CAACzB,GAAAA,EAAaQ,MAAAA,GAAAA;AAC1D,IAAA,IAAIA,MAAAA,CAAOkB,OAAO,EAAEC,eAAAA,KAAoB,IAAA,EAAM;AAC5C,QAAA;AACF,IAAA;IAEA,KAAK,MAAMC,aAAAA,IAAiB/B,wBAAAA,CAAkBgC,yCAAyC,CACrFjB,OAAOkB,IAAI,CAACtB,MAAAA,CAAOuB,UAAU,CAAA,CAAA,CAC5B;AACDC,QAAAA,MAAAA,CAAOC,GAAG,CAACC,IAAI,CACbrC,wBAAAA,CAAkBsC,0CAA0C,CAACnC,GAAAA,EAAK4B,aAAAA,CAAAA,CAAAA;AAEtE,IAAA;AACF,CAAA;AAEA,MAAMP,gBAAgB,CAACb,MAAAA,GAAAA;;AAErBI,IAAAA,MAAAA,CAAOC,MAAM,CAACL,MAAAA,CAAOuB,UAAU,EAAE;AAC/B,QAAA,CAACxC,uBAAuB;YACtB6C,IAAAA,EAAM;AACR,SAAA;;AAEA,QAAA,CAAC5C,uBAAuB;YACtB4C,IAAAA,EAAM;AACR;AACF,KAAA,CAAA;AACF,CAAA;AAEA,MAAMd,qBAAqB,CAACd,MAAAA,GAAAA;AAC1B,IAAA,IAAI,CAAC6B,kBAAAA,CAAEC,GAAG,CAAC9B,QAAQ,yBAAA,CAAA,EAA4B;AAC7C6B,QAAAA,kBAAAA,CAAEE,GAAG,CAAC/B,MAAAA,EAAQ,yBAAA,EAA2B;AAC3C,IAAA;IAEAA,MAAAA,CAAOuB,UAAU,CAACtC,sBAAAA,CAAuB,GAAG;QAC1C2C,IAAAA,EAAM,UAAA;QACNI,YAAAA,EAAc,KAAA;QACdC,QAAAA,EAAU,IAAA;QACVC,OAAAA,EAAS,IAAA;AACTC,QAAAA,OAAAA,CAAAA,GAAAA;AACE,YAAA,OAAO,IAAIC,IAAAA,EAAAA;AACb,QAAA;AACF,KAAA;AACF,CAAA;AAEA,MAAMpB,sBAAsB,CAAChB,MAAAA,GAAAA;IAC3B,MAAMqC,SAAAA,GAAYhD,wBAAAA,CAAkBiD,wBAAwB,CAACtC,MAAAA,CAAAA;;;AAI7D,IAAA,IAAIqC,SAAAA,EAAW;QACbb,MAAAA,CAAOC,GAAG,CAACC,IAAI,CAAC,CAAC,kDAAkD,EAAE1B,MAAAA,CAAOuC,cAAc,CAAA,CAAE,CAAA;QAC5FvC,MAAAA,CAAOuB,UAAU,CAACrC,4BAAAA,CAA6B,GAAG;YAChD0C,IAAAA,EAAM,UAAA;YACNI,YAAAA,EAAc,KAAA;YACdC,QAAAA,EAAU,IAAA;YACVC,OAAAA,EAAS,KAAA;AACTM,YAAAA,OAAAA,EAAS,CAACH;AACZ,SAAA;AACF,IAAA;AACF,CAAA;AAEA,MAAMtB,mBAAmB,CAACf,MAAAA,GAAAA;AACxB,IAAA,MAAMyC,YAAY,CAACZ,kBAAAA,CAAEa,GAAG,CAAC1C,QAAQ,+BAAA,EAAiC,KAAA,CAAA;IAElEA,MAAAA,CAAOuB,UAAU,CAACpC,oBAAAA,CAAqB,GAAG;QACxCyC,IAAAA,EAAM,UAAA;QACNe,QAAAA,EAAU,UAAA;QACVC,MAAAA,EAAQ,aAAA;QACRZ,YAAAA,EAAc,KAAA;QACdC,QAAAA,EAAU,KAAA;QACVC,OAAAA,EAAS,KAAA;QACTW,YAAAA,EAAc,KAAA;QACdL,OAAAA,EAASC;AACX,KAAA;IAEAzC,MAAAA,CAAOuB,UAAU,CAACnC,oBAAAA,CAAqB,GAAG;QACxCwC,IAAAA,EAAM,UAAA;QACNe,QAAAA,EAAU,UAAA;QACVC,MAAAA,EAAQ,aAAA;QACRZ,YAAAA,EAAc,KAAA;QACdC,QAAAA,EAAU,KAAA;QACVC,OAAAA,EAAS,KAAA;QACTW,YAAAA,EAAc,KAAA;QACdL,OAAAA,EAASC;AACX,KAAA;AACF,CAAA;AAEA,MAAMK,WAAAA,GAAc,CAAC9C,MAAAA,EAA4B+C,MAAAA,GAAAA;AAC/C,IAAA,MAAMrC,SAAAA,GAAYV,MAAAA,CAAOW,IAAI,CAACC,YAAY;AAC1C,IAAA,MAAMoC,WAAWD,MAAAA,GAAS,CAAA,EAAGA,OAAO,CAAC,EAAErC,WAAW,GAAGA,SAAAA;IAErD,OAAOV,MAAAA,CAAOgD,QAAQ,IAAInB,kBAAAA,CAAEoB,UAAU,CAACpB,kBAAAA,CAAEqB,SAAS,CAACF,QAAAA,CAAAA,CAAAA;AACrD;AAEA,MAAMvC,aAAa,CAAC0C,KAAAA,GAAAA;AAClB,IAAA,MAAMnD,SAAS6B,kBAAAA,CAAE1B,SAAS,CACxB0B,kBAAAA,CAAEuB,IAAI,CAACD,KAAAA,EAAO;AACZ,QAAA,YAAA;AACA,QAAA,gBAAA;AACA,QAAA,MAAA;AACA,QAAA,SAAA;AACA,QAAA,eAAA;AACA,QAAA,YAAA;AACA,QAAA,MAAA;AACA,QAAA,SAAA;AACA,QAAA;AACD,KAAA,CAAA,CAAA;AAGHnD,IAAAA,MAAAA,CAAOO,IAAI,GAAG4C,KAAAA,CAAM5C,IAAI,IAAI,gBAAA;IAC5B,OAAOP,MAAAA;AACT,CAAA;;;;;"}
@@ -118,7 +118,9 @@ const pickSchema = (model)=>{
118
118
  'options',
119
119
  'pluginOptions',
120
120
  'attributes',
121
- 'kind'
121
+ 'kind',
122
+ 'indexes',
123
+ 'foreignKeys'
122
124
  ]));
123
125
  schema.kind = model.kind || 'collectionType';
124
126
  return schema;
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","sources":["../../../src/domain/content-type/index.ts"],"sourcesContent":["import { cloneDeep } from 'lodash/fp';\nimport _ from 'lodash';\nimport { yup, contentTypes as contentTypesUtils } from '@strapi/utils';\nimport type { Schema } from '@strapi/types';\nimport { validateContentTypeDefinition } from './validator';\n\nexport type ContentTypeDefinition = {\n schema: Schema.ContentType;\n actions: Record<string, unknown>;\n lifecycles: Record<string, unknown>;\n};\n\nconst {\n CREATED_AT_ATTRIBUTE,\n UPDATED_AT_ATTRIBUTE,\n PUBLISHED_AT_ATTRIBUTE,\n FIRST_PUBLISHED_AT_ATTRIBUTE,\n CREATED_BY_ATTRIBUTE,\n UPDATED_BY_ATTRIBUTE,\n} = contentTypesUtils.constants;\n\nconst createContentType = (uid: string, definition: ContentTypeDefinition) => {\n try {\n validateContentTypeDefinition(definition);\n } catch (e) {\n if (e instanceof yup.ValidationError) {\n throw new Error(`Content Type Definition is invalid for ${uid}'.\\n${e.errors}`);\n }\n\n throw e;\n }\n\n const { schema, actions, lifecycles } = cloneDeep(definition);\n\n // general info\n Object.assign(schema, {\n uid,\n modelType: 'contentType',\n kind: schema.kind || 'collectionType',\n __schema__: pickSchema(definition.schema),\n modelName: definition.schema.info.singularName,\n actions,\n lifecycles,\n });\n\n addTimestamps(schema);\n\n // Published at is added regardless of draft and publish being enabled\n // In case it is not enabled, value will be always published, and it will not contain a draft\n addDraftAndPublish(schema);\n\n addCreatorFields(schema);\n\n addFirstPublishedAt(schema);\n\n warnDraftAndPublishReservedAttributes(uid, schema);\n\n return schema;\n};\n\nconst warnDraftAndPublishReservedAttributes = (uid: string, schema: Schema.ContentType) => {\n if (schema.options?.draftAndPublish !== true) {\n return;\n }\n\n for (const attributeName of contentTypesUtils.findDraftAndPublishReservedAttributeNames(\n Object.keys(schema.attributes)\n )) {\n strapi.log.warn(\n contentTypesUtils.getDraftAndPublishReservedAttributeWarning(uid, attributeName)\n );\n }\n};\n\nconst addTimestamps = (schema: Schema.ContentType) => {\n // attributes\n Object.assign(schema.attributes, {\n [CREATED_AT_ATTRIBUTE]: {\n type: 'datetime',\n },\n // TODO: handle on edit set to new date\n [UPDATED_AT_ATTRIBUTE]: {\n type: 'datetime',\n },\n });\n};\n\nconst addDraftAndPublish = (schema: Schema.ContentType) => {\n if (!_.has(schema, 'options.draftAndPublish')) {\n _.set(schema, 'options.draftAndPublish', false); // Disabled by default\n }\n\n schema.attributes[PUBLISHED_AT_ATTRIBUTE] = {\n type: 'datetime',\n configurable: false,\n writable: true,\n visible: true,\n default() {\n return new Date();\n },\n };\n};\n\nconst addFirstPublishedAt = (schema: Schema.ContentType) => {\n const isEnabled = contentTypesUtils.hasFirstPublishedAtField(schema);\n\n // Note: As an expertimental feature, we are okay if this data is deleted if this feature is\n // switched off. Once \"preserve_attributes\" come into play, this will be updated.\n if (isEnabled) {\n strapi.log.warn(`Experimental feature enabled: firstPublishedAt on ${schema.collectionName}`);\n schema.attributes[FIRST_PUBLISHED_AT_ATTRIBUTE] = {\n type: 'datetime',\n configurable: false,\n writable: true,\n visible: false,\n private: !isEnabled,\n };\n }\n};\n\nconst addCreatorFields = (schema: Schema.ContentType) => {\n const isPrivate = !_.get(schema, 'options.populateCreatorFields', false);\n\n schema.attributes[CREATED_BY_ATTRIBUTE] = {\n type: 'relation',\n relation: 'oneToOne',\n target: 'admin::user',\n configurable: false,\n writable: false,\n visible: false,\n useJoinTable: false,\n private: isPrivate,\n };\n\n schema.attributes[UPDATED_BY_ATTRIBUTE] = {\n type: 'relation',\n relation: 'oneToOne',\n target: 'admin::user',\n configurable: false,\n writable: false,\n visible: false,\n useJoinTable: false,\n private: isPrivate,\n };\n};\n\nconst getGlobalId = (schema: Schema.ContentType, prefix?: string) => {\n const modelName = schema.info.singularName;\n const globalId = prefix ? `${prefix}-${modelName}` : modelName;\n\n return schema.globalId || _.upperFirst(_.camelCase(globalId));\n};\n\nconst pickSchema = (model: Schema.ContentType) => {\n const schema = _.cloneDeep(\n _.pick(model, [\n 'connection',\n 'collectionName',\n 'info',\n 'options',\n 'pluginOptions',\n 'attributes',\n 'kind',\n ])\n );\n\n schema.kind = model.kind || 'collectionType';\n return schema;\n};\n\nexport { createContentType, getGlobalId };\n"],"names":["CREATED_AT_ATTRIBUTE","UPDATED_AT_ATTRIBUTE","PUBLISHED_AT_ATTRIBUTE","FIRST_PUBLISHED_AT_ATTRIBUTE","CREATED_BY_ATTRIBUTE","UPDATED_BY_ATTRIBUTE","contentTypesUtils","constants","createContentType","uid","definition","validateContentTypeDefinition","e","yup","ValidationError","Error","errors","schema","actions","lifecycles","cloneDeep","Object","assign","modelType","kind","__schema__","pickSchema","modelName","info","singularName","addTimestamps","addDraftAndPublish","addCreatorFields","addFirstPublishedAt","warnDraftAndPublishReservedAttributes","options","draftAndPublish","attributeName","findDraftAndPublishReservedAttributeNames","keys","attributes","strapi","log","warn","getDraftAndPublishReservedAttributeWarning","type","_","has","set","configurable","writable","visible","default","Date","isEnabled","hasFirstPublishedAtField","collectionName","private","isPrivate","get","relation","target","useJoinTable","getGlobalId","prefix","globalId","upperFirst","camelCase","model","pick"],"mappings":";;;;;AAYA,MAAM,EACJA,oBAAoB,EACpBC,oBAAoB,EACpBC,sBAAsB,EACtBC,4BAA4B,EAC5BC,oBAAoB,EACpBC,oBAAoB,EACrB,GAAGC,aAAkBC,SAAS;AAE/B,MAAMC,iBAAAA,GAAoB,CAACC,GAAAA,EAAaC,UAAAA,GAAAA;IACtC,IAAI;QACFC,6BAAAA,CAA8BD,UAAAA,CAAAA;AAChC,IAAA,CAAA,CAAE,OAAOE,CAAAA,EAAG;QACV,IAAIA,CAAAA,YAAaC,GAAAA,CAAIC,eAAe,EAAE;YACpC,MAAM,IAAIC,KAAAA,CAAM,CAAC,uCAAuC,EAAEN,IAAI,IAAI,EAAEG,CAAAA,CAAEI,MAAM,CAAA,CAAE,CAAA;AAChF,QAAA;QAEA,MAAMJ,CAAAA;AACR,IAAA;IAEA,MAAM,EAAEK,MAAM,EAAEC,OAAO,EAAEC,UAAU,EAAE,GAAGC,SAAAA,CAAUV,UAAAA,CAAAA;;IAGlDW,MAAAA,CAAOC,MAAM,CAACL,MAAAA,EAAQ;AACpBR,QAAAA,GAAAA;QACAc,SAAAA,EAAW,aAAA;QACXC,IAAAA,EAAMP,MAAAA,CAAOO,IAAI,IAAI,gBAAA;QACrBC,UAAAA,EAAYC,UAAAA,CAAWhB,WAAWO,MAAM,CAAA;AACxCU,QAAAA,SAAAA,EAAWjB,UAAAA,CAAWO,MAAM,CAACW,IAAI,CAACC,YAAY;AAC9CX,QAAAA,OAAAA;AACAC,QAAAA;AACF,KAAA,CAAA;IAEAW,aAAAA,CAAcb,MAAAA,CAAAA;;;IAIdc,kBAAAA,CAAmBd,MAAAA,CAAAA;IAEnBe,gBAAAA,CAAiBf,MAAAA,CAAAA;IAEjBgB,mBAAAA,CAAoBhB,MAAAA,CAAAA;AAEpBiB,IAAAA,qCAAAA,CAAsCzB,GAAAA,EAAKQ,MAAAA,CAAAA;IAE3C,OAAOA,MAAAA;AACT;AAEA,MAAMiB,qCAAAA,GAAwC,CAACzB,GAAAA,EAAaQ,MAAAA,GAAAA;AAC1D,IAAA,IAAIA,MAAAA,CAAOkB,OAAO,EAAEC,eAAAA,KAAoB,IAAA,EAAM;AAC5C,QAAA;AACF,IAAA;IAEA,KAAK,MAAMC,aAAAA,IAAiB/B,YAAAA,CAAkBgC,yCAAyC,CACrFjB,OAAOkB,IAAI,CAACtB,MAAAA,CAAOuB,UAAU,CAAA,CAAA,CAC5B;AACDC,QAAAA,MAAAA,CAAOC,GAAG,CAACC,IAAI,CACbrC,YAAAA,CAAkBsC,0CAA0C,CAACnC,GAAAA,EAAK4B,aAAAA,CAAAA,CAAAA;AAEtE,IAAA;AACF,CAAA;AAEA,MAAMP,gBAAgB,CAACb,MAAAA,GAAAA;;AAErBI,IAAAA,MAAAA,CAAOC,MAAM,CAACL,MAAAA,CAAOuB,UAAU,EAAE;AAC/B,QAAA,CAACxC,uBAAuB;YACtB6C,IAAAA,EAAM;AACR,SAAA;;AAEA,QAAA,CAAC5C,uBAAuB;YACtB4C,IAAAA,EAAM;AACR;AACF,KAAA,CAAA;AACF,CAAA;AAEA,MAAMd,qBAAqB,CAACd,MAAAA,GAAAA;AAC1B,IAAA,IAAI,CAAC6B,CAAAA,CAAEC,GAAG,CAAC9B,QAAQ,yBAAA,CAAA,EAA4B;AAC7C6B,QAAAA,CAAAA,CAAEE,GAAG,CAAC/B,MAAAA,EAAQ,yBAAA,EAA2B;AAC3C,IAAA;IAEAA,MAAAA,CAAOuB,UAAU,CAACtC,sBAAAA,CAAuB,GAAG;QAC1C2C,IAAAA,EAAM,UAAA;QACNI,YAAAA,EAAc,KAAA;QACdC,QAAAA,EAAU,IAAA;QACVC,OAAAA,EAAS,IAAA;AACTC,QAAAA,OAAAA,CAAAA,GAAAA;AACE,YAAA,OAAO,IAAIC,IAAAA,EAAAA;AACb,QAAA;AACF,KAAA;AACF,CAAA;AAEA,MAAMpB,sBAAsB,CAAChB,MAAAA,GAAAA;IAC3B,MAAMqC,SAAAA,GAAYhD,YAAAA,CAAkBiD,wBAAwB,CAACtC,MAAAA,CAAAA;;;AAI7D,IAAA,IAAIqC,SAAAA,EAAW;QACbb,MAAAA,CAAOC,GAAG,CAACC,IAAI,CAAC,CAAC,kDAAkD,EAAE1B,MAAAA,CAAOuC,cAAc,CAAA,CAAE,CAAA;QAC5FvC,MAAAA,CAAOuB,UAAU,CAACrC,4BAAAA,CAA6B,GAAG;YAChD0C,IAAAA,EAAM,UAAA;YACNI,YAAAA,EAAc,KAAA;YACdC,QAAAA,EAAU,IAAA;YACVC,OAAAA,EAAS,KAAA;AACTM,YAAAA,OAAAA,EAAS,CAACH;AACZ,SAAA;AACF,IAAA;AACF,CAAA;AAEA,MAAMtB,mBAAmB,CAACf,MAAAA,GAAAA;AACxB,IAAA,MAAMyC,YAAY,CAACZ,CAAAA,CAAEa,GAAG,CAAC1C,QAAQ,+BAAA,EAAiC,KAAA,CAAA;IAElEA,MAAAA,CAAOuB,UAAU,CAACpC,oBAAAA,CAAqB,GAAG;QACxCyC,IAAAA,EAAM,UAAA;QACNe,QAAAA,EAAU,UAAA;QACVC,MAAAA,EAAQ,aAAA;QACRZ,YAAAA,EAAc,KAAA;QACdC,QAAAA,EAAU,KAAA;QACVC,OAAAA,EAAS,KAAA;QACTW,YAAAA,EAAc,KAAA;QACdL,OAAAA,EAASC;AACX,KAAA;IAEAzC,MAAAA,CAAOuB,UAAU,CAACnC,oBAAAA,CAAqB,GAAG;QACxCwC,IAAAA,EAAM,UAAA;QACNe,QAAAA,EAAU,UAAA;QACVC,MAAAA,EAAQ,aAAA;QACRZ,YAAAA,EAAc,KAAA;QACdC,QAAAA,EAAU,KAAA;QACVC,OAAAA,EAAS,KAAA;QACTW,YAAAA,EAAc,KAAA;QACdL,OAAAA,EAASC;AACX,KAAA;AACF,CAAA;AAEA,MAAMK,WAAAA,GAAc,CAAC9C,MAAAA,EAA4B+C,MAAAA,GAAAA;AAC/C,IAAA,MAAMrC,SAAAA,GAAYV,MAAAA,CAAOW,IAAI,CAACC,YAAY;AAC1C,IAAA,MAAMoC,WAAWD,MAAAA,GAAS,CAAA,EAAGA,OAAO,CAAC,EAAErC,WAAW,GAAGA,SAAAA;IAErD,OAAOV,MAAAA,CAAOgD,QAAQ,IAAInB,CAAAA,CAAEoB,UAAU,CAACpB,CAAAA,CAAEqB,SAAS,CAACF,QAAAA,CAAAA,CAAAA;AACrD;AAEA,MAAMvC,aAAa,CAAC0C,KAAAA,GAAAA;AAClB,IAAA,MAAMnD,SAAS6B,CAAAA,CAAE1B,SAAS,CACxB0B,CAAAA,CAAEuB,IAAI,CAACD,KAAAA,EAAO;AACZ,QAAA,YAAA;AACA,QAAA,gBAAA;AACA,QAAA,MAAA;AACA,QAAA,SAAA;AACA,QAAA,eAAA;AACA,QAAA,YAAA;AACA,QAAA;AACD,KAAA,CAAA,CAAA;AAGHnD,IAAAA,MAAAA,CAAOO,IAAI,GAAG4C,KAAAA,CAAM5C,IAAI,IAAI,gBAAA;IAC5B,OAAOP,MAAAA;AACT,CAAA;;;;"}
1
+ {"version":3,"file":"index.mjs","sources":["../../../src/domain/content-type/index.ts"],"sourcesContent":["import { cloneDeep } from 'lodash/fp';\nimport _ from 'lodash';\nimport { yup, contentTypes as contentTypesUtils } from '@strapi/utils';\nimport type { Schema } from '@strapi/types';\nimport { validateContentTypeDefinition } from './validator';\n\nexport type ContentTypeDefinition = {\n schema: Schema.ContentType;\n actions: Record<string, unknown>;\n lifecycles: Record<string, unknown>;\n};\n\nconst {\n CREATED_AT_ATTRIBUTE,\n UPDATED_AT_ATTRIBUTE,\n PUBLISHED_AT_ATTRIBUTE,\n FIRST_PUBLISHED_AT_ATTRIBUTE,\n CREATED_BY_ATTRIBUTE,\n UPDATED_BY_ATTRIBUTE,\n} = contentTypesUtils.constants;\n\nconst createContentType = (uid: string, definition: ContentTypeDefinition) => {\n try {\n validateContentTypeDefinition(definition);\n } catch (e) {\n if (e instanceof yup.ValidationError) {\n throw new Error(`Content Type Definition is invalid for ${uid}'.\\n${e.errors}`);\n }\n\n throw e;\n }\n\n const { schema, actions, lifecycles } = cloneDeep(definition);\n\n // general info\n Object.assign(schema, {\n uid,\n modelType: 'contentType',\n kind: schema.kind || 'collectionType',\n __schema__: pickSchema(definition.schema),\n modelName: definition.schema.info.singularName,\n actions,\n lifecycles,\n });\n\n addTimestamps(schema);\n\n // Published at is added regardless of draft and publish being enabled\n // In case it is not enabled, value will be always published, and it will not contain a draft\n addDraftAndPublish(schema);\n\n addCreatorFields(schema);\n\n addFirstPublishedAt(schema);\n\n warnDraftAndPublishReservedAttributes(uid, schema);\n\n return schema;\n};\n\nconst warnDraftAndPublishReservedAttributes = (uid: string, schema: Schema.ContentType) => {\n if (schema.options?.draftAndPublish !== true) {\n return;\n }\n\n for (const attributeName of contentTypesUtils.findDraftAndPublishReservedAttributeNames(\n Object.keys(schema.attributes)\n )) {\n strapi.log.warn(\n contentTypesUtils.getDraftAndPublishReservedAttributeWarning(uid, attributeName)\n );\n }\n};\n\nconst addTimestamps = (schema: Schema.ContentType) => {\n // attributes\n Object.assign(schema.attributes, {\n [CREATED_AT_ATTRIBUTE]: {\n type: 'datetime',\n },\n // TODO: handle on edit set to new date\n [UPDATED_AT_ATTRIBUTE]: {\n type: 'datetime',\n },\n });\n};\n\nconst addDraftAndPublish = (schema: Schema.ContentType) => {\n if (!_.has(schema, 'options.draftAndPublish')) {\n _.set(schema, 'options.draftAndPublish', false); // Disabled by default\n }\n\n schema.attributes[PUBLISHED_AT_ATTRIBUTE] = {\n type: 'datetime',\n configurable: false,\n writable: true,\n visible: true,\n default() {\n return new Date();\n },\n };\n};\n\nconst addFirstPublishedAt = (schema: Schema.ContentType) => {\n const isEnabled = contentTypesUtils.hasFirstPublishedAtField(schema);\n\n // Note: As an expertimental feature, we are okay if this data is deleted if this feature is\n // switched off. Once \"preserve_attributes\" come into play, this will be updated.\n if (isEnabled) {\n strapi.log.warn(`Experimental feature enabled: firstPublishedAt on ${schema.collectionName}`);\n schema.attributes[FIRST_PUBLISHED_AT_ATTRIBUTE] = {\n type: 'datetime',\n configurable: false,\n writable: true,\n visible: false,\n private: !isEnabled,\n };\n }\n};\n\nconst addCreatorFields = (schema: Schema.ContentType) => {\n const isPrivate = !_.get(schema, 'options.populateCreatorFields', false);\n\n schema.attributes[CREATED_BY_ATTRIBUTE] = {\n type: 'relation',\n relation: 'oneToOne',\n target: 'admin::user',\n configurable: false,\n writable: false,\n visible: false,\n useJoinTable: false,\n private: isPrivate,\n };\n\n schema.attributes[UPDATED_BY_ATTRIBUTE] = {\n type: 'relation',\n relation: 'oneToOne',\n target: 'admin::user',\n configurable: false,\n writable: false,\n visible: false,\n useJoinTable: false,\n private: isPrivate,\n };\n};\n\nconst getGlobalId = (schema: Schema.ContentType, prefix?: string) => {\n const modelName = schema.info.singularName;\n const globalId = prefix ? `${prefix}-${modelName}` : modelName;\n\n return schema.globalId || _.upperFirst(_.camelCase(globalId));\n};\n\nconst pickSchema = (model: Schema.ContentType) => {\n const schema = _.cloneDeep(\n _.pick(model, [\n 'connection',\n 'collectionName',\n 'info',\n 'options',\n 'pluginOptions',\n 'attributes',\n 'kind',\n 'indexes',\n 'foreignKeys',\n ])\n );\n\n schema.kind = model.kind || 'collectionType';\n return schema;\n};\n\nexport { createContentType, getGlobalId };\n"],"names":["CREATED_AT_ATTRIBUTE","UPDATED_AT_ATTRIBUTE","PUBLISHED_AT_ATTRIBUTE","FIRST_PUBLISHED_AT_ATTRIBUTE","CREATED_BY_ATTRIBUTE","UPDATED_BY_ATTRIBUTE","contentTypesUtils","constants","createContentType","uid","definition","validateContentTypeDefinition","e","yup","ValidationError","Error","errors","schema","actions","lifecycles","cloneDeep","Object","assign","modelType","kind","__schema__","pickSchema","modelName","info","singularName","addTimestamps","addDraftAndPublish","addCreatorFields","addFirstPublishedAt","warnDraftAndPublishReservedAttributes","options","draftAndPublish","attributeName","findDraftAndPublishReservedAttributeNames","keys","attributes","strapi","log","warn","getDraftAndPublishReservedAttributeWarning","type","_","has","set","configurable","writable","visible","default","Date","isEnabled","hasFirstPublishedAtField","collectionName","private","isPrivate","get","relation","target","useJoinTable","getGlobalId","prefix","globalId","upperFirst","camelCase","model","pick"],"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 = "5.53.0";
6
+ var version = "5.54.0";
7
7
  var description = "Core of Strapi";
8
8
  var homepage = "https://strapi.io";
9
9
  var bugs = {
@@ -66,15 +66,15 @@ var dependencies = {
66
66
  "@modelcontextprotocol/node": "2.0.0",
67
67
  "@modelcontextprotocol/server": "2.0.0",
68
68
  "@paralleldrive/cuid2": "2.2.2",
69
- "@strapi/admin": "5.53.0",
70
- "@strapi/database": "5.53.0",
71
- "@strapi/generators": "5.53.0",
72
- "@strapi/logger": "5.53.0",
73
- "@strapi/openapi": "5.53.0",
74
- "@strapi/permissions": "5.53.0",
75
- "@strapi/types": "5.53.0",
76
- "@strapi/typescript-utils": "5.53.0",
77
- "@strapi/utils": "5.53.0",
69
+ "@strapi/admin": "5.54.0",
70
+ "@strapi/database": "5.54.0",
71
+ "@strapi/generators": "5.54.0",
72
+ "@strapi/logger": "5.54.0",
73
+ "@strapi/openapi": "5.54.0",
74
+ "@strapi/permissions": "5.54.0",
75
+ "@strapi/types": "5.54.0",
76
+ "@strapi/typescript-utils": "5.54.0",
77
+ "@strapi/utils": "5.54.0",
78
78
  "@vercel/stega": "0.1.2",
79
79
  bcryptjs: "2.4.3",
80
80
  boxen: "5.1.2",
@@ -83,6 +83,7 @@ var dependencies = {
83
83
  "cli-table3": "0.6.5",
84
84
  commander: "8.3.0",
85
85
  configstore: "5.0.1",
86
+ croner: "10.0.1",
86
87
  debug: "4.3.4",
87
88
  delegates: "1.0.0",
88
89
  dotenv: "16.6.1",
@@ -107,7 +108,6 @@ var dependencies = {
107
108
  "koa-static": "5.0.0",
108
109
  lodash: "4.18.1",
109
110
  "mime-types": "2.1.35",
110
- "node-schedule": "2.1.1",
111
111
  open: "8.4.2",
112
112
  ora: "5.4.1",
113
113
  "package-json": "10.0.1",
@@ -138,15 +138,14 @@ var devDependencies = {
138
138
  "@types/lodash": "^4.14.191",
139
139
  "@types/mime-types": "2.1.1",
140
140
  "@types/node": "20.19.41",
141
- "@types/node-schedule": "2.1.7",
142
141
  ajv: "8.20.0",
143
142
  "ajv-formats": "3.0.1",
144
- "eslint-config-custom": "5.53.0",
143
+ "eslint-config-custom": "5.54.0",
145
144
  jest: "29.6.0",
146
145
  supertest: "7.2.2",
147
- tsconfig: "5.53.0",
146
+ tsconfig: "5.54.0",
148
147
  vitest: "catalog:",
149
- "vitest-config": "5.53.0"
148
+ "vitest-config": "5.54.0"
150
149
  };
151
150
  var engines = {
152
151
  node: ">=20.0.0 <=26.x.x",
@@ -1 +1 @@
1
- {"version":3,"file":"package.json.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"package.json.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -1,5 +1,5 @@
1
1
  var name = "@strapi/core";
2
- var version = "5.53.0";
2
+ var version = "5.54.0";
3
3
  var description = "Core of Strapi";
4
4
  var homepage = "https://strapi.io";
5
5
  var bugs = {
@@ -62,15 +62,15 @@ var dependencies = {
62
62
  "@modelcontextprotocol/node": "2.0.0",
63
63
  "@modelcontextprotocol/server": "2.0.0",
64
64
  "@paralleldrive/cuid2": "2.2.2",
65
- "@strapi/admin": "5.53.0",
66
- "@strapi/database": "5.53.0",
67
- "@strapi/generators": "5.53.0",
68
- "@strapi/logger": "5.53.0",
69
- "@strapi/openapi": "5.53.0",
70
- "@strapi/permissions": "5.53.0",
71
- "@strapi/types": "5.53.0",
72
- "@strapi/typescript-utils": "5.53.0",
73
- "@strapi/utils": "5.53.0",
65
+ "@strapi/admin": "5.54.0",
66
+ "@strapi/database": "5.54.0",
67
+ "@strapi/generators": "5.54.0",
68
+ "@strapi/logger": "5.54.0",
69
+ "@strapi/openapi": "5.54.0",
70
+ "@strapi/permissions": "5.54.0",
71
+ "@strapi/types": "5.54.0",
72
+ "@strapi/typescript-utils": "5.54.0",
73
+ "@strapi/utils": "5.54.0",
74
74
  "@vercel/stega": "0.1.2",
75
75
  bcryptjs: "2.4.3",
76
76
  boxen: "5.1.2",
@@ -79,6 +79,7 @@ var dependencies = {
79
79
  "cli-table3": "0.6.5",
80
80
  commander: "8.3.0",
81
81
  configstore: "5.0.1",
82
+ croner: "10.0.1",
82
83
  debug: "4.3.4",
83
84
  delegates: "1.0.0",
84
85
  dotenv: "16.6.1",
@@ -103,7 +104,6 @@ var dependencies = {
103
104
  "koa-static": "5.0.0",
104
105
  lodash: "4.18.1",
105
106
  "mime-types": "2.1.35",
106
- "node-schedule": "2.1.1",
107
107
  open: "8.4.2",
108
108
  ora: "5.4.1",
109
109
  "package-json": "10.0.1",
@@ -134,15 +134,14 @@ var devDependencies = {
134
134
  "@types/lodash": "^4.14.191",
135
135
  "@types/mime-types": "2.1.1",
136
136
  "@types/node": "20.19.41",
137
- "@types/node-schedule": "2.1.7",
138
137
  ajv: "8.20.0",
139
138
  "ajv-formats": "3.0.1",
140
- "eslint-config-custom": "5.53.0",
139
+ "eslint-config-custom": "5.54.0",
141
140
  jest: "29.6.0",
142
141
  supertest: "7.2.2",
143
- tsconfig: "5.53.0",
142
+ tsconfig: "5.54.0",
144
143
  vitest: "catalog:",
145
- "vitest-config": "5.53.0"
144
+ "vitest-config": "5.54.0"
146
145
  };
147
146
  var engines = {
148
147
  node: ">=20.0.0 <=26.x.x",
@@ -1 +1 @@
1
- {"version":3,"file":"package.json.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"package.json.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -4,10 +4,22 @@ interface EncodingInfo {
4
4
  data: any;
5
5
  schema: Struct.Schema;
6
6
  }
7
+ type BlocksEncodeMetadata = Omit<FieldContentSourceMap, 'path' | 'type'> & {
8
+ fieldPath: string;
9
+ };
10
+ type EncodeFieldFn = (text: string, metadata: FieldContentSourceMap) => string;
11
+ /**
12
+ * Pure transformation over a blocks AST. Injects one stega marker per visual block
13
+ * (first text leaf, or image alt text) using the blocks field path for all markers.
14
+ * Code blocks are skipped entirely.
15
+ */
16
+ declare const encodeBlocks: (blocks: unknown, metadata: BlocksEncodeMetadata, encodeField: EncodeFieldFn) => unknown;
7
17
  declare const createContentSourceMapsService: (strapi: Core.Strapi) => {
8
- encodeField(text: string, { kind, model, documentId, type, path, locale }: FieldContentSourceMap): string;
18
+ encodeField(text: string, { kind, model, documentId, type, path, locale, fieldPath }: FieldContentSourceMap): string;
19
+ encodeBlocks(blocks: unknown, metadata: BlocksEncodeMetadata): unknown;
9
20
  encodeEntry({ data, schema }: EncodingInfo): Promise<any>;
10
21
  encodeSourceMaps({ data, schema }: EncodingInfo): Promise<any>;
11
22
  };
12
- export { createContentSourceMapsService };
23
+ export { createContentSourceMapsService, encodeBlocks };
24
+ export type { BlocksEncodeMetadata, EncodeFieldFn };
13
25
  //# 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,EAAO,MAAM,eAAe,CAAC;AAEvD,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AAwCxE,UAAU,YAAY;IACpB,IAAI,EAAE,GAAG,CAAC;IACV,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC;CACvB;AAMD,QAAA,MAAM,8BAA8B,GAAI,QAAQ,IAAI,CAAC,MAAM;sBAG/C,MAAM,mDACqC,qBAAqB;kCAiCpC,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC;uCA6CtB,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC;CAmBvE,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;AAEvD,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AA0CxE,UAAU,YAAY;IACpB,IAAI,EAAE,GAAG,CAAC;IACV,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC;CACvB;AAED,KAAK,oBAAoB,GAAG,IAAI,CAAC,qBAAqB,EAAE,MAAM,GAAG,MAAM,CAAC,GAAG;IAAE,SAAS,EAAE,MAAM,CAAA;CAAE,CAAC;AAEjG,KAAK,aAAa,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,qBAAqB,KAAK,MAAM,CAAC;AA4G/E;;;;GAIG;AACH,QAAA,MAAM,YAAY,GAChB,QAAQ,OAAO,EACf,UAAU,oBAAoB,EAC9B,aAAa,aAAa,KACzB,OA0BF,CAAC;AAEF,QAAA,MAAM,8BAA8B,GAAI,QAAQ,IAAI,CAAC,MAAM;sBAG/C,MAAM,8DACgD,qBAAqB;yBAoC9D,OAAO,YAAY,oBAAoB,GAAG,OAAO;kCAIlC,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC;uCA4DtB,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC;CAmBvE,CAAC;AAEF,OAAO,EAAE,8BAA8B,EAAE,YAAY,EAAE,CAAC;AACxD,YAAY,EAAE,oBAAoB,EAAE,aAAa,EAAE,CAAC"}
@@ -34,9 +34,124 @@ const EXCLUDED_FIELDS = [
34
34
  const isObject = (value)=>{
35
35
  return typeof value === 'object' && value !== null;
36
36
  };
37
+ const blocksFieldMetadata = (metadata)=>({
38
+ ...metadata,
39
+ path: metadata.fieldPath,
40
+ type: 'blocks'
41
+ });
42
+ /**
43
+ * Walk a subtree depth-first and stega-encode the first `{ type: 'text', text }` leaf only.
44
+ */ const encodeFirstTextLeaf = (node, metadata, encodeField)=>{
45
+ if (!isObject(node)) {
46
+ return {
47
+ node,
48
+ encoded: false
49
+ };
50
+ }
51
+ if (node.type === 'text' && typeof node.text === 'string') {
52
+ return {
53
+ node: {
54
+ ...node,
55
+ text: encodeField(node.text, blocksFieldMetadata(metadata))
56
+ },
57
+ encoded: true
58
+ };
59
+ }
60
+ if (Array.isArray(node.children)) {
61
+ let encoded = false;
62
+ const children = node.children.map((child)=>{
63
+ if (encoded) {
64
+ return child;
65
+ }
66
+ const result = encodeFirstTextLeaf(child, metadata, encodeField);
67
+ encoded = result.encoded;
68
+ return result.node;
69
+ });
70
+ return {
71
+ node: {
72
+ ...node,
73
+ children
74
+ },
75
+ encoded
76
+ };
77
+ }
78
+ return {
79
+ node,
80
+ encoded: false
81
+ };
82
+ };
83
+ const encodeListBlock = (listNode, metadata, encodeField)=>{
84
+ const children = listNode.children.map((child)=>{
85
+ if (!isObject(child)) {
86
+ return child;
87
+ }
88
+ if (child.type === 'list-item') {
89
+ return encodeFirstTextLeaf(child, metadata, encodeField).node;
90
+ }
91
+ if (child.type === 'list') {
92
+ return encodeListBlock(child, metadata, encodeField);
93
+ }
94
+ return child;
95
+ });
96
+ return {
97
+ ...listNode,
98
+ children
99
+ };
100
+ };
101
+ const encodeImageBlock = (imageNode, metadata, encodeField)=>{
102
+ if (!isObject(imageNode.image)) {
103
+ return imageNode;
104
+ }
105
+ const { alternativeText } = imageNode.image;
106
+ // Encode the alt text (not the URL). Encoding the URL corrupts the src attribute and can
107
+ // cause the preview highlight to expand across the entire page. The alt attribute is a
108
+ // safe target: it's visible to the previewScript via getAttribute and never used as a URL.
109
+ // Only encode when alternativeText is a non-empty string — images with no alt text get
110
+ // no stega marker and won't independently trigger the highlight, but the blocks field
111
+ // as a whole remains highlightable via its other (text) blocks.
112
+ if (typeof alternativeText !== 'string' || alternativeText.length === 0) {
113
+ return imageNode;
114
+ }
115
+ return {
116
+ ...imageNode,
117
+ image: {
118
+ ...imageNode.image,
119
+ alternativeText: encodeField(alternativeText, blocksFieldMetadata(metadata))
120
+ }
121
+ };
122
+ };
123
+ /**
124
+ * Pure transformation over a blocks AST. Injects one stega marker per visual block
125
+ * (first text leaf, or image alt text) using the blocks field path for all markers.
126
+ * Code blocks are skipped entirely.
127
+ */ const encodeBlocks = (blocks, metadata, encodeField)=>{
128
+ if (!Array.isArray(blocks)) {
129
+ return blocks;
130
+ }
131
+ return blocks.map((block)=>{
132
+ if (!isObject(block)) {
133
+ return block;
134
+ }
135
+ switch(block.type){
136
+ case 'code':
137
+ // Skip encoding — encoding code content would corrupt the syntax.
138
+ return block;
139
+ case 'image':
140
+ return encodeImageBlock(block, metadata, encodeField);
141
+ case 'list':
142
+ return encodeListBlock(block, metadata, encodeField);
143
+ case 'paragraph':
144
+ case 'heading':
145
+ case 'quote':
146
+ return encodeFirstTextLeaf(block, metadata, encodeField).node;
147
+ default:
148
+ return block;
149
+ }
150
+ });
151
+ };
37
152
  const createContentSourceMapsService = (strapi)=>{
38
153
  return {
39
- encodeField (text, { kind, model, documentId, type, path, locale }) {
154
+ encodeField (text, { kind, model, documentId, type, path, locale, fieldPath }) {
40
155
  /**
41
156
  * Combine all metadata into into a one string so we only have to deal with one data-atribute
42
157
  * on the frontend. Make it human readable because that data-attribute may be set manually by
@@ -54,11 +169,17 @@ const createContentSourceMapsService = (strapi)=>{
54
169
  if (locale) {
55
170
  strapiSource.set('locale', locale);
56
171
  }
172
+ if (fieldPath) {
173
+ strapiSource.set('fieldPath', fieldPath);
174
+ }
57
175
  const encoded = stega.vercelStegaCombine(text, {
58
176
  strapiSource: strapiSource.toString()
59
177
  }, false);
60
178
  return encoded;
61
179
  },
180
+ encodeBlocks (blocks, metadata) {
181
+ return encodeBlocks(blocks, metadata, this.encodeField.bind(this));
182
+ },
62
183
  async encodeEntry ({ data, schema }) {
63
184
  if (!isObject(data) || data === undefined) {
64
185
  return data;
@@ -67,6 +188,17 @@ const createContentSourceMapsService = (strapi)=>{
67
188
  if (!attribute || EXCLUDED_FIELDS.includes(key)) {
68
189
  return;
69
190
  }
191
+ if (attribute.type === 'blocks' && Array.isArray(value)) {
192
+ const fieldPath = path.rawWithIndices;
193
+ set(key, this.encodeBlocks(value, {
194
+ fieldPath,
195
+ kind: schema.kind,
196
+ model: schema.uid,
197
+ locale: data.locale,
198
+ documentId: data.documentId
199
+ }));
200
+ return;
201
+ }
70
202
  if (ENCODABLE_TYPES.includes(attribute.type) && typeof value === 'string') {
71
203
  // For inner fields of a multi-media field's items (e.g. `medias.0.url`),
72
204
  // drop the array index so all items share the same encoded path. The
@@ -113,4 +245,5 @@ const createContentSourceMapsService = (strapi)=>{
113
245
  };
114
246
 
115
247
  exports.createContentSourceMapsService = createContentSourceMapsService;
248
+ exports.encodeBlocks = encodeBlocks;
116
249
  //# sourceMappingURL=content-source-maps.js.map
@@ -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, UID } from '@strapi/types';\nimport { traverseEntity } from '@strapi/utils';\nimport type { FieldContentSourceMap } from '@strapi/admin/strapi-admin';\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 isObject = (value: unknown): value is Record<string, any> => {\n return typeof value === 'object' && value !== null;\n};\n\nconst createContentSourceMapsService = (strapi: Core.Strapi) => {\n return {\n encodeField(\n text: string,\n { kind, model, documentId, type, path, locale }: FieldContentSourceMap\n ) {\n /**\n * Combine all metadata into into a one string so we only have to deal with one data-atribute\n * on the frontend. Make it human readable because that data-attribute may be set manually by\n * users for fields that don't support sourcemap encoding.\n */\n const strapiSource = new URLSearchParams();\n strapiSource.set('documentId', documentId);\n strapiSource.set('type', type);\n strapiSource.set('path', path);\n\n if (model) {\n strapiSource.set('model', model);\n }\n if (kind) {\n strapiSource.set('kind', kind);\n }\n if (locale) {\n strapiSource.set('locale', locale);\n }\n\n const encoded = vercelStegaCombine(\n text,\n {\n strapiSource: strapiSource.toString(),\n },\n false\n );\n\n return encoded;\n },\n\n async encodeEntry({ data, schema }: EncodingInfo): Promise<any> {\n if (!isObject(data) || data === undefined) {\n return data;\n }\n\n return traverseEntity(\n ({ key, value, attribute, schema, path, parent }, { set }) => {\n if (!attribute || EXCLUDED_FIELDS.includes(key)) {\n return;\n }\n\n if (ENCODABLE_TYPES.includes(attribute.type) && typeof value === 'string') {\n // For inner fields of a multi-media field's items (e.g. `medias.0.url`),\n // drop the array index so all items share the same encoded path. The\n // preview groups them under one highlight and opens the multi-media\n // input as a single field, matching the side editor.\n const parentAttr = parent?.attribute;\n const isInsideMultiMedia =\n parentAttr?.type === 'media' && (parentAttr as any).multiple === true;\n const encodedPath =\n isInsideMultiMedia && parent?.path?.rawWithIndices\n ? `${parent.path.rawWithIndices}.${key}`\n : path.rawWithIndices!;\n\n set(\n key,\n this.encodeField(value, {\n path: encodedPath,\n type: attribute.type,\n kind: schema.kind,\n model: schema.uid as UID.Schema,\n locale: data.locale,\n documentId: data.documentId,\n }) as any\n );\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 (!isObject(data)) {\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","isObject","value","createContentSourceMapsService","strapi","encodeField","text","kind","model","documentId","type","path","locale","strapiSource","URLSearchParams","set","encoded","vercelStegaCombine","toString","encodeEntry","data","schema","undefined","traverseEntity","key","attribute","parent","includes","parentAttr","isInsideMultiMedia","multiple","encodedPath","rawWithIndices","uid","getModel","encodeSourceMaps","Array","isArray","Promise","all","map","item","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';\nimport type { FieldContentSourceMap } from '@strapi/admin/strapi-admin';\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 * - integer, float and decimal: number\n * - boolean: boolean (believe it or not)\n * - uid: can be stringified but would mess up URLs\n *\n * The blocks type is an array of nodes — handled in a dedicated branch below\n * because it requires walking the AST to encode the first text leaf of each visual block.\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\ntype BlocksEncodeMetadata = Omit<FieldContentSourceMap, 'path' | 'type'> & { fieldPath: string };\n\ntype EncodeFieldFn = (text: string, metadata: FieldContentSourceMap) => string;\n\nconst isObject = (value: unknown): value is Record<string, any> => {\n return typeof value === 'object' && value !== null;\n};\n\nconst blocksFieldMetadata = (metadata: BlocksEncodeMetadata): FieldContentSourceMap => ({\n ...metadata,\n path: metadata.fieldPath,\n type: 'blocks',\n});\n\n/**\n * Walk a subtree depth-first and stega-encode the first `{ type: 'text', text }` leaf only.\n */\nconst encodeFirstTextLeaf = (\n node: unknown,\n metadata: BlocksEncodeMetadata,\n encodeField: EncodeFieldFn\n): { node: unknown; encoded: boolean } => {\n if (!isObject(node)) {\n return { node, encoded: false };\n }\n\n if (node.type === 'text' && typeof node.text === 'string') {\n return {\n node: {\n ...node,\n text: encodeField(node.text, blocksFieldMetadata(metadata)),\n },\n encoded: true,\n };\n }\n\n if (Array.isArray(node.children)) {\n let encoded = false;\n const children = node.children.map((child) => {\n if (encoded) {\n return child;\n }\n\n const result = encodeFirstTextLeaf(child, metadata, encodeField);\n encoded = result.encoded;\n return result.node;\n });\n\n return {\n node: { ...node, children },\n encoded,\n };\n }\n\n return { node, encoded: false };\n};\n\nconst encodeListBlock = (\n listNode: Record<string, unknown>,\n metadata: BlocksEncodeMetadata,\n encodeField: EncodeFieldFn\n): Record<string, unknown> => {\n const children = (listNode.children as unknown[]).map((child) => {\n if (!isObject(child)) {\n return child;\n }\n\n if (child.type === 'list-item') {\n return encodeFirstTextLeaf(child, metadata, encodeField).node;\n }\n\n if (child.type === 'list') {\n return encodeListBlock(child, metadata, encodeField);\n }\n\n return child;\n });\n\n return { ...listNode, children };\n};\n\nconst encodeImageBlock = (\n imageNode: Record<string, unknown>,\n metadata: BlocksEncodeMetadata,\n encodeField: EncodeFieldFn\n): Record<string, unknown> => {\n if (!isObject(imageNode.image)) {\n return imageNode;\n }\n\n const { alternativeText } = imageNode.image as Record<string, unknown>;\n // Encode the alt text (not the URL). Encoding the URL corrupts the src attribute and can\n // cause the preview highlight to expand across the entire page. The alt attribute is a\n // safe target: it's visible to the previewScript via getAttribute and never used as a URL.\n // Only encode when alternativeText is a non-empty string — images with no alt text get\n // no stega marker and won't independently trigger the highlight, but the blocks field\n // as a whole remains highlightable via its other (text) blocks.\n if (typeof alternativeText !== 'string' || alternativeText.length === 0) {\n return imageNode;\n }\n\n return {\n ...imageNode,\n image: {\n ...(imageNode.image as Record<string, unknown>),\n alternativeText: encodeField(alternativeText, blocksFieldMetadata(metadata)),\n },\n };\n};\n\n/**\n * Pure transformation over a blocks AST. Injects one stega marker per visual block\n * (first text leaf, or image alt text) using the blocks field path for all markers.\n * Code blocks are skipped entirely.\n */\nconst encodeBlocks = (\n blocks: unknown,\n metadata: BlocksEncodeMetadata,\n encodeField: EncodeFieldFn\n): unknown => {\n if (!Array.isArray(blocks)) {\n return blocks;\n }\n\n return blocks.map((block) => {\n if (!isObject(block)) {\n return block;\n }\n\n switch (block.type) {\n case 'code':\n // Skip encoding — encoding code content would corrupt the syntax.\n return block;\n case 'image':\n return encodeImageBlock(block, metadata, encodeField);\n case 'list':\n return encodeListBlock(block, metadata, encodeField);\n case 'paragraph':\n case 'heading':\n case 'quote':\n return encodeFirstTextLeaf(block, metadata, encodeField).node;\n default:\n return block;\n }\n });\n};\n\nconst createContentSourceMapsService = (strapi: Core.Strapi) => {\n return {\n encodeField(\n text: string,\n { kind, model, documentId, type, path, locale, fieldPath }: FieldContentSourceMap\n ) {\n /**\n * Combine all metadata into into a one string so we only have to deal with one data-atribute\n * on the frontend. Make it human readable because that data-attribute may be set manually by\n * users for fields that don't support sourcemap encoding.\n */\n const strapiSource = new URLSearchParams();\n strapiSource.set('documentId', documentId);\n strapiSource.set('type', type);\n strapiSource.set('path', path);\n\n if (model) {\n strapiSource.set('model', model);\n }\n if (kind) {\n strapiSource.set('kind', kind);\n }\n if (locale) {\n strapiSource.set('locale', locale);\n }\n if (fieldPath) {\n strapiSource.set('fieldPath', fieldPath);\n }\n\n const encoded = vercelStegaCombine(\n text,\n {\n strapiSource: strapiSource.toString(),\n },\n false\n );\n\n return encoded;\n },\n\n encodeBlocks(blocks: unknown, metadata: BlocksEncodeMetadata): unknown {\n return encodeBlocks(blocks, metadata, this.encodeField.bind(this));\n },\n\n async encodeEntry({ data, schema }: EncodingInfo): Promise<any> {\n if (!isObject(data) || data === undefined) {\n return data;\n }\n\n return traverseEntity(\n ({ key, value, attribute, schema, path, parent }, { set }) => {\n if (!attribute || EXCLUDED_FIELDS.includes(key)) {\n return;\n }\n\n if (attribute.type === 'blocks' && Array.isArray(value)) {\n const fieldPath = path.rawWithIndices!;\n set(\n key,\n this.encodeBlocks(value, {\n fieldPath,\n kind: schema.kind,\n model: schema.uid as UID.Schema,\n locale: data.locale,\n documentId: data.documentId,\n }) as any\n );\n return;\n }\n\n if (ENCODABLE_TYPES.includes(attribute.type) && typeof value === 'string') {\n // For inner fields of a multi-media field's items (e.g. `medias.0.url`),\n // drop the array index so all items share the same encoded path. The\n // preview groups them under one highlight and opens the multi-media\n // input as a single field, matching the side editor.\n const parentAttr = parent?.attribute;\n const isInsideMultiMedia =\n parentAttr?.type === 'media' && (parentAttr as any).multiple === true;\n const encodedPath =\n isInsideMultiMedia && parent?.path?.rawWithIndices\n ? `${parent.path.rawWithIndices}.${key}`\n : path.rawWithIndices!;\n\n set(\n key,\n this.encodeField(value, {\n path: encodedPath,\n type: attribute.type,\n kind: schema.kind,\n model: schema.uid as UID.Schema,\n locale: data.locale,\n documentId: data.documentId,\n }) as any\n );\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 (!isObject(data)) {\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, encodeBlocks };\nexport type { BlocksEncodeMetadata, EncodeFieldFn };\n"],"names":["ENCODABLE_TYPES","EXCLUDED_FIELDS","isObject","value","blocksFieldMetadata","metadata","path","fieldPath","type","encodeFirstTextLeaf","node","encodeField","encoded","text","Array","isArray","children","map","child","result","encodeListBlock","listNode","encodeImageBlock","imageNode","image","alternativeText","length","encodeBlocks","blocks","block","createContentSourceMapsService","strapi","kind","model","documentId","locale","strapiSource","URLSearchParams","set","vercelStegaCombine","toString","bind","encodeEntry","data","schema","undefined","traverseEntity","key","attribute","parent","includes","rawWithIndices","uid","parentAttr","isInsideMultiMedia","multiple","encodedPath","getModel","encodeSourceMaps","Promise","all","item","error","log"],"mappings":"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"}