@strapi/core 0.0.0-experimental.a407f3bc8fb79a53cf7975140864526b6ddbac4b → 0.0.0-experimental.fc1ac2acd58c8a5a858679956b6d102ac5ee4011

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 (162) hide show
  1. package/dist/Strapi.d.ts.map +1 -1
  2. package/dist/Strapi.js +4 -1
  3. package/dist/Strapi.js.map +1 -1
  4. package/dist/Strapi.mjs +4 -1
  5. package/dist/Strapi.mjs.map +1 -1
  6. package/dist/configuration/index.d.ts.map +1 -1
  7. package/dist/configuration/index.js +4 -4
  8. package/dist/configuration/index.js.map +1 -1
  9. package/dist/configuration/index.mjs +1 -1
  10. package/dist/configuration/index.mjs.map +1 -1
  11. package/dist/configuration/urls.d.ts +8 -0
  12. package/dist/configuration/urls.d.ts.map +1 -0
  13. package/dist/configuration/urls.js +68 -0
  14. package/dist/configuration/urls.js.map +1 -0
  15. package/dist/configuration/urls.mjs +66 -0
  16. package/dist/configuration/urls.mjs.map +1 -0
  17. package/dist/core-api/controller/index.d.ts.map +1 -1
  18. package/dist/core-api/controller/index.js +6 -1
  19. package/dist/core-api/controller/index.js.map +1 -1
  20. package/dist/core-api/controller/index.mjs +6 -1
  21. package/dist/core-api/controller/index.mjs.map +1 -1
  22. package/dist/core-api/controller/transform.d.ts +8 -7
  23. package/dist/core-api/controller/transform.d.ts.map +1 -1
  24. package/dist/core-api/controller/transform.js +18 -9
  25. package/dist/core-api/controller/transform.js.map +1 -1
  26. package/dist/core-api/controller/transform.mjs +18 -9
  27. package/dist/core-api/controller/transform.mjs.map +1 -1
  28. package/dist/core-api/service/single-type.d.ts +1 -1
  29. package/dist/core-api/service/single-type.d.ts.map +1 -1
  30. package/dist/core-api/service/single-type.js +3 -4
  31. package/dist/core-api/service/single-type.js.map +1 -1
  32. package/dist/core-api/service/single-type.mjs +3 -4
  33. package/dist/core-api/service/single-type.mjs.map +1 -1
  34. package/dist/domain/content-type/index.d.ts.map +1 -1
  35. package/dist/domain/content-type/index.js +3 -0
  36. package/dist/domain/content-type/index.js.map +1 -1
  37. package/dist/domain/content-type/index.mjs +3 -0
  38. package/dist/domain/content-type/index.mjs.map +1 -1
  39. package/dist/domain/content-type/validator.d.ts.map +1 -1
  40. package/dist/domain/content-type/validator.js +1 -1
  41. package/dist/domain/content-type/validator.js.map +1 -1
  42. package/dist/domain/content-type/validator.mjs +2 -2
  43. package/dist/domain/content-type/validator.mjs.map +1 -1
  44. package/dist/domain/module/index.d.ts.map +1 -1
  45. package/dist/domain/module/index.js +2 -3
  46. package/dist/domain/module/index.js.map +1 -1
  47. package/dist/domain/module/index.mjs +2 -3
  48. package/dist/domain/module/index.mjs.map +1 -1
  49. package/dist/loaders/apis.js +1 -1
  50. package/dist/loaders/apis.js.map +1 -1
  51. package/dist/loaders/apis.mjs +2 -2
  52. package/dist/loaders/apis.mjs.map +1 -1
  53. package/dist/loaders/plugins/get-enabled-plugins.js +1 -1
  54. package/dist/loaders/plugins/get-enabled-plugins.js.map +1 -1
  55. package/dist/loaders/plugins/get-enabled-plugins.mjs +2 -2
  56. package/dist/loaders/plugins/get-enabled-plugins.mjs.map +1 -1
  57. package/dist/migrations/draft-publish.d.ts +17 -0
  58. package/dist/migrations/draft-publish.d.ts.map +1 -0
  59. package/dist/migrations/draft-publish.js +59 -0
  60. package/dist/migrations/draft-publish.js.map +1 -0
  61. package/dist/migrations/draft-publish.mjs +59 -0
  62. package/dist/migrations/draft-publish.mjs.map +1 -0
  63. package/dist/registries/config.d.ts +2 -2
  64. package/dist/registries/config.d.ts.map +1 -1
  65. package/dist/registries/config.js +14 -6
  66. package/dist/registries/config.js.map +1 -1
  67. package/dist/registries/config.mjs +15 -5
  68. package/dist/registries/config.mjs.map +1 -1
  69. package/dist/services/document-service/common.d.ts +2 -2
  70. package/dist/services/document-service/common.d.ts.map +1 -1
  71. package/dist/services/document-service/common.js.map +1 -1
  72. package/dist/services/document-service/common.mjs.map +1 -1
  73. package/dist/services/document-service/draft-and-publish.d.ts +9 -23
  74. package/dist/services/document-service/draft-and-publish.d.ts.map +1 -1
  75. package/dist/services/document-service/draft-and-publish.js +37 -9
  76. package/dist/services/document-service/draft-and-publish.js.map +1 -1
  77. package/dist/services/document-service/draft-and-publish.mjs +38 -10
  78. package/dist/services/document-service/draft-and-publish.mjs.map +1 -1
  79. package/dist/services/document-service/index.js +5 -5
  80. package/dist/services/document-service/index.js.map +1 -1
  81. package/dist/services/document-service/index.mjs +1 -1
  82. package/dist/services/document-service/index.mjs.map +1 -1
  83. package/dist/services/document-service/repository.d.ts +3 -0
  84. package/dist/services/document-service/repository.d.ts.map +1 -0
  85. package/dist/services/document-service/repository.js +304 -0
  86. package/dist/services/document-service/repository.js.map +1 -0
  87. package/dist/services/document-service/repository.mjs +304 -0
  88. package/dist/services/document-service/repository.mjs.map +1 -0
  89. package/dist/services/document-service/transform/id-map.d.ts +1 -1
  90. package/dist/services/document-service/transform/id-map.d.ts.map +1 -1
  91. package/dist/services/document-service/transform/id-map.js +15 -9
  92. package/dist/services/document-service/transform/id-map.js.map +1 -1
  93. package/dist/services/document-service/transform/id-map.mjs +16 -10
  94. package/dist/services/document-service/transform/id-map.mjs.map +1 -1
  95. package/dist/services/document-service/transform/id-transform.d.ts +4 -18
  96. package/dist/services/document-service/transform/id-transform.d.ts.map +1 -1
  97. package/dist/services/document-service/transform/id-transform.js +18 -12
  98. package/dist/services/document-service/transform/id-transform.js.map +1 -1
  99. package/dist/services/document-service/transform/id-transform.mjs +18 -12
  100. package/dist/services/document-service/transform/id-transform.mjs.map +1 -1
  101. package/dist/services/document-service/transform/populate.d.ts +5 -2
  102. package/dist/services/document-service/transform/populate.d.ts.map +1 -1
  103. package/dist/services/document-service/transform/populate.js.map +1 -1
  104. package/dist/services/document-service/transform/populate.mjs.map +1 -1
  105. package/dist/services/document-service/transform/relations/extract/data-ids.d.ts +1 -1
  106. package/dist/services/document-service/transform/relations/extract/data-ids.d.ts.map +1 -1
  107. package/dist/services/document-service/transform/relations/extract/data-ids.js +23 -12
  108. package/dist/services/document-service/transform/relations/extract/data-ids.js.map +1 -1
  109. package/dist/services/document-service/transform/relations/extract/data-ids.mjs +23 -12
  110. package/dist/services/document-service/transform/relations/extract/data-ids.mjs.map +1 -1
  111. package/dist/services/document-service/transform/relations/transform/data-ids.d.ts +1 -1
  112. package/dist/services/document-service/transform/relations/transform/data-ids.d.ts.map +1 -1
  113. package/dist/services/document-service/transform/relations/transform/data-ids.js +61 -37
  114. package/dist/services/document-service/transform/relations/transform/data-ids.js.map +1 -1
  115. package/dist/services/document-service/transform/relations/transform/data-ids.mjs +62 -38
  116. package/dist/services/document-service/transform/relations/transform/data-ids.mjs.map +1 -1
  117. package/dist/services/document-service/transform/relations/utils/dp.d.ts +10 -0
  118. package/dist/services/document-service/transform/relations/utils/dp.d.ts.map +1 -0
  119. package/dist/services/document-service/transform/relations/utils/dp.js +25 -0
  120. package/dist/services/document-service/transform/relations/utils/dp.js.map +1 -0
  121. package/dist/services/document-service/transform/relations/utils/dp.mjs +25 -0
  122. package/dist/services/document-service/transform/relations/utils/dp.mjs.map +1 -0
  123. package/dist/services/document-service/transform/relations/utils/types.d.ts +4 -1
  124. package/dist/services/document-service/transform/relations/utils/types.d.ts.map +1 -1
  125. package/dist/services/document-service/transform/types.d.ts +1 -1
  126. package/dist/services/document-service/transform/types.d.ts.map +1 -1
  127. package/dist/services/document-service/utils/populate.js +2 -2
  128. package/dist/services/document-service/utils/populate.js.map +1 -1
  129. package/dist/services/document-service/utils/populate.mjs +2 -2
  130. package/dist/services/document-service/utils/populate.mjs.map +1 -1
  131. package/dist/services/entity-service/components.js +8 -8
  132. package/dist/services/entity-service/components.js.map +1 -1
  133. package/dist/services/entity-service/components.mjs +9 -9
  134. package/dist/services/entity-service/components.mjs.map +1 -1
  135. package/dist/services/entity-service/index.d.ts.map +1 -1
  136. package/dist/services/entity-service/index.js +3 -3
  137. package/dist/services/entity-service/index.js.map +1 -1
  138. package/dist/services/entity-service/index.mjs +3 -3
  139. package/dist/services/entity-service/index.mjs.map +1 -1
  140. package/dist/services/entity-service/params.d.ts +4 -4
  141. package/dist/services/entity-service/params.d.ts.map +1 -1
  142. package/dist/services/entity-service/params.js +1 -1
  143. package/dist/services/entity-service/params.js.map +1 -1
  144. package/dist/services/entity-service/params.mjs +1 -1
  145. package/dist/services/entity-service/params.mjs.map +1 -1
  146. package/dist/utils/load-config-file.js +1 -1
  147. package/dist/utils/load-config-file.js.map +1 -1
  148. package/dist/utils/load-config-file.mjs +2 -2
  149. package/dist/utils/load-config-file.mjs.map +1 -1
  150. package/package.json +14 -14
  151. package/dist/services/document-service/document-engine.d.ts +0 -8
  152. package/dist/services/document-service/document-engine.d.ts.map +0 -1
  153. package/dist/services/document-service/document-engine.js +0 -241
  154. package/dist/services/document-service/document-engine.js.map +0 -1
  155. package/dist/services/document-service/document-engine.mjs +0 -242
  156. package/dist/services/document-service/document-engine.mjs.map +0 -1
  157. package/dist/services/document-service/repositories/content-type.d.ts +0 -3
  158. package/dist/services/document-service/repositories/content-type.d.ts.map +0 -1
  159. package/dist/services/document-service/repositories/content-type.js +0 -139
  160. package/dist/services/document-service/repositories/content-type.js.map +0 -1
  161. package/dist/services/document-service/repositories/content-type.mjs +0 -139
  162. package/dist/services/document-service/repositories/content-type.mjs.map +0 -1
@@ -114,7 +114,7 @@ const createDefaultImplementation = ({
114
114
  throw new Error("cannot create");
115
115
  }
116
116
  const model = strapi.getModel(uid);
117
- const isDraft = contentTypes.isDraft(data);
117
+ const isDraft = contentTypes.isDraft(data, model);
118
118
  const validData = await entityValidator.validateEntityCreation(model, data, { isDraft });
119
119
  const query = transformParamsToQuery(uid, pickSelectionParams(wrappedParams));
120
120
  const componentData = await createComponents(uid, validData);
@@ -148,7 +148,7 @@ const createDefaultImplementation = ({
148
148
  if (!entityToUpdate) {
149
149
  return null;
150
150
  }
151
- const isDraft = contentTypes.isDraft(entityToUpdate);
151
+ const isDraft = contentTypes.isDraft(entityToUpdate, model);
152
152
  const validData = await entityValidator.validateEntityUpdate(
153
153
  model,
154
154
  data,
@@ -206,7 +206,7 @@ const createDefaultImplementation = ({
206
206
  if (!entityToClone) {
207
207
  return null;
208
208
  }
209
- const isDraft = contentTypes.isDraft(entityToClone);
209
+ const isDraft = contentTypes.isDraft(entityToClone, model);
210
210
  const validData = await entityValidator.validateEntityUpdate(
211
211
  model,
212
212
  // Omit the id, the cloned entity id will be generated by the database
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","sources":["../../../src/services/entity-service/index.ts"],"sourcesContent":["import _ from 'lodash';\nimport delegate from 'delegates';\nimport { errors as databaseErrors } from '@strapi/database';\nimport {\n contentTypes as contentTypesUtils,\n sanitize,\n errors,\n relations as relationUtils,\n convertQueryParams,\n} from '@strapi/utils';\nimport type { Database } from '@strapi/database';\nimport type {\n Strapi,\n EntityService,\n EntityValidator,\n EventHub,\n Common,\n Schema,\n Shared,\n Utils,\n} from '@strapi/types';\n\nimport uploadFiles from '../utils/upload-files';\n\nimport {\n omitComponentData,\n getComponents,\n createComponents,\n updateComponents,\n deleteComponents,\n cloneComponents,\n} from './components';\n\nimport { pickSelectionParams } from './params';\nimport { applyTransforms } from './attributes';\n\nconst { transformParamsToQuery } = convertQueryParams;\n\ntype Decoratable<T> = T & {\n decorate(\n decorator: (old: EntityService.EntityService) => EntityService.EntityService & {\n [key: string]: unknown;\n }\n ): void;\n};\n\ntype Context = {\n contentType: Schema.ContentType;\n};\n\nconst transformLoadParamsToQuery = (\n uid: string,\n field: string,\n params: Record<string, unknown>,\n pagination = {}\n) => {\n const query = transformParamsToQuery(uid, { populate: { [field]: params } as any }) as any;\n\n const res = {\n ...query.populate[field],\n ...pagination,\n };\n\n return res;\n};\n\nconst databaseErrorsToTransform = [\n databaseErrors.InvalidTimeError,\n databaseErrors.InvalidDateTimeError,\n databaseErrors.InvalidDateError,\n databaseErrors.InvalidRelationError,\n];\n\nconst creationPipeline = (data: Record<string, unknown>, context: Context) => {\n return applyTransforms(data, context);\n};\n\nconst updatePipeline = (data: Record<string, unknown>, context: Context) => {\n return applyTransforms(data, context);\n};\n\nconst ALLOWED_WEBHOOK_EVENTS = {\n ENTRY_CREATE: 'entry.create',\n ENTRY_UPDATE: 'entry.update',\n ENTRY_DELETE: 'entry.delete',\n};\n\nconst createDefaultImplementation = ({\n strapi,\n db,\n eventHub,\n entityValidator,\n}: {\n strapi: Strapi;\n db: Database;\n eventHub: EventHub;\n entityValidator: EntityValidator;\n}): EntityService.EntityService => ({\n /**\n * Upload files utility\n */\n uploadFiles,\n\n async wrapParams(options: any = {}) {\n return options;\n },\n\n async wrapResult(result: any = {}) {\n return result;\n },\n\n async emitEvent(uid, event: string, entity) {\n // Ignore audit log events to prevent infinite loops\n if (uid === ('admin::audit-log' as Common.UID.ContentType)) {\n return;\n }\n\n const model = strapi.getModel(uid);\n const sanitizedEntity = await sanitize.sanitizers.defaultSanitizeOutput(model, entity);\n\n eventHub.emit(event, {\n model: model.modelName,\n uid: model.uid,\n entry: sanitizedEntity,\n });\n },\n\n async findMany(uid, opts) {\n const { kind } = strapi.getModel(uid);\n\n const wrappedParams = await this.wrapParams(opts, { uid, action: 'findMany' });\n\n const query = transformParamsToQuery(uid, wrappedParams);\n\n if (kind === 'singleType') {\n const entity = db.query(uid).findOne(query);\n return this.wrapResult(entity, { uid, action: 'findOne' });\n }\n\n const entities = await db.query(uid).findMany(query);\n return this.wrapResult(entities, { uid, action: 'findMany' });\n },\n\n async findPage(uid, opts) {\n const wrappedParams = await this.wrapParams(opts, { uid, action: 'findPage' });\n\n const query = transformParamsToQuery(uid, wrappedParams);\n\n const page = await db.query(uid).findPage(query);\n return {\n ...page,\n results: await this.wrapResult(page.results, { uid, action: 'findPage' }),\n };\n },\n\n // TODO: streamline the logic based on the populate option\n async findWithRelationCountsPage(uid, opts) {\n const wrappedParams = await this.wrapParams(opts, { uid, action: 'findWithRelationCounts' });\n\n const query = transformParamsToQuery(uid, wrappedParams);\n\n const entities = await db.query(uid).findPage(query);\n return {\n ...entities,\n results: await this.wrapResult(entities.results, { uid, action: 'findWithRelationCounts' }),\n };\n },\n\n async findWithRelationCounts(uid, opts) {\n const wrappedParams = await this.wrapParams(opts, { uid, action: 'findWithRelationCounts' });\n\n const query = transformParamsToQuery(uid, wrappedParams);\n\n const entities = await db.query(uid).findMany(query);\n return this.wrapResult(entities, { uid, action: 'findWithRelationCounts' });\n },\n\n async findOne(uid, entityId, opts) {\n const wrappedParams = await this.wrapParams(opts, { uid, action: 'findOne' });\n\n const query = transformParamsToQuery(uid, pickSelectionParams(wrappedParams));\n\n const entity = await db.query(uid).findOne({ ...query, where: { id: entityId } });\n return this.wrapResult(entity, { uid, action: 'findOne' });\n },\n\n async count(uid, opts) {\n const wrappedParams = await this.wrapParams(opts, { uid, action: 'count' });\n\n const query = transformParamsToQuery(uid, wrappedParams);\n\n return db.query(uid).count(query);\n },\n\n async create<\n TUID extends Common.UID.ContentType,\n TParams extends EntityService.Params.Pick<TUID, 'data' | 'files' | 'fields' | 'populate'>\n >(uid: TUID, params?: TParams) {\n const wrappedParams = await this.wrapParams<TParams>(params, { uid, action: 'create' });\n const { data, files } = wrappedParams;\n\n if (!data) {\n throw new Error('cannot create');\n }\n\n const model = strapi.getModel(uid) as Shared.ContentTypes[Common.UID.ContentType];\n\n const isDraft = contentTypesUtils.isDraft(data);\n const validData = await entityValidator.validateEntityCreation(model, data, { isDraft });\n\n // select / populate\n const query = transformParamsToQuery(uid, pickSelectionParams(wrappedParams));\n\n // TODO: wrap into transaction\n const componentData = await createComponents(uid, validData);\n\n const entityData = creationPipeline(\n Object.assign(omitComponentData(model, validData), componentData),\n {\n contentType: model,\n }\n );\n let entity = await db.query(uid).create({\n ...query,\n data: entityData,\n });\n\n // TODO: do all of this in a transaction to avoid a race condition where entity is created then deleted before we do findOne again\n // TODO: upload the files then set the links in the entity like with compo to avoid making too many queries\n if (files && Object.keys(files).length > 0) {\n await this.uploadFiles(uid, Object.assign(entityData, entity), files);\n entity = await this.findOne(uid, entity.id, wrappedParams);\n }\n\n entity = await this.wrapResult(entity, { uid, action: 'create' });\n\n const { ENTRY_CREATE } = ALLOWED_WEBHOOK_EVENTS;\n await this.emitEvent(uid, ENTRY_CREATE, entity);\n\n return entity;\n },\n\n async update(uid, entityId, opts) {\n const wrappedParams = await this.wrapParams<\n EntityService.Params.Pick<typeof uid, 'data:partial' | 'files' | 'fields' | 'populate'>\n >(opts, {\n uid,\n action: 'update',\n });\n const { data, files } = wrappedParams;\n\n const model = strapi.getModel(uid);\n\n const entityToUpdate = await db.query(uid).findOne({ where: { id: entityId } });\n\n if (!entityToUpdate) {\n return null;\n }\n\n const isDraft = contentTypesUtils.isDraft(entityToUpdate);\n\n const validData = await entityValidator.validateEntityUpdate(\n model,\n data,\n {\n isDraft,\n },\n entityToUpdate\n );\n\n const query = transformParamsToQuery(uid, pickSelectionParams(wrappedParams));\n\n // TODO: wrap in transaction\n const componentData = await updateComponents(uid, entityToUpdate, validData);\n const entityData = updatePipeline(\n Object.assign(omitComponentData(model, validData), componentData),\n { contentType: model }\n );\n\n let entity = await db.query(uid).update({\n ...query,\n where: { id: entityId },\n data: entityData,\n });\n\n // TODO: upload the files then set the links in the entity like with compo to avoid making too many queries\n if (files && Object.keys(files).length > 0) {\n await this.uploadFiles(uid, Object.assign(entityData, entity), files);\n entity = await this.findOne(uid, entity.id, wrappedParams);\n }\n\n entity = await this.wrapResult(entity, { uid, action: 'update' });\n\n const { ENTRY_UPDATE } = ALLOWED_WEBHOOK_EVENTS;\n await this.emitEvent(uid, ENTRY_UPDATE, entity);\n\n return entity;\n },\n\n async delete(uid, entityId, opts) {\n const wrappedParams = await this.wrapParams(opts, { uid, action: 'delete' });\n\n // select / populate\n const query = transformParamsToQuery(uid, pickSelectionParams(wrappedParams));\n\n let entityToDelete = await db.query(uid).findOne({\n ...query,\n where: { id: entityId },\n });\n\n if (!entityToDelete) {\n return null;\n }\n\n const componentsToDelete = await getComponents(uid, entityToDelete);\n\n await db.query(uid).delete({ where: { id: entityToDelete.id } });\n await deleteComponents(uid, componentsToDelete as any, { loadComponents: false });\n\n entityToDelete = await this.wrapResult(entityToDelete, { uid, action: 'delete' });\n\n const { ENTRY_DELETE } = ALLOWED_WEBHOOK_EVENTS;\n await this.emitEvent(uid, ENTRY_DELETE, entityToDelete);\n\n return entityToDelete;\n },\n\n async clone(uid, cloneId, opts) {\n const wrappedParams = await this.wrapParams<\n EntityService.Params.Pick<typeof uid, 'data' | 'files' | 'fields' | 'populate'>\n >(opts, { uid, action: 'clone' });\n const { data, files } = wrappedParams;\n\n if (!data) {\n throw new Error('cannot clone');\n }\n\n const model = strapi.getModel(uid);\n\n const entityToClone = await db.query(uid).findOne({ where: { id: cloneId } });\n\n if (!entityToClone) {\n return null;\n }\n const isDraft = contentTypesUtils.isDraft(entityToClone);\n\n const validData = await entityValidator.validateEntityUpdate(\n model,\n // Omit the id, the cloned entity id will be generated by the database\n _.omit(data, ['id']) as Partial<typeof data>,\n { isDraft },\n entityToClone\n );\n\n const query = transformParamsToQuery(uid, pickSelectionParams(wrappedParams));\n\n // TODO: wrap into transaction\n const componentData = await cloneComponents(uid, entityToClone, validData);\n\n const entityData = creationPipeline(\n Object.assign(omitComponentData(model, validData), componentData),\n {\n contentType: model,\n }\n );\n\n let entity = await db.query(uid).clone(cloneId, {\n ...query,\n data: entityData,\n });\n\n // TODO: upload the files then set the links in the entity like with compo to avoid making too many queries\n if (files && Object.keys(files).length > 0) {\n await this.uploadFiles(uid, Object.assign(entityData, entity), files);\n entity = await this.findOne(uid, entity.id, wrappedParams);\n }\n\n const { ENTRY_CREATE } = ALLOWED_WEBHOOK_EVENTS;\n await this.emitEvent(uid, ENTRY_CREATE, entity);\n\n return entity;\n },\n // FIXME: used only for the CM to be removed\n async deleteMany(uid, opts) {\n const wrappedParams = await this.wrapParams(opts, { uid, action: 'delete' });\n\n // select / populate\n const query = transformParamsToQuery(uid, wrappedParams);\n\n let entitiesToDelete = await db.query(uid).findMany(query);\n\n if (!entitiesToDelete.length) {\n return { count: 0 };\n }\n\n const componentsToDelete = await Promise.all(\n entitiesToDelete.map((entityToDelete) => getComponents(uid, entityToDelete))\n );\n\n const deletedEntities = await db.query(uid).deleteMany(query);\n await Promise.all(\n componentsToDelete.map((compos) =>\n deleteComponents(uid, compos as any, { loadComponents: false })\n )\n );\n\n entitiesToDelete = await this.wrapResult(entitiesToDelete, { uid, action: 'delete' });\n\n // Trigger webhooks. One for each entity\n const { ENTRY_DELETE } = ALLOWED_WEBHOOK_EVENTS;\n await Promise.all(entitiesToDelete.map((entity) => this.emitEvent(uid, ENTRY_DELETE, entity)));\n\n return deletedEntities;\n },\n\n async load(uid, entity, field, params) {\n if (!_.isString(field)) {\n throw new Error(`Invalid load. Expected \"${field}\" to be a string`);\n }\n\n const loadedEntity = await db\n .query(uid)\n .load(entity, field, transformLoadParamsToQuery(uid, field, params ?? {}));\n\n return this.wrapResult(loadedEntity, { uid, field, action: 'load' });\n },\n\n async loadPages(uid, entity, field, params, pagination = {}) {\n if (!_.isString(field)) {\n throw new Error(`Invalid load. Expected \"${field}\" to be a string`);\n }\n\n const { attributes } = strapi.getModel(uid);\n const attribute = attributes[field];\n\n if (!relationUtils.isAnyToMany(attribute)) {\n throw new Error(`Invalid load. Expected \"${field}\" to be an anyToMany relational attribute`);\n }\n\n const query = transformLoadParamsToQuery(uid, field, params ?? {}, pagination);\n\n const loadedPage = await db.query(uid).loadPages(entity, field, query);\n\n return {\n ...loadedPage,\n results: await this.wrapResult(loadedPage.results, { uid, field, action: 'load' }),\n };\n },\n});\n\nexport default (ctx: {\n strapi: Strapi;\n db: Database;\n eventHub: EventHub;\n entityValidator: EntityValidator;\n}): Decoratable<EntityService.EntityService> => {\n Object.entries(ALLOWED_WEBHOOK_EVENTS).forEach(([key, value]) => {\n ctx.strapi.webhookStore?.addAllowedEvent(key, value);\n });\n\n const implementation = createDefaultImplementation(ctx);\n\n const service = {\n implementation,\n decorate<T extends object>(decorator: (current: typeof implementation) => T) {\n if (typeof decorator !== 'function') {\n throw new Error(`Decorator must be a function, received ${typeof decorator}`);\n }\n\n this.implementation = { ...this.implementation, ...decorator(this.implementation) };\n return this;\n },\n };\n\n const delegator = delegate(service, 'implementation');\n\n // delegate every method in implementation\n Object.keys(service.implementation).forEach((key) => delegator.method(key));\n\n // wrap methods to handle Database Errors\n service.decorate((oldService: EntityService.EntityService) => {\n const newService = _.mapValues(\n oldService,\n (method, methodName: keyof EntityService.EntityService) =>\n async function (this: EntityService.EntityService, ...args: []) {\n try {\n return await (oldService[methodName] as Utils.Function.AnyPromise).call(this, ...args);\n } catch (error) {\n if (\n databaseErrorsToTransform.some(\n (errorToTransform) => error instanceof errorToTransform\n )\n ) {\n if (error instanceof Error) {\n throw new errors.ValidationError(error.message);\n }\n\n throw error;\n }\n throw error;\n }\n }\n );\n\n return newService;\n });\n\n return service as unknown as Decoratable<EntityService.EntityService>;\n};\n"],"names":["databaseErrors","uploadFiles","contentTypesUtils","relationUtils","errors"],"mappings":"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"}
1
+ {"version":3,"file":"index.mjs","sources":["../../../src/services/entity-service/index.ts"],"sourcesContent":["import _ from 'lodash';\nimport delegate from 'delegates';\nimport { errors as databaseErrors } from '@strapi/database';\nimport {\n contentTypes as contentTypesUtils,\n sanitize,\n errors,\n relations as relationUtils,\n convertQueryParams,\n} from '@strapi/utils';\nimport type { Database } from '@strapi/database';\nimport type {\n Strapi,\n EntityService,\n EntityValidator,\n EventHub,\n Common,\n Schema,\n Shared,\n Utils,\n} from '@strapi/types';\n\nimport uploadFiles from '../utils/upload-files';\n\nimport {\n omitComponentData,\n getComponents,\n createComponents,\n updateComponents,\n deleteComponents,\n cloneComponents,\n} from './components';\n\nimport { pickSelectionParams } from './params';\nimport { applyTransforms } from './attributes';\n\nconst { transformParamsToQuery } = convertQueryParams;\n\ntype Decoratable<T> = T & {\n decorate(\n decorator: (old: EntityService.EntityService) => EntityService.EntityService & {\n [key: string]: unknown;\n }\n ): void;\n};\n\ntype Context = {\n contentType: Schema.ContentType;\n};\n\nconst transformLoadParamsToQuery = (\n uid: string,\n field: string,\n params: Record<string, unknown>,\n pagination = {}\n) => {\n const query = transformParamsToQuery(uid, { populate: { [field]: params } as any }) as any;\n\n const res = {\n ...query.populate[field],\n ...pagination,\n };\n\n return res;\n};\n\nconst databaseErrorsToTransform = [\n databaseErrors.InvalidTimeError,\n databaseErrors.InvalidDateTimeError,\n databaseErrors.InvalidDateError,\n databaseErrors.InvalidRelationError,\n];\n\nconst creationPipeline = (data: Record<string, unknown>, context: Context) => {\n return applyTransforms(data, context);\n};\n\nconst updatePipeline = (data: Record<string, unknown>, context: Context) => {\n return applyTransforms(data, context);\n};\n\nconst ALLOWED_WEBHOOK_EVENTS = {\n ENTRY_CREATE: 'entry.create',\n ENTRY_UPDATE: 'entry.update',\n ENTRY_DELETE: 'entry.delete',\n};\n\nconst createDefaultImplementation = ({\n strapi,\n db,\n eventHub,\n entityValidator,\n}: {\n strapi: Strapi;\n db: Database;\n eventHub: EventHub;\n entityValidator: EntityValidator;\n}): EntityService.EntityService => ({\n /**\n * Upload files utility\n */\n uploadFiles,\n\n async wrapParams(options: any = {}) {\n return options;\n },\n\n async wrapResult(result: any = {}) {\n return result;\n },\n\n async emitEvent(uid, event: string, entity) {\n // Ignore audit log events to prevent infinite loops\n if (uid === ('admin::audit-log' as Common.UID.ContentType)) {\n return;\n }\n\n const model = strapi.getModel(uid);\n const sanitizedEntity = await sanitize.sanitizers.defaultSanitizeOutput(model, entity);\n\n eventHub.emit(event, {\n model: model.modelName,\n uid: model.uid,\n entry: sanitizedEntity,\n });\n },\n\n async findMany(uid, opts) {\n const { kind } = strapi.getModel(uid);\n\n const wrappedParams = await this.wrapParams(opts, { uid, action: 'findMany' });\n\n const query = transformParamsToQuery(uid, wrappedParams);\n\n if (kind === 'singleType') {\n const entity = db.query(uid).findOne(query);\n return this.wrapResult(entity, { uid, action: 'findOne' });\n }\n\n const entities = await db.query(uid).findMany(query);\n return this.wrapResult(entities, { uid, action: 'findMany' });\n },\n\n async findPage(uid, opts) {\n const wrappedParams = await this.wrapParams(opts, { uid, action: 'findPage' });\n\n const query = transformParamsToQuery(uid, wrappedParams);\n\n const page = await db.query(uid).findPage(query);\n return {\n ...page,\n results: await this.wrapResult(page.results, { uid, action: 'findPage' }),\n };\n },\n\n // TODO: streamline the logic based on the populate option\n async findWithRelationCountsPage(uid, opts) {\n const wrappedParams = await this.wrapParams(opts, { uid, action: 'findWithRelationCounts' });\n\n const query = transformParamsToQuery(uid, wrappedParams);\n\n const entities = await db.query(uid).findPage(query);\n return {\n ...entities,\n results: await this.wrapResult(entities.results, { uid, action: 'findWithRelationCounts' }),\n };\n },\n\n async findWithRelationCounts(uid, opts) {\n const wrappedParams = await this.wrapParams(opts, { uid, action: 'findWithRelationCounts' });\n\n const query = transformParamsToQuery(uid, wrappedParams);\n\n const entities = await db.query(uid).findMany(query);\n return this.wrapResult(entities, { uid, action: 'findWithRelationCounts' });\n },\n\n async findOne(uid, entityId, opts) {\n const wrappedParams = await this.wrapParams(opts, { uid, action: 'findOne' });\n\n // @ts-expect-error - fix\n const query = transformParamsToQuery(uid, pickSelectionParams(wrappedParams));\n\n const entity = await db.query(uid).findOne({ ...query, where: { id: entityId } });\n return this.wrapResult(entity, { uid, action: 'findOne' });\n },\n\n async count(uid, opts) {\n const wrappedParams = await this.wrapParams(opts, { uid, action: 'count' });\n\n const query = transformParamsToQuery(uid, wrappedParams);\n\n return db.query(uid).count(query);\n },\n\n async create<\n TUID extends Common.UID.ContentType,\n TParams extends EntityService.Params.Pick<TUID, 'data' | 'files' | 'fields' | 'populate'>\n >(uid: TUID, params?: TParams) {\n const wrappedParams = await this.wrapParams<TParams>(params, { uid, action: 'create' });\n const { data, files } = wrappedParams;\n\n if (!data) {\n throw new Error('cannot create');\n }\n\n const model = strapi.getModel(uid) as Shared.ContentTypes[Common.UID.ContentType];\n\n const isDraft = contentTypesUtils.isDraft(data, model);\n const validData = await entityValidator.validateEntityCreation(model, data, { isDraft });\n\n // select / populate\n // @ts-expect-error - fix\n const query = transformParamsToQuery(uid, pickSelectionParams(wrappedParams));\n\n // TODO: wrap into transaction\n const componentData = await createComponents(uid, validData);\n\n const entityData = creationPipeline(\n Object.assign(omitComponentData(model, validData), componentData),\n {\n contentType: model,\n }\n );\n let entity = await db.query(uid).create({\n ...query,\n data: entityData,\n });\n\n // TODO: do all of this in a transaction to avoid a race condition where entity is created then deleted before we do findOne again\n // TODO: upload the files then set the links in the entity like with compo to avoid making too many queries\n if (files && Object.keys(files).length > 0) {\n await this.uploadFiles(uid, Object.assign(entityData, entity), files);\n entity = await this.findOne(uid, entity.id, wrappedParams);\n }\n\n entity = await this.wrapResult(entity, { uid, action: 'create' });\n\n const { ENTRY_CREATE } = ALLOWED_WEBHOOK_EVENTS;\n await this.emitEvent(uid, ENTRY_CREATE, entity);\n\n return entity;\n },\n\n async update(uid, entityId, opts) {\n const wrappedParams = await this.wrapParams<\n EntityService.Params.Pick<typeof uid, 'data:partial' | 'files' | 'fields' | 'populate'>\n >(opts, {\n uid,\n action: 'update',\n });\n const { data, files } = wrappedParams;\n\n const model = strapi.getModel(uid);\n\n const entityToUpdate = await db.query(uid).findOne({ where: { id: entityId } });\n\n if (!entityToUpdate) {\n return null;\n }\n\n const isDraft = contentTypesUtils.isDraft(entityToUpdate, model);\n\n const validData = await entityValidator.validateEntityUpdate(\n model,\n data,\n {\n isDraft,\n },\n entityToUpdate\n );\n // @ts-expect-error - fix\n const query = transformParamsToQuery(uid, pickSelectionParams(wrappedParams));\n\n // TODO: wrap in transaction\n const componentData = await updateComponents(uid, entityToUpdate, validData);\n const entityData = updatePipeline(\n Object.assign(omitComponentData(model, validData), componentData),\n { contentType: model }\n );\n\n let entity = await db.query(uid).update({\n ...query,\n where: { id: entityId },\n data: entityData,\n });\n\n // TODO: upload the files then set the links in the entity like with compo to avoid making too many queries\n if (files && Object.keys(files).length > 0) {\n await this.uploadFiles(uid, Object.assign(entityData, entity), files);\n entity = await this.findOne(uid, entity.id, wrappedParams);\n }\n\n entity = await this.wrapResult(entity, { uid, action: 'update' });\n\n const { ENTRY_UPDATE } = ALLOWED_WEBHOOK_EVENTS;\n await this.emitEvent(uid, ENTRY_UPDATE, entity);\n\n return entity;\n },\n\n async delete(uid, entityId, opts) {\n const wrappedParams = await this.wrapParams(opts, { uid, action: 'delete' });\n\n // select / populate\n // @ts-expect-error - fix\n const query = transformParamsToQuery(uid, pickSelectionParams(wrappedParams));\n\n let entityToDelete = await db.query(uid).findOne({\n ...query,\n where: { id: entityId },\n });\n\n if (!entityToDelete) {\n return null;\n }\n\n const componentsToDelete = await getComponents(uid, entityToDelete);\n\n await db.query(uid).delete({ where: { id: entityToDelete.id } });\n await deleteComponents(uid, componentsToDelete as any, { loadComponents: false });\n\n entityToDelete = await this.wrapResult(entityToDelete, { uid, action: 'delete' });\n\n const { ENTRY_DELETE } = ALLOWED_WEBHOOK_EVENTS;\n await this.emitEvent(uid, ENTRY_DELETE, entityToDelete);\n\n return entityToDelete;\n },\n\n async clone(uid, cloneId, opts) {\n const wrappedParams = await this.wrapParams<\n EntityService.Params.Pick<typeof uid, 'data' | 'files' | 'fields' | 'populate'>\n >(opts, { uid, action: 'clone' });\n const { data, files } = wrappedParams;\n\n if (!data) {\n throw new Error('cannot clone');\n }\n\n const model = strapi.getModel(uid);\n\n const entityToClone = await db.query(uid).findOne({ where: { id: cloneId } });\n\n if (!entityToClone) {\n return null;\n }\n const isDraft = contentTypesUtils.isDraft(entityToClone, model);\n\n const validData = await entityValidator.validateEntityUpdate(\n model,\n // Omit the id, the cloned entity id will be generated by the database\n _.omit(data, ['id']) as Partial<typeof data>,\n { isDraft },\n entityToClone\n );\n\n // @ts-expect-error - fix\n const query = transformParamsToQuery(uid, pickSelectionParams(wrappedParams));\n\n // TODO: wrap into transaction\n const componentData = await cloneComponents(uid, entityToClone, validData);\n\n const entityData = creationPipeline(\n Object.assign(omitComponentData(model, validData), componentData),\n {\n contentType: model,\n }\n );\n\n let entity = await db.query(uid).clone(cloneId, {\n ...query,\n data: entityData,\n });\n\n // TODO: upload the files then set the links in the entity like with compo to avoid making too many queries\n if (files && Object.keys(files).length > 0) {\n await this.uploadFiles(uid, Object.assign(entityData, entity), files);\n entity = await this.findOne(uid, entity.id, wrappedParams);\n }\n\n const { ENTRY_CREATE } = ALLOWED_WEBHOOK_EVENTS;\n await this.emitEvent(uid, ENTRY_CREATE, entity);\n\n return entity;\n },\n // FIXME: used only for the CM to be removed\n async deleteMany(uid, opts) {\n const wrappedParams = await this.wrapParams(opts, { uid, action: 'delete' });\n\n // select / populate\n const query = transformParamsToQuery(uid, wrappedParams);\n\n let entitiesToDelete = await db.query(uid).findMany(query);\n\n if (!entitiesToDelete.length) {\n return { count: 0 };\n }\n\n const componentsToDelete = await Promise.all(\n entitiesToDelete.map((entityToDelete) => getComponents(uid, entityToDelete))\n );\n\n const deletedEntities = await db.query(uid).deleteMany(query);\n await Promise.all(\n componentsToDelete.map((compos) =>\n deleteComponents(uid, compos as any, { loadComponents: false })\n )\n );\n\n entitiesToDelete = await this.wrapResult(entitiesToDelete, { uid, action: 'delete' });\n\n // Trigger webhooks. One for each entity\n const { ENTRY_DELETE } = ALLOWED_WEBHOOK_EVENTS;\n await Promise.all(entitiesToDelete.map((entity) => this.emitEvent(uid, ENTRY_DELETE, entity)));\n\n return deletedEntities;\n },\n\n async load(uid, entity, field, params) {\n if (!_.isString(field)) {\n throw new Error(`Invalid load. Expected \"${field}\" to be a string`);\n }\n\n const loadedEntity = await db\n .query(uid)\n .load(entity, field, transformLoadParamsToQuery(uid, field, params ?? {}));\n\n return this.wrapResult(loadedEntity, { uid, field, action: 'load' });\n },\n\n async loadPages(uid, entity, field, params, pagination = {}) {\n if (!_.isString(field)) {\n throw new Error(`Invalid load. Expected \"${field}\" to be a string`);\n }\n\n const { attributes } = strapi.getModel(uid);\n const attribute = attributes[field];\n\n if (!relationUtils.isAnyToMany(attribute)) {\n throw new Error(`Invalid load. Expected \"${field}\" to be an anyToMany relational attribute`);\n }\n\n const query = transformLoadParamsToQuery(uid, field, params ?? {}, pagination);\n\n const loadedPage = await db.query(uid).loadPages(entity, field, query);\n\n return {\n ...loadedPage,\n results: await this.wrapResult(loadedPage.results, { uid, field, action: 'load' }),\n };\n },\n});\n\nexport default (ctx: {\n strapi: Strapi;\n db: Database;\n eventHub: EventHub;\n entityValidator: EntityValidator;\n}): Decoratable<EntityService.EntityService> => {\n Object.entries(ALLOWED_WEBHOOK_EVENTS).forEach(([key, value]) => {\n ctx.strapi.webhookStore?.addAllowedEvent(key, value);\n });\n\n const implementation = createDefaultImplementation(ctx);\n\n const service = {\n implementation,\n decorate<T extends object>(decorator: (current: typeof implementation) => T) {\n if (typeof decorator !== 'function') {\n throw new Error(`Decorator must be a function, received ${typeof decorator}`);\n }\n\n this.implementation = { ...this.implementation, ...decorator(this.implementation) };\n return this;\n },\n };\n\n const delegator = delegate(service, 'implementation');\n\n // delegate every method in implementation\n Object.keys(service.implementation).forEach((key) => delegator.method(key));\n\n // wrap methods to handle Database Errors\n service.decorate((oldService: EntityService.EntityService) => {\n const newService = _.mapValues(\n oldService,\n (method, methodName: keyof EntityService.EntityService) =>\n async function (this: EntityService.EntityService, ...args: []) {\n try {\n return await (oldService[methodName] as Utils.Function.AnyPromise).call(this, ...args);\n } catch (error) {\n if (\n databaseErrorsToTransform.some(\n (errorToTransform) => error instanceof errorToTransform\n )\n ) {\n if (error instanceof Error) {\n throw new errors.ValidationError(error.message);\n }\n\n throw error;\n }\n throw error;\n }\n }\n );\n\n return newService;\n });\n\n return service as unknown as Decoratable<EntityService.EntityService>;\n};\n"],"names":["databaseErrors","uploadFiles","contentTypesUtils","relationUtils","errors"],"mappings":"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"}
@@ -1,8 +1,8 @@
1
- import type { Common, EntityService } from '@strapi/types';
1
+ import type { Common, Documents } from '@strapi/types';
2
2
  declare const pickSelectionParams: <TUID extends Common.UID.ContentType>(data: unknown) => {
3
- fields?: EntityService.Params.Fields.Any<TUID> | undefined;
3
+ fields?: Documents.Params.Fields.Any<TUID> | undefined;
4
4
  } & {
5
- populate?: EntityService.Params.Populate.Any<TUID> | undefined;
6
- };
5
+ populate?: Documents.Params.Populate.Any<TUID> | undefined;
6
+ } & Documents.Params.PublicationStatus.Param;
7
7
  export { pickSelectionParams };
8
8
  //# sourceMappingURL=params.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"params.d.ts","sourceRoot":"","sources":["../../../src/services/entity-service/params.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAE3D,QAAA,MAAM,mBAAmB,8CACjB,OAAO;;;;CAGd,CAAC;AAEF,OAAO,EAAE,mBAAmB,EAAE,CAAC"}
1
+ {"version":3,"file":"params.d.ts","sourceRoot":"","sources":["../../../src/services/entity-service/params.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAEvD,QAAA,MAAM,mBAAmB,8CACjB,OAAO;;;;4CAGd,CAAC;AAEF,OAAO,EAAE,mBAAmB,EAAE,CAAC"}
@@ -2,7 +2,7 @@
2
2
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
3
  const _ = require("lodash/fp");
4
4
  const pickSelectionParams = (data) => {
5
- return _.pick(["fields", "populate"], data);
5
+ return _.pick(["fields", "populate", "status"], data);
6
6
  };
7
7
  exports.pickSelectionParams = pickSelectionParams;
8
8
  //# sourceMappingURL=params.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"params.js","sources":["../../../src/services/entity-service/params.ts"],"sourcesContent":["import { pick } from 'lodash/fp';\nimport type { Common, EntityService } from '@strapi/types';\n\nconst pickSelectionParams = <TUID extends Common.UID.ContentType>(\n data: unknown\n): EntityService.Params.Pick<TUID, 'fields' | 'populate'> => {\n return pick(['fields', 'populate'], data);\n};\n\nexport { pickSelectionParams };\n"],"names":["pick"],"mappings":";;;AAGM,MAAA,sBAAsB,CAC1B,SAC2D;AAC3D,SAAOA,EAAK,KAAA,CAAC,UAAU,UAAU,GAAG,IAAI;AAC1C;;"}
1
+ {"version":3,"file":"params.js","sources":["../../../src/services/entity-service/params.ts"],"sourcesContent":["import { pick } from 'lodash/fp';\nimport type { Common, Documents } from '@strapi/types';\n\nconst pickSelectionParams = <TUID extends Common.UID.ContentType>(\n data: unknown\n): Documents.Params.Pick<TUID, 'fields' | 'populate' | 'status'> => {\n return pick(['fields', 'populate', 'status'], data);\n};\n\nexport { pickSelectionParams };\n"],"names":["pick"],"mappings":";;;AAGM,MAAA,sBAAsB,CAC1B,SACkE;AAClE,SAAOA,EAAAA,KAAK,CAAC,UAAU,YAAY,QAAQ,GAAG,IAAI;AACpD;;"}
@@ -1,6 +1,6 @@
1
1
  import { pick } from "lodash/fp";
2
2
  const pickSelectionParams = (data) => {
3
- return pick(["fields", "populate"], data);
3
+ return pick(["fields", "populate", "status"], data);
4
4
  };
5
5
  export {
6
6
  pickSelectionParams
@@ -1 +1 @@
1
- {"version":3,"file":"params.mjs","sources":["../../../src/services/entity-service/params.ts"],"sourcesContent":["import { pick } from 'lodash/fp';\nimport type { Common, EntityService } from '@strapi/types';\n\nconst pickSelectionParams = <TUID extends Common.UID.ContentType>(\n data: unknown\n): EntityService.Params.Pick<TUID, 'fields' | 'populate'> => {\n return pick(['fields', 'populate'], data);\n};\n\nexport { pickSelectionParams };\n"],"names":[],"mappings":";AAGM,MAAA,sBAAsB,CAC1B,SAC2D;AAC3D,SAAO,KAAK,CAAC,UAAU,UAAU,GAAG,IAAI;AAC1C;"}
1
+ {"version":3,"file":"params.mjs","sources":["../../../src/services/entity-service/params.ts"],"sourcesContent":["import { pick } from 'lodash/fp';\nimport type { Common, Documents } from '@strapi/types';\n\nconst pickSelectionParams = <TUID extends Common.UID.ContentType>(\n data: unknown\n): Documents.Params.Pick<TUID, 'fields' | 'populate' | 'status'> => {\n return pick(['fields', 'populate', 'status'], data);\n};\n\nexport { pickSelectionParams };\n"],"names":[],"mappings":";AAGM,MAAA,sBAAsB,CAC1B,SACkE;AAClE,SAAO,KAAK,CAAC,UAAU,YAAY,QAAQ,GAAG,IAAI;AACpD;"}
@@ -22,7 +22,7 @@ const loadJsFile = (file) => {
22
22
  };
23
23
  const loadJSONFile = (file) => {
24
24
  try {
25
- return strapiUtils.templateConfiguration(JSON.parse(fs__default.default.readFileSync(file).toString()));
25
+ return JSON.parse(fs__default.default.readFileSync(file).toString());
26
26
  } catch (error) {
27
27
  if (error instanceof Error) {
28
28
  throw new Error(`Could not load json config file ${file}: ${error.message}`);
@@ -1 +1 @@
1
- {"version":3,"file":"load-config-file.js","sources":["../../src/utils/load-config-file.ts"],"sourcesContent":["import path from 'path';\nimport fs from 'fs';\nimport { templateConfiguration, env, importDefault } from '@strapi/utils';\n\nconst loadJsFile = (file: string) => {\n try {\n const jsModule = importDefault(file);\n\n // call if function\n if (typeof jsModule === 'function') {\n return jsModule({ env });\n }\n\n return jsModule;\n } catch (error) {\n if (error instanceof Error) {\n throw new Error(`Could not load js config file ${file}: ${error.message}`);\n }\n\n throw new Error('Unknown error');\n }\n};\n\nconst loadJSONFile = (file: string) => {\n try {\n return templateConfiguration(JSON.parse(fs.readFileSync(file).toString()));\n } catch (error) {\n if (error instanceof Error) {\n throw new Error(`Could not load json config file ${file}: ${error.message}`);\n }\n\n throw new Error('Unknown error');\n }\n};\n\nexport const loadConfigFile = (file: string) => {\n const ext = path.extname(file);\n\n switch (ext) {\n case '.js':\n return loadJsFile(file);\n case '.json':\n return loadJSONFile(file);\n default:\n return {};\n }\n};\n"],"names":["importDefault","env","templateConfiguration","fs","path"],"mappings":";;;;;;;;AAIA,MAAM,aAAa,CAAC,SAAiB;AAC/B,MAAA;AACI,UAAA,WAAWA,0BAAc,IAAI;AAG/B,QAAA,OAAO,aAAa,YAAY;AAC3B,aAAA,SAAS,OAAEC,YAAA,IAAA,CAAK;AAAA,IACzB;AAEO,WAAA;AAAA,WACA,OAAO;AACd,QAAI,iBAAiB,OAAO;AAC1B,YAAM,IAAI,MAAM,iCAAiC,IAAI,KAAK,MAAM,OAAO,EAAE;AAAA,IAC3E;AAEM,UAAA,IAAI,MAAM,eAAe;AAAA,EACjC;AACF;AAEA,MAAM,eAAe,CAAC,SAAiB;AACjC,MAAA;AACK,WAAAC,YAAA,sBAAsB,KAAK,MAAMC,YAAA,QAAG,aAAa,IAAI,EAAE,SAAU,CAAA,CAAC;AAAA,WAClE,OAAO;AACd,QAAI,iBAAiB,OAAO;AAC1B,YAAM,IAAI,MAAM,mCAAmC,IAAI,KAAK,MAAM,OAAO,EAAE;AAAA,IAC7E;AAEM,UAAA,IAAI,MAAM,eAAe;AAAA,EACjC;AACF;AAEa,MAAA,iBAAiB,CAAC,SAAiB;AACxC,QAAA,MAAMC,cAAAA,QAAK,QAAQ,IAAI;AAE7B,UAAQ,KAAK;AAAA,IACX,KAAK;AACH,aAAO,WAAW,IAAI;AAAA,IACxB,KAAK;AACH,aAAO,aAAa,IAAI;AAAA,IAC1B;AACE,aAAO;EACX;AACF;;"}
1
+ {"version":3,"file":"load-config-file.js","sources":["../../src/utils/load-config-file.ts"],"sourcesContent":["import path from 'path';\nimport fs from 'fs';\nimport { env, importDefault } from '@strapi/utils';\n\nconst loadJsFile = (file: string) => {\n try {\n const jsModule = importDefault(file);\n\n // call if function\n if (typeof jsModule === 'function') {\n return jsModule({ env });\n }\n\n return jsModule;\n } catch (error) {\n if (error instanceof Error) {\n throw new Error(`Could not load js config file ${file}: ${error.message}`);\n }\n\n throw new Error('Unknown error');\n }\n};\n\nconst loadJSONFile = (file: string) => {\n try {\n return JSON.parse(fs.readFileSync(file).toString());\n } catch (error) {\n if (error instanceof Error) {\n throw new Error(`Could not load json config file ${file}: ${error.message}`);\n }\n\n throw new Error('Unknown error');\n }\n};\n\nexport const loadConfigFile = (file: string) => {\n const ext = path.extname(file);\n\n switch (ext) {\n case '.js':\n return loadJsFile(file);\n case '.json':\n return loadJSONFile(file);\n default:\n return {};\n }\n};\n"],"names":["importDefault","env","fs","path"],"mappings":";;;;;;;;AAIA,MAAM,aAAa,CAAC,SAAiB;AAC/B,MAAA;AACI,UAAA,WAAWA,0BAAc,IAAI;AAG/B,QAAA,OAAO,aAAa,YAAY;AAC3B,aAAA,SAAS,OAAEC,YAAA,IAAA,CAAK;AAAA,IACzB;AAEO,WAAA;AAAA,WACA,OAAO;AACd,QAAI,iBAAiB,OAAO;AAC1B,YAAM,IAAI,MAAM,iCAAiC,IAAI,KAAK,MAAM,OAAO,EAAE;AAAA,IAC3E;AAEM,UAAA,IAAI,MAAM,eAAe;AAAA,EACjC;AACF;AAEA,MAAM,eAAe,CAAC,SAAiB;AACjC,MAAA;AACF,WAAO,KAAK,MAAMC,YAAA,QAAG,aAAa,IAAI,EAAE,UAAU;AAAA,WAC3C,OAAO;AACd,QAAI,iBAAiB,OAAO;AAC1B,YAAM,IAAI,MAAM,mCAAmC,IAAI,KAAK,MAAM,OAAO,EAAE;AAAA,IAC7E;AAEM,UAAA,IAAI,MAAM,eAAe;AAAA,EACjC;AACF;AAEa,MAAA,iBAAiB,CAAC,SAAiB;AACxC,QAAA,MAAMC,cAAAA,QAAK,QAAQ,IAAI;AAE7B,UAAQ,KAAK;AAAA,IACX,KAAK;AACH,aAAO,WAAW,IAAI;AAAA,IACxB,KAAK;AACH,aAAO,aAAa,IAAI;AAAA,IAC1B;AACE,aAAO;EACX;AACF;;"}
@@ -1,6 +1,6 @@
1
1
  import path from "path";
2
2
  import fs from "fs";
3
- import { importDefault, env, templateConfiguration } from "@strapi/utils";
3
+ import { importDefault, env } from "@strapi/utils";
4
4
  const loadJsFile = (file) => {
5
5
  try {
6
6
  const jsModule = importDefault(file);
@@ -17,7 +17,7 @@ const loadJsFile = (file) => {
17
17
  };
18
18
  const loadJSONFile = (file) => {
19
19
  try {
20
- return templateConfiguration(JSON.parse(fs.readFileSync(file).toString()));
20
+ return JSON.parse(fs.readFileSync(file).toString());
21
21
  } catch (error) {
22
22
  if (error instanceof Error) {
23
23
  throw new Error(`Could not load json config file ${file}: ${error.message}`);
@@ -1 +1 @@
1
- {"version":3,"file":"load-config-file.mjs","sources":["../../src/utils/load-config-file.ts"],"sourcesContent":["import path from 'path';\nimport fs from 'fs';\nimport { templateConfiguration, env, importDefault } from '@strapi/utils';\n\nconst loadJsFile = (file: string) => {\n try {\n const jsModule = importDefault(file);\n\n // call if function\n if (typeof jsModule === 'function') {\n return jsModule({ env });\n }\n\n return jsModule;\n } catch (error) {\n if (error instanceof Error) {\n throw new Error(`Could not load js config file ${file}: ${error.message}`);\n }\n\n throw new Error('Unknown error');\n }\n};\n\nconst loadJSONFile = (file: string) => {\n try {\n return templateConfiguration(JSON.parse(fs.readFileSync(file).toString()));\n } catch (error) {\n if (error instanceof Error) {\n throw new Error(`Could not load json config file ${file}: ${error.message}`);\n }\n\n throw new Error('Unknown error');\n }\n};\n\nexport const loadConfigFile = (file: string) => {\n const ext = path.extname(file);\n\n switch (ext) {\n case '.js':\n return loadJsFile(file);\n case '.json':\n return loadJSONFile(file);\n default:\n return {};\n }\n};\n"],"names":[],"mappings":";;;AAIA,MAAM,aAAa,CAAC,SAAiB;AAC/B,MAAA;AACI,UAAA,WAAW,cAAc,IAAI;AAG/B,QAAA,OAAO,aAAa,YAAY;AAC3B,aAAA,SAAS,EAAE,IAAA,CAAK;AAAA,IACzB;AAEO,WAAA;AAAA,WACA,OAAO;AACd,QAAI,iBAAiB,OAAO;AAC1B,YAAM,IAAI,MAAM,iCAAiC,IAAI,KAAK,MAAM,OAAO,EAAE;AAAA,IAC3E;AAEM,UAAA,IAAI,MAAM,eAAe;AAAA,EACjC;AACF;AAEA,MAAM,eAAe,CAAC,SAAiB;AACjC,MAAA;AACK,WAAA,sBAAsB,KAAK,MAAM,GAAG,aAAa,IAAI,EAAE,SAAU,CAAA,CAAC;AAAA,WAClE,OAAO;AACd,QAAI,iBAAiB,OAAO;AAC1B,YAAM,IAAI,MAAM,mCAAmC,IAAI,KAAK,MAAM,OAAO,EAAE;AAAA,IAC7E;AAEM,UAAA,IAAI,MAAM,eAAe;AAAA,EACjC;AACF;AAEa,MAAA,iBAAiB,CAAC,SAAiB;AACxC,QAAA,MAAM,KAAK,QAAQ,IAAI;AAE7B,UAAQ,KAAK;AAAA,IACX,KAAK;AACH,aAAO,WAAW,IAAI;AAAA,IACxB,KAAK;AACH,aAAO,aAAa,IAAI;AAAA,IAC1B;AACE,aAAO;EACX;AACF;"}
1
+ {"version":3,"file":"load-config-file.mjs","sources":["../../src/utils/load-config-file.ts"],"sourcesContent":["import path from 'path';\nimport fs from 'fs';\nimport { env, importDefault } from '@strapi/utils';\n\nconst loadJsFile = (file: string) => {\n try {\n const jsModule = importDefault(file);\n\n // call if function\n if (typeof jsModule === 'function') {\n return jsModule({ env });\n }\n\n return jsModule;\n } catch (error) {\n if (error instanceof Error) {\n throw new Error(`Could not load js config file ${file}: ${error.message}`);\n }\n\n throw new Error('Unknown error');\n }\n};\n\nconst loadJSONFile = (file: string) => {\n try {\n return JSON.parse(fs.readFileSync(file).toString());\n } catch (error) {\n if (error instanceof Error) {\n throw new Error(`Could not load json config file ${file}: ${error.message}`);\n }\n\n throw new Error('Unknown error');\n }\n};\n\nexport const loadConfigFile = (file: string) => {\n const ext = path.extname(file);\n\n switch (ext) {\n case '.js':\n return loadJsFile(file);\n case '.json':\n return loadJSONFile(file);\n default:\n return {};\n }\n};\n"],"names":[],"mappings":";;;AAIA,MAAM,aAAa,CAAC,SAAiB;AAC/B,MAAA;AACI,UAAA,WAAW,cAAc,IAAI;AAG/B,QAAA,OAAO,aAAa,YAAY;AAC3B,aAAA,SAAS,EAAE,IAAA,CAAK;AAAA,IACzB;AAEO,WAAA;AAAA,WACA,OAAO;AACd,QAAI,iBAAiB,OAAO;AAC1B,YAAM,IAAI,MAAM,iCAAiC,IAAI,KAAK,MAAM,OAAO,EAAE;AAAA,IAC3E;AAEM,UAAA,IAAI,MAAM,eAAe;AAAA,EACjC;AACF;AAEA,MAAM,eAAe,CAAC,SAAiB;AACjC,MAAA;AACF,WAAO,KAAK,MAAM,GAAG,aAAa,IAAI,EAAE,UAAU;AAAA,WAC3C,OAAO;AACd,QAAI,iBAAiB,OAAO;AAC1B,YAAM,IAAI,MAAM,mCAAmC,IAAI,KAAK,MAAM,OAAO,EAAE;AAAA,IAC7E;AAEM,UAAA,IAAI,MAAM,eAAe;AAAA,EACjC;AACF;AAEa,MAAA,iBAAiB,CAAC,SAAiB;AACxC,QAAA,MAAM,KAAK,QAAQ,IAAI;AAE7B,UAAQ,KAAK;AAAA,IACX,KAAK;AACH,aAAO,WAAW,IAAI;AAAA,IACxB,KAAK;AACH,aAAO,aAAa,IAAI;AAAA,IAC1B;AACE,aAAO;EACX;AACF;"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@strapi/core",
3
- "version": "0.0.0-experimental.a407f3bc8fb79a53cf7975140864526b6ddbac4b",
3
+ "version": "0.0.0-experimental.fc1ac2acd58c8a5a858679956b6d102ac5ee4011",
4
4
  "description": "Core of Strapi",
5
5
  "homepage": "https://strapi.io",
6
6
  "bugs": {
@@ -55,16 +55,16 @@
55
55
  "@koa/cors": "3.4.3",
56
56
  "@koa/router": "10.1.1",
57
57
  "@paralleldrive/cuid2": "2.2.2",
58
- "@strapi/admin": "0.0.0-experimental.a407f3bc8fb79a53cf7975140864526b6ddbac4b",
59
- "@strapi/database": "0.0.0-experimental.a407f3bc8fb79a53cf7975140864526b6ddbac4b",
60
- "@strapi/generate-new": "0.0.0-experimental.a407f3bc8fb79a53cf7975140864526b6ddbac4b",
61
- "@strapi/generators": "0.0.0-experimental.a407f3bc8fb79a53cf7975140864526b6ddbac4b",
62
- "@strapi/logger": "0.0.0-experimental.a407f3bc8fb79a53cf7975140864526b6ddbac4b",
63
- "@strapi/pack-up": "0.0.0-experimental.a407f3bc8fb79a53cf7975140864526b6ddbac4b",
64
- "@strapi/permissions": "0.0.0-experimental.a407f3bc8fb79a53cf7975140864526b6ddbac4b",
65
- "@strapi/types": "0.0.0-experimental.a407f3bc8fb79a53cf7975140864526b6ddbac4b",
66
- "@strapi/typescript-utils": "0.0.0-experimental.a407f3bc8fb79a53cf7975140864526b6ddbac4b",
67
- "@strapi/utils": "0.0.0-experimental.a407f3bc8fb79a53cf7975140864526b6ddbac4b",
58
+ "@strapi/admin": "0.0.0-experimental.fc1ac2acd58c8a5a858679956b6d102ac5ee4011",
59
+ "@strapi/database": "0.0.0-experimental.fc1ac2acd58c8a5a858679956b6d102ac5ee4011",
60
+ "@strapi/generate-new": "0.0.0-experimental.fc1ac2acd58c8a5a858679956b6d102ac5ee4011",
61
+ "@strapi/generators": "0.0.0-experimental.fc1ac2acd58c8a5a858679956b6d102ac5ee4011",
62
+ "@strapi/logger": "0.0.0-experimental.fc1ac2acd58c8a5a858679956b6d102ac5ee4011",
63
+ "@strapi/pack-up": "0.0.0-experimental.fc1ac2acd58c8a5a858679956b6d102ac5ee4011",
64
+ "@strapi/permissions": "0.0.0-experimental.fc1ac2acd58c8a5a858679956b6d102ac5ee4011",
65
+ "@strapi/types": "0.0.0-experimental.fc1ac2acd58c8a5a858679956b6d102ac5ee4011",
66
+ "@strapi/typescript-utils": "0.0.0-experimental.fc1ac2acd58c8a5a858679956b6d102ac5ee4011",
67
+ "@strapi/utils": "0.0.0-experimental.fc1ac2acd58c8a5a858679956b6d102ac5ee4011",
68
68
  "bcryptjs": "2.4.3",
69
69
  "boxen": "5.1.2",
70
70
  "chalk": "4.1.2",
@@ -122,13 +122,13 @@
122
122
  "@types/node": "18.18.4",
123
123
  "@types/node-schedule": "2.1.0",
124
124
  "@types/statuses": "2.0.1",
125
- "eslint-config-custom": "0.0.0-experimental.a407f3bc8fb79a53cf7975140864526b6ddbac4b",
125
+ "eslint-config-custom": "0.0.0-experimental.fc1ac2acd58c8a5a858679956b6d102ac5ee4011",
126
126
  "supertest": "6.3.3",
127
- "tsconfig": "0.0.0-experimental.a407f3bc8fb79a53cf7975140864526b6ddbac4b"
127
+ "tsconfig": "0.0.0-experimental.fc1ac2acd58c8a5a858679956b6d102ac5ee4011"
128
128
  },
129
129
  "engines": {
130
130
  "node": ">=18.0.0 <=20.x.x",
131
131
  "npm": ">=6.0.0"
132
132
  },
133
- "gitHead": "a407f3bc8fb79a53cf7975140864526b6ddbac4b"
133
+ "gitHead": "fc1ac2acd58c8a5a858679956b6d102ac5ee4011"
134
134
  }
@@ -1,8 +0,0 @@
1
- import type { Database } from '@strapi/database';
2
- import type { Documents, Strapi } from '@strapi/types';
3
- declare const _default: (ctx: {
4
- strapi: Strapi;
5
- db: Database;
6
- }) => Documents.Engine;
7
- export default _default;
8
- //# sourceMappingURL=document-engine.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"document-engine.d.ts","sourceRoot":"","sources":["../../../src/services/document-service/document-engine.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,KAAK,EAAE,SAAS,EAAU,MAAM,EAAE,MAAM,eAAe,CAAC;8BAkV1C;IAAE,QAAQ,MAAM,CAAC;IAAC,EAAE,EAAE,QAAQ,CAAA;CAAE,KAAG,UAAU,MAAM;AAAxE,wBAKE"}
@@ -1,241 +0,0 @@
1
- "use strict";
2
- const strapiUtils = require("@strapi/utils");
3
- const _ = require("lodash/fp");
4
- const components = require("../entity-service/components.js");
5
- const transformContentTypesToModels = require("../../utils/transform-content-types-to-models.js");
6
- const index$1 = require("../entity-service/attributes/index.js");
7
- const index = require("../entity-validator/index.js");
8
- const params = require("../entity-service/params.js");
9
- const idTransform = require("./transform/id-transform.js");
10
- const populate = require("./utils/populate.js");
11
- const data = require("./transform/data.js");
12
- const { transformParamsToQuery } = strapiUtils.convertQueryParams;
13
- const createPipeline = (data2, context) => {
14
- return index$1.applyTransforms(data2, context);
15
- };
16
- const updatePipeline = (data2, context) => {
17
- return index$1.applyTransforms(data2, context);
18
- };
19
- const createDocumentEngine = ({
20
- strapi,
21
- db
22
- }) => ({
23
- async findMany(uid, params2) {
24
- const query = await strapiUtils.pipeAsync(
25
- (params22) => idTransform.transformParamsDocumentId(uid, params22, { isDraft: params22.status === "draft" }),
26
- (params22) => transformParamsToQuery(uid, params22),
27
- (query2) => _.set("where", { ...params2?.lookup, ...query2.where }, query2)
28
- )(params2 || {});
29
- return db.query(uid).findMany(query);
30
- },
31
- async findFirst(uid, params2) {
32
- const query = await strapiUtils.pipeAsync(
33
- (params22) => idTransform.transformParamsDocumentId(uid, params22, { isDraft: params22.status === "draft" }),
34
- (params22) => transformParamsToQuery(uid, params22)
35
- )(params2 || {});
36
- return db.query(uid).findOne({ ...query, where: { ...params2?.lookup, ...query.where } });
37
- },
38
- async findOne(uid, documentId, params2) {
39
- const query = await strapiUtils.pipeAsync(
40
- (params22) => idTransform.transformParamsDocumentId(uid, params22, { isDraft: params22.status === "draft" }),
41
- (params22) => transformParamsToQuery(uid, params22)
42
- )(params2 || {});
43
- return db.query(uid).findOne({ ...query, where: { ...params2?.lookup, ...query.where, documentId } });
44
- },
45
- async delete(uid, documentId, params2 = {}) {
46
- const query = await strapiUtils.pipeAsync(
47
- (params22) => transformParamsToQuery(uid, params22),
48
- (query2) => _.set("where", { ...params2?.lookup, ...query2.where, documentId }, query2)
49
- )(params2);
50
- if (params2.status === "draft") {
51
- throw new Error("Cannot delete a draft document");
52
- }
53
- const entriesToDelete = await db.query(uid).findMany(query);
54
- await strapiUtils.mapAsync(entriesToDelete, async (entryToDelete) => {
55
- await this.deleteEntry(uid, entryToDelete.id);
56
- });
57
- return { deletedEntries: entriesToDelete.length };
58
- },
59
- async deleteEntry(uid, entryId) {
60
- const componentsToDelete = await components.getComponents(uid, { id: entryId });
61
- await db.query(uid).delete({ where: { id: entryId } });
62
- await components.deleteComponents(uid, componentsToDelete, { loadComponents: false });
63
- },
64
- async create(uid, params$1) {
65
- const { data: data2, ...restParams } = await idTransform.transformParamsDocumentId(uid, params$1, {
66
- locale: params$1.locale,
67
- // @ts-expect-error - published at is not always present
68
- // User can not set publishedAt on create, but other methods in the engine can (publish)
69
- isDraft: !params$1.data?.publishedAt
70
- });
71
- const query = transformParamsToQuery(uid, params.pickSelectionParams(restParams));
72
- if (!params$1.data) {
73
- throw new Error("Create requires data attribute");
74
- }
75
- const contentType = strapi.contentType(uid);
76
- const validData = await index.validateEntityCreation(contentType, data2, {
77
- isDraft: !data2.publishedAt,
78
- locale: params$1?.locale
79
- });
80
- const componentData = await components.createComponents(uid, validData);
81
- const entryData = createPipeline(
82
- Object.assign(components.omitComponentData(contentType, validData), componentData),
83
- { contentType }
84
- );
85
- return db.query(uid).create({ ...query, data: entryData });
86
- },
87
- // NOTE: What happens if user doesn't provide specific publications state and locale to update?
88
- async update(uid, documentId, params$1) {
89
- const { data: data2, ...restParams } = await idTransform.transformParamsDocumentId(uid, params$1 || {}, {
90
- isDraft: true,
91
- locale: params$1?.locale
92
- });
93
- const query = transformParamsToQuery(uid, params.pickSelectionParams(restParams || {}));
94
- const model = strapi.contentType(uid);
95
- const entryToUpdate = await db.query(uid).findOne({ ...query, where: { ...params$1?.lookup, ...query?.where, documentId } });
96
- if (!entryToUpdate)
97
- return null;
98
- const validData = await index.validateEntityUpdate(
99
- model,
100
- data2,
101
- {
102
- isDraft: true,
103
- // Always update the draft version
104
- locale: params$1?.locale
105
- },
106
- entryToUpdate
107
- );
108
- const componentData = await components.updateComponents(uid, entryToUpdate, validData);
109
- const entryData = updatePipeline(
110
- Object.assign(components.omitComponentData(model, validData), componentData),
111
- { contentType: model }
112
- );
113
- return db.query(uid).update({ ...query, where: { id: entryToUpdate.id }, data: entryData });
114
- },
115
- async count(uid, params2 = void 0) {
116
- const query = await strapiUtils.pipeAsync(
117
- (params22) => transformParamsToQuery(uid, params22),
118
- (query2) => _.set("where", { ...params2?.lookup, ...query2.where }, query2)
119
- )(params2 || {});
120
- return db.query(uid).count(query);
121
- },
122
- async clone(uid, documentId, params$1) {
123
- const { data: data2, ...restParams } = await idTransform.transformParamsDocumentId(uid, params$1 || {}, {
124
- isDraft: true,
125
- locale: params$1?.locale
126
- });
127
- const query = transformParamsToQuery(uid, params.pickSelectionParams(restParams));
128
- const model = strapi.contentType(uid);
129
- const entries = await db.query(uid).findMany({
130
- ...query,
131
- where: { ...params$1?.lookup, ...query.where, documentId }
132
- });
133
- if (!entries.length) {
134
- return null;
135
- }
136
- const newDocumentId = transformContentTypesToModels.createDocumentId();
137
- const versions = await strapiUtils.mapAsync(entries, async (entryToClone) => {
138
- const isDraft = strapiUtils.contentTypes.isDraft(data2);
139
- const validData = await index.validateEntityUpdate(
140
- model,
141
- // Omit id fields, the cloned entity id will be generated by the database
142
- _.omit(["id"], data2),
143
- { isDraft, ...params$1?.lookup },
144
- entryToClone
145
- );
146
- const componentData = await components.cloneComponents(uid, entryToClone, validData);
147
- const entityData = createPipeline(
148
- Object.assign(components.omitComponentData(model, validData), componentData),
149
- { contentType: model }
150
- );
151
- return db.query(uid).clone(entryToClone.id, {
152
- ...query,
153
- // Allows entityData to override the documentId (e.g. when publishing)
154
- data: { documentId: newDocumentId, ...entityData, locale: entryToClone.locale }
155
- });
156
- });
157
- return { documentId: newDocumentId, versions };
158
- },
159
- // TODO: Handle relations so they target the published version
160
- async publish(uid, documentId, params2) {
161
- await this.delete(uid, documentId, {
162
- ...params2,
163
- lookup: { ...params2?.lookup, publishedAt: { $ne: null } }
164
- });
165
- const entriesToPublish = await strapi.db?.query(uid).findMany({
166
- where: {
167
- ...params2?.lookup,
168
- documentId,
169
- publishedAt: null
170
- },
171
- populate: populate.getDeepPopulate(uid)
172
- });
173
- const publishedEntries = await strapiUtils.mapAsync(
174
- entriesToPublish,
175
- strapiUtils.pipeAsync(
176
- _.set("publishedAt", /* @__PURE__ */ new Date()),
177
- _.set("documentId", documentId),
178
- _.omit("id"),
179
- // Transform relations to target published versions
180
- (entry) => {
181
- const opts = { uid, locale: entry.locale, isDraft: false, allowMissingId: true };
182
- return data.transformData(entry, opts);
183
- },
184
- // Create the published entry
185
- (data2) => this.create(uid, { ...params2, data: data2, locale: data2.locale })
186
- )
187
- );
188
- return { versions: publishedEntries };
189
- },
190
- async unpublish(uid, documentId, params2) {
191
- return this.delete(uid, documentId, {
192
- ...params2,
193
- lookup: { ...params2?.lookup, publishedAt: { $ne: null } }
194
- }).then(({ deletedEntries }) => ({ versions: deletedEntries }));
195
- },
196
- /**
197
- * Steps:
198
- * - Delete the matching draft versions (publishedAt = null)
199
- * - Clone the matching published versions into draft versions
200
- *
201
- * If the document has a published version, the draft version will be created from the published version.
202
- * If the document has no published version, the version will be removed.
203
- */
204
- async discardDraft(uid, documentId, params2) {
205
- await this.delete(uid, documentId, {
206
- ...params2,
207
- // Delete all drafts that match query
208
- lookup: { ...params2?.lookup, publishedAt: null }
209
- });
210
- const entriesToDraft = await strapi.db?.query(uid).findMany({
211
- where: {
212
- ...params2?.lookup,
213
- documentId,
214
- publishedAt: { $ne: null }
215
- },
216
- populate: populate.getDeepPopulate(uid)
217
- });
218
- const draftEntries = await strapiUtils.mapAsync(
219
- entriesToDraft,
220
- strapiUtils.pipeAsync(
221
- _.set("publishedAt", null),
222
- _.set("documentId", documentId),
223
- _.omit("id"),
224
- // Transform relations to target draft versions
225
- (entry) => {
226
- const opts = { uid, locale: entry.locale, isDraft: true, allowMissingId: true };
227
- return data.transformData(entry, opts);
228
- },
229
- // Create the draft entry
230
- (data2) => this.create(uid, { ...params2, locale: data2.locale, data: data2 })
231
- )
232
- );
233
- return { versions: draftEntries };
234
- }
235
- });
236
- const createDocumentEngine$1 = (ctx) => {
237
- const implementation = createDocumentEngine(ctx);
238
- return implementation;
239
- };
240
- module.exports = createDocumentEngine$1;
241
- //# sourceMappingURL=document-engine.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"document-engine.js","sources":["../../../src/services/document-service/document-engine.ts"],"sourcesContent":["import type { Database } from '@strapi/database';\nimport type { Documents, Schema, Strapi } from '@strapi/types';\nimport {\n contentTypes as contentTypesUtils,\n convertQueryParams,\n mapAsync,\n pipeAsync,\n} from '@strapi/utils';\n\nimport { omit, set } from 'lodash/fp';\n\nimport {\n cloneComponents,\n createComponents,\n deleteComponents,\n getComponents,\n omitComponentData,\n updateComponents,\n} from '../entity-service/components';\n\nimport { createDocumentId } from '../../utils/transform-content-types-to-models';\nimport { applyTransforms } from '../entity-service/attributes';\nimport entityValidator from '../entity-validator';\nimport { pickSelectionParams } from './params';\nimport { transformParamsDocumentId } from './transform/id-transform';\nimport { getDeepPopulate } from './utils/populate';\nimport { transformData } from './transform/data';\n\nconst { transformParamsToQuery } = convertQueryParams;\n\n/**\n * TODO: Sanitization / validation built-in\n * TODO: i18n - Move logic to i18n package\n * TODO: Webhooks\n * TODO: Audit logs\n * TODO: replace 'any'\n * TODO: availableLocales\n *\n */\ntype Context = {\n contentType: Schema.ContentType;\n};\n\nconst createPipeline = (data: Record<string, unknown>, context: Context) => {\n return applyTransforms(data, context);\n};\n\nconst updatePipeline = (data: Record<string, unknown>, context: Context) => {\n return applyTransforms(data, context);\n};\n\nconst createDocumentEngine = ({\n strapi,\n db,\n}: {\n strapi: Strapi;\n db: Database;\n}): Documents.Engine => ({\n async findMany(uid, params) {\n const query = await pipeAsync(\n (params) => transformParamsDocumentId(uid, params, { isDraft: params.status === 'draft' }),\n (params) => transformParamsToQuery(uid, params),\n (query) => set('where', { ...params?.lookup, ...query.where }, query)\n )(params || {});\n\n return db.query(uid).findMany(query);\n },\n\n async findFirst(uid, params) {\n const query = await pipeAsync(\n (params) => transformParamsDocumentId(uid, params, { isDraft: params.status === 'draft' }),\n (params) => transformParamsToQuery(uid, params)\n )(params || {});\n\n return db.query(uid).findOne({ ...query, where: { ...params?.lookup, ...query.where } });\n },\n\n async findOne(uid, documentId, params) {\n const query = await pipeAsync(\n (params) => transformParamsDocumentId(uid, params, { isDraft: params.status === 'draft' }),\n (params) => transformParamsToQuery(uid, params)\n )(params || {});\n\n return db\n .query(uid)\n .findOne({ ...query, where: { ...params?.lookup, ...query.where, documentId } });\n },\n\n async delete(uid, documentId, params = {} as any) {\n const query = await pipeAsync(\n (params) => transformParamsToQuery(uid, params),\n (query) => set('where', { ...params?.lookup, ...query.where, documentId }, query)\n )(params);\n\n if (params.status === 'draft') {\n throw new Error('Cannot delete a draft document');\n }\n\n const entriesToDelete = await db.query(uid).findMany(query);\n\n // Delete all matched entries and its components\n await mapAsync(entriesToDelete, async (entryToDelete: any) => {\n await this.deleteEntry(uid, entryToDelete.id);\n });\n\n return { deletedEntries: entriesToDelete.length };\n },\n\n async deleteEntry(uid, entryId) {\n const componentsToDelete = await getComponents(uid, { id: entryId });\n\n await db.query(uid).delete({ where: { id: entryId } });\n\n await deleteComponents(uid, componentsToDelete as any, { loadComponents: false });\n },\n\n async create(uid, params) {\n // Param parsing\n const { data, ...restParams } = await transformParamsDocumentId(uid, params, {\n locale: params.locale,\n // @ts-expect-error - published at is not always present\n // User can not set publishedAt on create, but other methods in the engine can (publish)\n isDraft: !params.data?.publishedAt,\n });\n\n const query = transformParamsToQuery(uid, pickSelectionParams(restParams) as any); // select / populate\n\n // Validation\n if (!params.data) {\n throw new Error('Create requires data attribute');\n }\n\n const contentType = strapi.contentType(uid);\n\n const validData = await entityValidator.validateEntityCreation(contentType, data, {\n isDraft: !data.publishedAt,\n locale: params?.locale,\n });\n\n // Component handling\n const componentData = await createComponents(uid, validData as any);\n const entryData = createPipeline(\n Object.assign(omitComponentData(contentType, validData), componentData),\n { contentType }\n );\n\n return db.query(uid).create({ ...query, data: entryData });\n },\n\n // NOTE: What happens if user doesn't provide specific publications state and locale to update?\n async update(uid, documentId, params) {\n // Param parsing\n const { data, ...restParams } = await transformParamsDocumentId(uid, params || {}, {\n isDraft: true,\n locale: params?.locale,\n });\n const query = transformParamsToQuery(uid, pickSelectionParams(restParams || {}) as any);\n\n // Validation\n const model = strapi.contentType(uid);\n // Find if document exists\n const entryToUpdate = await db\n .query(uid)\n .findOne({ ...query, where: { ...params?.lookup, ...query?.where, documentId } });\n if (!entryToUpdate) return null;\n\n const validData = await entityValidator.validateEntityUpdate(\n model,\n data,\n {\n isDraft: true, // Always update the draft version\n locale: params?.locale,\n },\n entryToUpdate\n );\n\n // Component handling\n const componentData = await updateComponents(uid, entryToUpdate, validData as any);\n const entryData = updatePipeline(\n Object.assign(omitComponentData(model, validData), componentData),\n { contentType: model }\n );\n\n return db.query(uid).update({ ...query, where: { id: entryToUpdate.id }, data: entryData });\n },\n\n async count(uid, params = undefined) {\n const query = await pipeAsync(\n (params) => transformParamsToQuery(uid, params),\n (query) => set('where', { ...params?.lookup, ...query.where }, query)\n )(params || {});\n\n return db.query(uid).count(query);\n },\n\n async clone(uid, documentId, params) {\n const { data, ...restParams } = await transformParamsDocumentId(uid, params || {}, {\n isDraft: true,\n locale: params?.locale,\n });\n const query = transformParamsToQuery(uid, pickSelectionParams(restParams) as any);\n // Param parsing\n\n // Validation\n const model = strapi.contentType(uid);\n // Find all locales of the document\n const entries = await db.query(uid).findMany({\n ...query,\n where: { ...params?.lookup, ...query.where, documentId },\n });\n\n // Document does not exist\n if (!entries.length) {\n return null;\n }\n\n const newDocumentId = createDocumentId();\n\n const versions = await mapAsync(entries, async (entryToClone: any) => {\n const isDraft = contentTypesUtils.isDraft(data);\n // Todo: Merge data with entry to clone\n const validData = await entityValidator.validateEntityUpdate(\n model,\n // Omit id fields, the cloned entity id will be generated by the database\n omit(['id'], data),\n { isDraft, ...params?.lookup },\n entryToClone\n );\n\n const componentData = await cloneComponents(uid, entryToClone, validData);\n const entityData = createPipeline(\n Object.assign(omitComponentData(model, validData), componentData),\n { contentType: model }\n );\n\n // TODO: Transform params to query\n return db.query(uid).clone(entryToClone.id, {\n ...query,\n // Allows entityData to override the documentId (e.g. when publishing)\n data: { documentId: newDocumentId, ...entityData, locale: entryToClone.locale },\n });\n });\n\n return { documentId: newDocumentId, versions };\n },\n\n // TODO: Handle relations so they target the published version\n async publish(uid, documentId, params) {\n // Delete already published versions that match the locales to be published\n await this.delete(uid, documentId, {\n ...params,\n lookup: { ...params?.lookup, publishedAt: { $ne: null } },\n });\n\n // Get deep populate\n const entriesToPublish = await strapi.db?.query(uid).findMany({\n where: {\n ...params?.lookup,\n documentId,\n publishedAt: null,\n },\n populate: getDeepPopulate(uid),\n });\n\n // Transform draft entry data and create published versions\n const publishedEntries = await mapAsync(\n entriesToPublish,\n pipeAsync(\n set('publishedAt', new Date()),\n set('documentId', documentId),\n omit('id'),\n // Transform relations to target published versions\n (entry) => {\n const opts = { uid, locale: entry.locale, isDraft: false, allowMissingId: true };\n return transformData(entry, opts);\n },\n // Create the published entry\n (data) => this.create(uid, { ...params, data, locale: data.locale })\n )\n );\n\n return { versions: publishedEntries };\n },\n\n async unpublish(uid, documentId, params) {\n // Delete all published versions\n return this.delete(uid, documentId, {\n ...params,\n lookup: { ...params?.lookup, publishedAt: { $ne: null } },\n }).then(({ deletedEntries }) => ({ versions: deletedEntries })) as any;\n },\n\n /**\n * Steps:\n * - Delete the matching draft versions (publishedAt = null)\n * - Clone the matching published versions into draft versions\n *\n * If the document has a published version, the draft version will be created from the published version.\n * If the document has no published version, the version will be removed.\n */\n async discardDraft(uid, documentId, params) {\n // Delete draft versions, clone published versions into draft versions\n await this.delete(uid, documentId, {\n ...params,\n // Delete all drafts that match query\n lookup: { ...params?.lookup, publishedAt: null },\n });\n\n // Get deep populate of published versions\n const entriesToDraft = await strapi.db?.query(uid).findMany({\n where: {\n ...params?.lookup,\n documentId,\n publishedAt: { $ne: null },\n },\n populate: getDeepPopulate(uid),\n });\n\n // Transform published entry data and create draft versions\n const draftEntries = await mapAsync(\n entriesToDraft,\n pipeAsync(\n set('publishedAt', null),\n set('documentId', documentId),\n omit('id'),\n // Transform relations to target draft versions\n (entry) => {\n const opts = { uid, locale: entry.locale, isDraft: true, allowMissingId: true };\n return transformData(entry, opts);\n },\n // Create the draft entry\n (data) => this.create(uid, { ...params, locale: data.locale, data })\n )\n );\n\n return { versions: draftEntries };\n },\n});\n\nexport default (ctx: { strapi: Strapi; db: Database }): Documents.Engine => {\n const implementation = createDocumentEngine(ctx);\n\n // TODO: Wrap with database error handling\n return implementation;\n};\n"],"names":["convertQueryParams","data","applyTransforms","params","pipeAsync","transformParamsDocumentId","query","set","mapAsync","getComponents","deleteComponents","pickSelectionParams","entityValidator","createComponents","omitComponentData","updateComponents","createDocumentId","contentTypesUtils","omit","cloneComponents","getDeepPopulate","transformData"],"mappings":"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"}