@strapi/core 0.0.0-experimental.22e8a4f31c0b65da00cc6c524a94de53fabc7a28 → 0.0.0-experimental.2363945b79274c79e6505e5a6c3cdec876ed8cec

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


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

Files changed (124) hide show
  1. package/dist/core-api/controller/collection-type.js.map +1 -1
  2. package/dist/core-api/controller/collection-type.mjs.map +1 -1
  3. package/dist/core-api/controller/index.d.ts.map +1 -1
  4. package/dist/core-api/controller/index.js +6 -1
  5. package/dist/core-api/controller/index.js.map +1 -1
  6. package/dist/core-api/controller/index.mjs +6 -1
  7. package/dist/core-api/controller/index.mjs.map +1 -1
  8. package/dist/core-api/controller/single-type.js.map +1 -1
  9. package/dist/core-api/controller/single-type.mjs.map +1 -1
  10. package/dist/core-api/controller/transform.d.ts +8 -7
  11. package/dist/core-api/controller/transform.d.ts.map +1 -1
  12. package/dist/core-api/controller/transform.js +18 -9
  13. package/dist/core-api/controller/transform.js.map +1 -1
  14. package/dist/core-api/controller/transform.mjs +18 -9
  15. package/dist/core-api/controller/transform.mjs.map +1 -1
  16. package/dist/core-api/service/collection-type.d.ts.map +1 -1
  17. package/dist/core-api/service/collection-type.js.map +1 -1
  18. package/dist/core-api/service/collection-type.mjs.map +1 -1
  19. package/dist/core-api/service/single-type.d.ts +3 -2
  20. package/dist/core-api/service/single-type.d.ts.map +1 -1
  21. package/dist/core-api/service/single-type.js +15 -3
  22. package/dist/core-api/service/single-type.js.map +1 -1
  23. package/dist/core-api/service/single-type.mjs +15 -3
  24. package/dist/core-api/service/single-type.mjs.map +1 -1
  25. package/dist/services/document-service/common.d.ts +2 -2
  26. package/dist/services/document-service/common.d.ts.map +1 -1
  27. package/dist/services/document-service/common.js.map +1 -1
  28. package/dist/services/document-service/common.mjs.map +1 -1
  29. package/dist/services/document-service/index.d.ts.map +1 -1
  30. package/dist/services/document-service/index.js +4 -4
  31. package/dist/services/document-service/index.js.map +1 -1
  32. package/dist/services/document-service/index.mjs +2 -2
  33. package/dist/services/document-service/index.mjs.map +1 -1
  34. package/dist/services/document-service/repository.d.ts +3 -0
  35. package/dist/services/document-service/repository.d.ts.map +1 -0
  36. package/dist/services/document-service/repository.js +309 -0
  37. package/dist/services/document-service/repository.js.map +1 -0
  38. package/dist/services/document-service/repository.mjs +309 -0
  39. package/dist/services/document-service/repository.mjs.map +1 -0
  40. package/dist/services/document-service/transform/fields.d.ts.map +1 -1
  41. package/dist/services/document-service/transform/fields.js +11 -10
  42. package/dist/services/document-service/transform/fields.js.map +1 -1
  43. package/dist/services/document-service/transform/fields.mjs +11 -10
  44. package/dist/services/document-service/transform/fields.mjs.map +1 -1
  45. package/dist/services/document-service/transform/id-transform.d.ts +2 -9
  46. package/dist/services/document-service/transform/id-transform.d.ts.map +1 -1
  47. package/dist/services/document-service/transform/id-transform.js +2 -32
  48. package/dist/services/document-service/transform/id-transform.js.map +1 -1
  49. package/dist/services/document-service/transform/id-transform.mjs +2 -32
  50. package/dist/services/document-service/transform/id-transform.mjs.map +1 -1
  51. package/dist/services/document-service/transform/populate.d.ts.map +1 -1
  52. package/dist/services/document-service/transform/populate.js +0 -10
  53. package/dist/services/document-service/transform/populate.js.map +1 -1
  54. package/dist/services/document-service/transform/populate.mjs +0 -10
  55. package/dist/services/document-service/transform/populate.mjs.map +1 -1
  56. package/dist/services/document-service/transform/relations/extract/data-ids.d.ts.map +1 -1
  57. package/dist/services/document-service/transform/relations/extract/data-ids.js +7 -4
  58. package/dist/services/document-service/transform/relations/extract/data-ids.js.map +1 -1
  59. package/dist/services/document-service/transform/relations/extract/data-ids.mjs +7 -4
  60. package/dist/services/document-service/transform/relations/extract/data-ids.mjs.map +1 -1
  61. package/dist/services/document-service/transform/relations/transform/data-ids.d.ts.map +1 -1
  62. package/dist/services/document-service/transform/relations/transform/data-ids.js +11 -9
  63. package/dist/services/document-service/transform/relations/transform/data-ids.js.map +1 -1
  64. package/dist/services/document-service/transform/relations/transform/data-ids.mjs +11 -9
  65. package/dist/services/document-service/transform/relations/transform/data-ids.mjs.map +1 -1
  66. package/dist/services/document-service/transform/relations/utils/data.d.ts +2 -4
  67. package/dist/services/document-service/transform/relations/utils/data.d.ts.map +1 -1
  68. package/dist/services/document-service/transform/relations/utils/data.js +1 -1
  69. package/dist/services/document-service/transform/relations/utils/data.js.map +1 -1
  70. package/dist/services/document-service/transform/relations/utils/data.mjs +1 -1
  71. package/dist/services/document-service/transform/relations/utils/data.mjs.map +1 -1
  72. package/dist/services/document-service/transform/relations/utils/i18n.d.ts +2 -2
  73. package/dist/services/document-service/transform/relations/utils/i18n.d.ts.map +1 -1
  74. package/dist/services/document-service/transform/relations/utils/i18n.js.map +1 -1
  75. package/dist/services/document-service/transform/relations/utils/i18n.mjs.map +1 -1
  76. package/dist/services/document-service/transform/relations/utils/types.d.ts +5 -1
  77. package/dist/services/document-service/transform/relations/utils/types.d.ts.map +1 -1
  78. package/dist/utils/transform-content-types-to-models.d.ts +174 -3
  79. package/dist/utils/transform-content-types-to-models.d.ts.map +1 -1
  80. package/dist/utils/transform-content-types-to-models.js +80 -41
  81. package/dist/utils/transform-content-types-to-models.js.map +1 -1
  82. package/dist/utils/transform-content-types-to-models.mjs +79 -41
  83. package/dist/utils/transform-content-types-to-models.mjs.map +1 -1
  84. package/package.json +14 -14
  85. package/dist/services/document-service/collection-type.d.ts +0 -4
  86. package/dist/services/document-service/collection-type.d.ts.map +0 -1
  87. package/dist/services/document-service/collection-type.js +0 -158
  88. package/dist/services/document-service/collection-type.js.map +0 -1
  89. package/dist/services/document-service/collection-type.mjs +0 -158
  90. package/dist/services/document-service/collection-type.mjs.map +0 -1
  91. package/dist/services/document-service/document-engine.d.ts +0 -8
  92. package/dist/services/document-service/document-engine.d.ts.map +0 -1
  93. package/dist/services/document-service/document-engine.js +0 -249
  94. package/dist/services/document-service/document-engine.js.map +0 -1
  95. package/dist/services/document-service/document-engine.mjs +0 -250
  96. package/dist/services/document-service/document-engine.mjs.map +0 -1
  97. package/dist/services/document-service/repository-factory.d.ts +0 -3
  98. package/dist/services/document-service/repository-factory.d.ts.map +0 -1
  99. package/dist/services/document-service/repository-factory.js +0 -12
  100. package/dist/services/document-service/repository-factory.js.map +0 -1
  101. package/dist/services/document-service/repository-factory.mjs +0 -12
  102. package/dist/services/document-service/repository-factory.mjs.map +0 -1
  103. package/dist/services/document-service/single-type.d.ts +0 -4
  104. package/dist/services/document-service/single-type.d.ts.map +0 -1
  105. package/dist/services/document-service/single-type.js +0 -105
  106. package/dist/services/document-service/single-type.js.map +0 -1
  107. package/dist/services/document-service/single-type.mjs +0 -105
  108. package/dist/services/document-service/single-type.mjs.map +0 -1
  109. package/dist/services/document-service/transform/filters.js +0 -49
  110. package/dist/services/document-service/transform/filters.js.map +0 -1
  111. package/dist/services/document-service/transform/filters.mjs +0 -49
  112. package/dist/services/document-service/transform/filters.mjs.map +0 -1
  113. package/dist/services/document-service/transform/relations/transform/output-ids.js +0 -26
  114. package/dist/services/document-service/transform/relations/transform/output-ids.js.map +0 -1
  115. package/dist/services/document-service/transform/relations/transform/output-ids.mjs +0 -26
  116. package/dist/services/document-service/transform/relations/transform/output-ids.mjs.map +0 -1
  117. package/dist/services/document-service/transform/sort.js +0 -44
  118. package/dist/services/document-service/transform/sort.js.map +0 -1
  119. package/dist/services/document-service/transform/sort.mjs +0 -44
  120. package/dist/services/document-service/transform/sort.mjs.map +0 -1
  121. package/dist/services/document-service/transform/utils.js +0 -23
  122. package/dist/services/document-service/transform/utils.js.map +0 -1
  123. package/dist/services/document-service/transform/utils.mjs +0 -23
  124. package/dist/services/document-service/transform/utils.mjs.map +0 -1
@@ -1,5 +1,16 @@
1
+ import { utils } from "@strapi/database";
1
2
  import { createId } from "@paralleldrive/cuid2";
2
3
  import assert from "node:assert";
4
+ import _ from "lodash/fp";
5
+ const { identifiers } = utils;
6
+ const COMPONENT_JOIN_TABLE_SUFFIX = "components";
7
+ const DZ_JOIN_TABLE_SUFFIX = "components";
8
+ const COMPONENT_INVERSE_COLUMN_NAME = "component";
9
+ const COMPONENT_TYPE_COLUMN = "component_type";
10
+ const ENTITY = "entity";
11
+ const getComponentJoinTableName = (collectionName) => identifiers.getTableName(collectionName, { suffix: COMPONENT_JOIN_TABLE_SUFFIX });
12
+ const getDzJoinTableName = (collectionName) => identifiers.getTableName(collectionName, { suffix: DZ_JOIN_TABLE_SUFFIX });
13
+ const { ID_COLUMN: id, FIELD_COLUMN: field, ORDER_COLUMN: order } = identifiers;
3
14
  const transformAttribute = (name, attribute, contentType) => {
4
15
  switch (attribute.type) {
5
16
  case "media": {
@@ -11,6 +22,11 @@ const transformAttribute = (name, attribute, contentType) => {
11
22
  };
12
23
  }
13
24
  case "component": {
25
+ const joinTableName = getComponentJoinTableName(contentType.collectionName);
26
+ const joinColumnEntityName = identifiers.getJoinColumnAttributeIdName(ENTITY);
27
+ const joinColumnInverseName = identifiers.getJoinColumnAttributeIdName(
28
+ COMPONENT_INVERSE_COLUMN_NAME
29
+ );
14
30
  return {
15
31
  type: "relation",
16
32
  relation: attribute.repeatable === true ? "oneToMany" : "oneToOne",
@@ -18,45 +34,50 @@ const transformAttribute = (name, attribute, contentType) => {
18
34
  // We need the join table name to be deterministic,
19
35
  // We need to allow passing the join table name as an option
20
36
  joinTable: {
21
- name: `${contentType.collectionName}_components`,
37
+ name: joinTableName,
22
38
  joinColumn: {
23
- name: "entity_id",
24
- referencedColumn: "id"
39
+ name: joinColumnEntityName,
40
+ referencedColumn: id
25
41
  },
26
42
  inverseJoinColumn: {
27
- name: "component_id",
28
- referencedColumn: "id"
43
+ name: joinColumnInverseName,
44
+ referencedColumn: id
29
45
  },
30
46
  on: {
31
47
  field: name
32
48
  },
33
- orderColumnName: "order",
49
+ orderColumnName: order,
34
50
  orderBy: {
35
51
  order: "asc"
36
52
  },
37
- pivotColumns: ["entity_id", "component_id", "field", "component_type"]
53
+ pivotColumns: [joinColumnEntityName, joinColumnInverseName, field, COMPONENT_TYPE_COLUMN]
38
54
  }
39
55
  };
40
56
  }
41
57
  case "dynamiczone": {
58
+ const joinTableName = getDzJoinTableName(contentType.collectionName);
59
+ const joinColumnEntityName = identifiers.getJoinColumnAttributeIdName(ENTITY);
60
+ const joinColumnInverseName = identifiers.getJoinColumnAttributeIdName(
61
+ COMPONENT_INVERSE_COLUMN_NAME
62
+ );
42
63
  return {
43
64
  type: "relation",
44
65
  relation: "morphToMany",
45
66
  // TODO: handle restrictions at some point
46
67
  // target: attribute.components,
47
68
  joinTable: {
48
- name: `${contentType.collectionName}_components`,
69
+ name: joinTableName,
49
70
  joinColumn: {
50
- name: "entity_id",
51
- referencedColumn: "id"
71
+ name: joinColumnEntityName,
72
+ referencedColumn: id
52
73
  },
53
74
  morphColumn: {
54
75
  idColumn: {
55
- name: "component_id",
56
- referencedColumn: "id"
76
+ name: joinColumnInverseName,
77
+ referencedColumn: id
57
78
  },
58
79
  typeColumn: {
59
- name: "component_type"
80
+ name: COMPONENT_TYPE_COLUMN
60
81
  },
61
82
  typeField: "__component"
62
83
  },
@@ -66,7 +87,7 @@ const transformAttribute = (name, attribute, contentType) => {
66
87
  orderBy: {
67
88
  order: "asc"
68
89
  },
69
- pivotColumns: ["entity_id", "component_id", "field", "component_type"]
90
+ pivotColumns: [joinColumnEntityName, joinColumnInverseName, field, COMPONENT_TYPE_COLUMN]
70
91
  }
71
92
  };
72
93
  }
@@ -84,41 +105,44 @@ const transformAttributes = (contentType) => {
84
105
  }, {});
85
106
  };
86
107
  const hasComponentsOrDz = (contentType) => {
87
- return Object.values(contentType.attributes).some(
108
+ return Object.values(contentType.attributes || {}).some(
88
109
  ({ type }) => type === "dynamiczone" || type === "component"
89
110
  );
90
111
  };
91
112
  const createDocumentId = createId;
92
113
  const createCompoLinkModel = (contentType) => {
93
- const name = `${contentType.collectionName}_components`;
114
+ const name = getComponentJoinTableName(contentType.collectionName);
115
+ const entityId = identifiers.getJoinColumnAttributeIdName(ENTITY);
116
+ const componentId = identifiers.getJoinColumnAttributeIdName(COMPONENT_INVERSE_COLUMN_NAME);
117
+ const fkIndex = identifiers.getFkIndexName([contentType.collectionName, ENTITY]);
94
118
  return {
95
119
  // TODO: make sure there can't be any conflicts with a prefix
96
120
  singularName: name,
97
121
  uid: name,
98
122
  tableName: name,
99
123
  attributes: {
100
- id: {
124
+ [id]: {
101
125
  type: "increments"
102
126
  },
103
- entity_id: {
127
+ [entityId]: {
104
128
  type: "integer",
105
129
  column: {
106
130
  unsigned: true
107
131
  }
108
132
  },
109
- component_id: {
133
+ [componentId]: {
110
134
  type: "integer",
111
135
  column: {
112
136
  unsigned: true
113
137
  }
114
138
  },
115
- component_type: {
139
+ [COMPONENT_TYPE_COLUMN]: {
116
140
  type: "string"
117
141
  },
118
- field: {
142
+ [field]: {
119
143
  type: "string"
120
144
  },
121
- order: {
145
+ [order]: {
122
146
  type: "float",
123
147
  column: {
124
148
  unsigned: true,
@@ -128,29 +152,30 @@ const createCompoLinkModel = (contentType) => {
128
152
  },
129
153
  indexes: [
130
154
  {
131
- name: `${contentType.collectionName}_field_index`,
132
- columns: ["field"]
155
+ name: identifiers.getIndexName([contentType.collectionName, field]),
156
+ columns: [field]
133
157
  },
134
158
  {
135
- name: `${contentType.collectionName}_component_type_index`,
136
- columns: ["component_type"]
159
+ name: identifiers.getIndexName([contentType.collectionName, COMPONENT_TYPE_COLUMN]),
160
+ columns: [COMPONENT_TYPE_COLUMN]
137
161
  },
138
162
  {
139
- name: `${contentType.collectionName}_entity_fk`,
140
- columns: ["entity_id"]
163
+ name: fkIndex,
164
+ columns: [entityId]
141
165
  },
142
166
  {
143
- name: `${contentType.collectionName}_unique`,
144
- columns: ["entity_id", "component_id", "field", "component_type"],
167
+ // NOTE: since we don't include attribute names, we need to be careful not to create another unique index
168
+ name: identifiers.getUniqueIndexName([contentType.collectionName]),
169
+ columns: [entityId, componentId, field, COMPONENT_TYPE_COLUMN],
145
170
  type: "unique"
146
171
  }
147
172
  ],
148
173
  foreignKeys: [
149
174
  {
150
- name: `${contentType.collectionName}_entity_fk`,
151
- columns: ["entity_id"],
152
- referencedColumns: ["id"],
153
- referencedTable: contentType.collectionName,
175
+ name: fkIndex,
176
+ columns: [entityId],
177
+ referencedColumns: [id],
178
+ referencedTable: identifiers.getTableName(contentType.collectionName),
154
179
  onDelete: "CASCADE"
155
180
  }
156
181
  ]
@@ -159,12 +184,16 @@ const createCompoLinkModel = (contentType) => {
159
184
  const transformContentTypesToModels = (contentTypes) => {
160
185
  const models = [];
161
186
  contentTypes.forEach((contentType) => {
187
+ assert(contentType.collectionName, 'Content type "collectionName" is required');
188
+ assert(contentType.modelName, 'Content type "modelName" is required');
189
+ assert(contentType.uid, 'Content type "uid" is required');
162
190
  const documentIdAttribute = contentType.modelType === "contentType" ? { documentId: { type: "string", default: createDocumentId } } : {};
163
- const reservedAttributeNames = ["documentId", "document_id", "id"];
164
- reservedAttributeNames.forEach((reservedAttributeName) => {
165
- if (reservedAttributeName in contentType.attributes) {
191
+ const reservedAttributeNames = ["document_id", id];
192
+ Object.keys(contentType.attributes || {}).forEach((attributeName) => {
193
+ const snakeCasedAttributeName = _.snakeCase(attributeName);
194
+ if (reservedAttributeNames.includes(snakeCasedAttributeName)) {
166
195
  throw new Error(
167
- `The attribute "${reservedAttributeName}" is reserved and cannot be used in a modelPlease rename "${contentType.modelName}" attribute "${reservedAttributeName}" to something else.`
196
+ `The attribute "${attributeName}" is reserved and cannot be used in a model. Please rename "${contentType.modelName}" attribute "${attributeName}" to something else.`
168
197
  );
169
198
  }
170
199
  });
@@ -172,13 +201,12 @@ const transformContentTypesToModels = (contentTypes) => {
172
201
  const compoLinkModel = createCompoLinkModel(contentType);
173
202
  models.push(compoLinkModel);
174
203
  }
175
- assert(contentType.collectionName, "Collection name is required");
176
204
  const model = {
177
205
  uid: contentType.uid,
178
206
  singularName: contentType.modelName,
179
- tableName: contentType.collectionName,
207
+ tableName: identifiers.getTableName(contentType.collectionName),
180
208
  attributes: {
181
- id: {
209
+ [id]: {
182
210
  type: "increments"
183
211
  },
184
212
  ...documentIdAttribute,
@@ -190,7 +218,17 @@ const transformContentTypesToModels = (contentTypes) => {
190
218
  return models;
191
219
  };
192
220
  export {
221
+ COMPONENT_INVERSE_COLUMN_NAME,
222
+ COMPONENT_JOIN_TABLE_SUFFIX,
223
+ COMPONENT_TYPE_COLUMN,
224
+ DZ_JOIN_TABLE_SUFFIX,
225
+ ENTITY,
193
226
  createDocumentId,
227
+ getComponentJoinTableName,
228
+ getDzJoinTableName,
229
+ hasComponentsOrDz,
230
+ transformAttribute,
231
+ transformAttributes,
194
232
  transformContentTypesToModels
195
233
  };
196
234
  //# sourceMappingURL=transform-content-types-to-models.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"transform-content-types-to-models.mjs","sources":["../../src/utils/transform-content-types-to-models.ts"],"sourcesContent":["import { Model } from '@strapi/database';\nimport { Schema, Attribute } from '@strapi/types';\nimport { createId } from '@paralleldrive/cuid2';\nimport assert from 'node:assert';\n\nconst transformAttribute = (\n name: string,\n attribute: Attribute.Any,\n contentType: Schema.ContentType\n) => {\n switch (attribute.type) {\n case 'media': {\n return {\n type: 'relation',\n relation: attribute.multiple === true ? 'morphMany' : 'morphOne',\n target: 'plugin::upload.file',\n morphBy: 'related',\n };\n }\n case 'component': {\n return {\n type: 'relation',\n relation: attribute.repeatable === true ? 'oneToMany' : 'oneToOne',\n target: attribute.component,\n\n // We need the join table name to be deterministic,\n // We need to allow passing the join table name as an option\n joinTable: {\n name: `${contentType.collectionName}_components`,\n joinColumn: {\n name: 'entity_id',\n referencedColumn: 'id',\n },\n inverseJoinColumn: {\n name: 'component_id',\n referencedColumn: 'id',\n },\n on: {\n field: name,\n },\n orderColumnName: 'order',\n orderBy: {\n order: 'asc',\n },\n pivotColumns: ['entity_id', 'component_id', 'field', 'component_type'],\n },\n };\n }\n case 'dynamiczone': {\n return {\n type: 'relation',\n relation: 'morphToMany',\n // TODO: handle restrictions at some point\n // target: attribute.components,\n joinTable: {\n name: `${contentType.collectionName}_components`,\n joinColumn: {\n name: 'entity_id',\n referencedColumn: 'id',\n },\n morphColumn: {\n idColumn: {\n name: 'component_id',\n referencedColumn: 'id',\n },\n typeColumn: {\n name: 'component_type',\n },\n typeField: '__component',\n },\n on: {\n field: name,\n },\n orderBy: {\n order: 'asc',\n },\n pivotColumns: ['entity_id', 'component_id', 'field', 'component_type'],\n },\n };\n }\n default: {\n return attribute;\n }\n }\n};\n\nconst transformAttributes = (contentType: Schema.ContentType) => {\n return Object.keys(contentType.attributes! || {}).reduce((attrs, attrName) => {\n return {\n ...attrs,\n [attrName]: transformAttribute(attrName, contentType.attributes[attrName]!, contentType),\n };\n }, {});\n};\n\nconst hasComponentsOrDz = (contentType: Schema.ContentType) => {\n return Object.values(contentType.attributes).some(\n ({ type }) => type === 'dynamiczone' || type === 'component'\n );\n};\n\nexport const createDocumentId = createId;\n\nconst createCompoLinkModel = (contentType: Schema.ContentType): Model => {\n const name = `${contentType.collectionName}_components`;\n\n return {\n // TODO: make sure there can't be any conflicts with a prefix\n singularName: name,\n uid: name,\n tableName: name,\n attributes: {\n id: {\n type: 'increments',\n },\n entity_id: {\n type: 'integer',\n column: {\n unsigned: true,\n },\n },\n component_id: {\n type: 'integer',\n column: {\n unsigned: true,\n },\n },\n component_type: {\n type: 'string',\n },\n field: {\n type: 'string',\n },\n order: {\n type: 'float',\n column: {\n unsigned: true,\n defaultTo: null,\n },\n },\n },\n indexes: [\n {\n name: `${contentType.collectionName}_field_index`,\n columns: ['field'],\n },\n {\n name: `${contentType.collectionName}_component_type_index`,\n columns: ['component_type'],\n },\n {\n name: `${contentType.collectionName}_entity_fk`,\n columns: ['entity_id'],\n },\n {\n name: `${contentType.collectionName}_unique`,\n columns: ['entity_id', 'component_id', 'field', 'component_type'],\n type: 'unique',\n },\n ],\n foreignKeys: [\n {\n name: `${contentType.collectionName}_entity_fk`,\n columns: ['entity_id'],\n referencedColumns: ['id'],\n referencedTable: contentType.collectionName!,\n onDelete: 'CASCADE',\n },\n ],\n };\n};\n\nexport const transformContentTypesToModels = (contentTypes: Schema.ContentType[]): Model[] => {\n const models: Model[] = [];\n\n contentTypes.forEach((contentType) => {\n // Add document id to content types\n // as it is not documented\n const documentIdAttribute: Record<string, Attribute.Any> =\n contentType.modelType === 'contentType'\n ? { documentId: { type: 'string', default: createDocumentId } }\n : {};\n\n // Prevent user from creating a documentId attribute\n const reservedAttributeNames = ['documentId', 'document_id', 'id'];\n reservedAttributeNames.forEach((reservedAttributeName) => {\n if (reservedAttributeName in contentType.attributes) {\n throw new Error(\n `The attribute \"${reservedAttributeName}\" is reserved and cannot be used in a model` +\n `Please rename \"${contentType.modelName}\" attribute \"${reservedAttributeName}\" to something else.`\n );\n }\n });\n\n if (hasComponentsOrDz(contentType)) {\n const compoLinkModel = createCompoLinkModel(contentType);\n models.push(compoLinkModel);\n }\n\n assert(contentType.collectionName, 'Collection name is required');\n\n const model: Model = {\n uid: contentType.uid,\n singularName: contentType.modelName,\n tableName: contentType.collectionName,\n attributes: {\n id: {\n type: 'increments',\n },\n ...documentIdAttribute,\n ...transformAttributes(contentType),\n },\n };\n\n models.push(model);\n });\n\n return models;\n};\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"transform-content-types-to-models.mjs","sources":["../../src/utils/transform-content-types-to-models.ts"],"sourcesContent":["import { type Model, utils } from '@strapi/database';\nimport { Schema, Attribute } from '@strapi/types';\nimport { createId } from '@paralleldrive/cuid2';\nimport assert from 'node:assert';\nimport _ from 'lodash/fp';\n\nconst { identifiers } = utils;\n\n/**\n * Because strapi/database models don't know about things like components or dynamic zones, we use this file to convert them\n * to a relations format that it recognizes\n *\n * Therefore we have to keep an additional set of helpers/extensions to the database naming methods\n */\n\nexport const COMPONENT_JOIN_TABLE_SUFFIX = 'components';\nexport const DZ_JOIN_TABLE_SUFFIX = 'components';\nexport const COMPONENT_INVERSE_COLUMN_NAME = 'component';\nexport const COMPONENT_TYPE_COLUMN = 'component_type';\nexport const ENTITY = 'entity';\n\nexport const getComponentJoinTableName = (collectionName: string) =>\n identifiers.getTableName(collectionName, { suffix: COMPONENT_JOIN_TABLE_SUFFIX });\n\nexport const getDzJoinTableName = (collectionName: string) =>\n identifiers.getTableName(collectionName, { suffix: DZ_JOIN_TABLE_SUFFIX });\n\nconst { ID_COLUMN: id, FIELD_COLUMN: field, ORDER_COLUMN: order } = identifiers;\n\nexport type LoadedContentTypeModel = Schema.ContentType &\n Required<Pick<Schema.ContentType, 'collectionName' | 'uid' | 'modelName'>>;\n\n// Transforms an attribute (particularly for relation types) into the format that strapi/database accepts\nexport const transformAttribute = (\n name: string,\n attribute: Attribute.Any,\n contentType: LoadedContentTypeModel\n) => {\n switch (attribute.type) {\n case 'media': {\n return {\n type: 'relation',\n relation: attribute.multiple === true ? 'morphMany' : 'morphOne',\n target: 'plugin::upload.file',\n morphBy: 'related',\n };\n }\n case 'component': {\n const joinTableName = getComponentJoinTableName(contentType.collectionName);\n const joinColumnEntityName = identifiers.getJoinColumnAttributeIdName(ENTITY);\n const joinColumnInverseName = identifiers.getJoinColumnAttributeIdName(\n COMPONENT_INVERSE_COLUMN_NAME\n );\n\n return {\n type: 'relation',\n relation: attribute.repeatable === true ? 'oneToMany' : 'oneToOne',\n target: attribute.component,\n\n // We need the join table name to be deterministic,\n // We need to allow passing the join table name as an option\n joinTable: {\n name: joinTableName,\n joinColumn: {\n name: joinColumnEntityName,\n referencedColumn: id,\n },\n inverseJoinColumn: {\n name: joinColumnInverseName,\n referencedColumn: id,\n },\n on: {\n field: name,\n },\n orderColumnName: order,\n orderBy: {\n order: 'asc',\n },\n pivotColumns: [joinColumnEntityName, joinColumnInverseName, field, COMPONENT_TYPE_COLUMN],\n },\n };\n }\n case 'dynamiczone': {\n const joinTableName = getDzJoinTableName(contentType.collectionName);\n const joinColumnEntityName = identifiers.getJoinColumnAttributeIdName(ENTITY);\n const joinColumnInverseName = identifiers.getJoinColumnAttributeIdName(\n COMPONENT_INVERSE_COLUMN_NAME\n );\n\n return {\n type: 'relation',\n relation: 'morphToMany',\n // TODO: handle restrictions at some point\n // target: attribute.components,\n joinTable: {\n name: joinTableName,\n joinColumn: {\n name: joinColumnEntityName,\n referencedColumn: id,\n },\n morphColumn: {\n idColumn: {\n name: joinColumnInverseName,\n referencedColumn: id,\n },\n typeColumn: {\n name: COMPONENT_TYPE_COLUMN,\n },\n typeField: '__component',\n },\n on: {\n field: name,\n },\n orderBy: {\n order: 'asc',\n },\n pivotColumns: [joinColumnEntityName, joinColumnInverseName, field, COMPONENT_TYPE_COLUMN],\n },\n };\n }\n default: {\n return attribute;\n }\n }\n};\n\nexport const transformAttributes = (contentType: LoadedContentTypeModel) => {\n return Object.keys(contentType.attributes! || {}).reduce((attrs, attrName) => {\n return {\n ...attrs,\n [attrName]: transformAttribute(attrName, contentType.attributes[attrName]!, contentType),\n };\n }, {});\n};\n\nexport const hasComponentsOrDz = (\n contentType: LoadedContentTypeModel\n): contentType is LoadedContentTypeModel & { type: 'dynamiczone' | 'component' } => {\n return Object.values(contentType.attributes || {}).some(\n ({ type }) => type === 'dynamiczone' || type === 'component'\n );\n};\n\nexport const createDocumentId = createId;\n\n// Creates the\nconst createCompoLinkModel = (contentType: LoadedContentTypeModel): Model => {\n const name = getComponentJoinTableName(contentType.collectionName);\n\n const entityId = identifiers.getJoinColumnAttributeIdName(ENTITY);\n const componentId = identifiers.getJoinColumnAttributeIdName(COMPONENT_INVERSE_COLUMN_NAME);\n const fkIndex = identifiers.getFkIndexName([contentType.collectionName, ENTITY]);\n\n return {\n // TODO: make sure there can't be any conflicts with a prefix\n singularName: name,\n uid: name,\n tableName: name,\n attributes: {\n [id]: {\n type: 'increments',\n },\n [entityId]: {\n type: 'integer',\n column: {\n unsigned: true,\n },\n },\n [componentId]: {\n type: 'integer',\n column: {\n unsigned: true,\n },\n },\n [COMPONENT_TYPE_COLUMN]: {\n type: 'string',\n },\n [field]: {\n type: 'string',\n },\n [order]: {\n type: 'float',\n column: {\n unsigned: true,\n defaultTo: null,\n },\n },\n },\n indexes: [\n {\n name: identifiers.getIndexName([contentType.collectionName, field]),\n columns: [field],\n },\n {\n name: identifiers.getIndexName([contentType.collectionName, COMPONENT_TYPE_COLUMN]),\n columns: [COMPONENT_TYPE_COLUMN],\n },\n {\n name: fkIndex,\n columns: [entityId],\n },\n {\n // NOTE: since we don't include attribute names, we need to be careful not to create another unique index\n name: identifiers.getUniqueIndexName([contentType.collectionName]),\n columns: [entityId, componentId, field, COMPONENT_TYPE_COLUMN],\n type: 'unique',\n },\n ],\n foreignKeys: [\n {\n name: fkIndex,\n columns: [entityId],\n referencedColumns: [id],\n referencedTable: identifiers.getTableName(contentType.collectionName),\n onDelete: 'CASCADE',\n },\n ],\n };\n};\n\nexport const transformContentTypesToModels = (contentTypes: LoadedContentTypeModel[]): Model[] => {\n const models: Model[] = [];\n\n contentTypes.forEach((contentType) => {\n assert(contentType.collectionName, 'Content type \"collectionName\" is required');\n assert(contentType.modelName, 'Content type \"modelName\" is required');\n assert(contentType.uid, 'Content type \"uid\" is required');\n\n // Add document id to content types\n // as it is not documented\n const documentIdAttribute: Record<string, Attribute.Any> =\n contentType.modelType === 'contentType'\n ? { documentId: { type: 'string', default: createDocumentId } }\n : {};\n\n // TODO: this needs to be combined with getReservedNames, we should not be maintaining two lists\n // Prevent user from creating a documentId attribute\n const reservedAttributeNames = ['document_id', id];\n Object.keys(contentType.attributes || {}).forEach((attributeName) => {\n const snakeCasedAttributeName = _.snakeCase(attributeName);\n if (reservedAttributeNames.includes(snakeCasedAttributeName)) {\n throw new Error(\n `The attribute \"${attributeName}\" is reserved and cannot be used in a model. Please rename \"${contentType.modelName}\" attribute \"${attributeName}\" to something else.`\n );\n }\n });\n\n if (hasComponentsOrDz(contentType)) {\n const compoLinkModel = createCompoLinkModel(contentType);\n models.push(compoLinkModel);\n }\n\n const model: Model = {\n uid: contentType.uid,\n singularName: contentType.modelName,\n tableName: identifiers.getTableName(contentType.collectionName),\n attributes: {\n [id]: {\n type: 'increments',\n },\n ...documentIdAttribute,\n ...transformAttributes(contentType),\n },\n };\n\n models.push(model);\n });\n\n return models;\n};\n"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@strapi/core",
3
- "version": "0.0.0-experimental.22e8a4f31c0b65da00cc6c524a94de53fabc7a28",
3
+ "version": "0.0.0-experimental.2363945b79274c79e6505e5a6c3cdec876ed8cec",
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.22e8a4f31c0b65da00cc6c524a94de53fabc7a28",
59
- "@strapi/database": "0.0.0-experimental.22e8a4f31c0b65da00cc6c524a94de53fabc7a28",
60
- "@strapi/generate-new": "0.0.0-experimental.22e8a4f31c0b65da00cc6c524a94de53fabc7a28",
61
- "@strapi/generators": "0.0.0-experimental.22e8a4f31c0b65da00cc6c524a94de53fabc7a28",
62
- "@strapi/logger": "0.0.0-experimental.22e8a4f31c0b65da00cc6c524a94de53fabc7a28",
63
- "@strapi/pack-up": "0.0.0-experimental.22e8a4f31c0b65da00cc6c524a94de53fabc7a28",
64
- "@strapi/permissions": "0.0.0-experimental.22e8a4f31c0b65da00cc6c524a94de53fabc7a28",
65
- "@strapi/types": "0.0.0-experimental.22e8a4f31c0b65da00cc6c524a94de53fabc7a28",
66
- "@strapi/typescript-utils": "0.0.0-experimental.22e8a4f31c0b65da00cc6c524a94de53fabc7a28",
67
- "@strapi/utils": "0.0.0-experimental.22e8a4f31c0b65da00cc6c524a94de53fabc7a28",
58
+ "@strapi/admin": "0.0.0-experimental.2363945b79274c79e6505e5a6c3cdec876ed8cec",
59
+ "@strapi/database": "0.0.0-experimental.2363945b79274c79e6505e5a6c3cdec876ed8cec",
60
+ "@strapi/generate-new": "0.0.0-experimental.2363945b79274c79e6505e5a6c3cdec876ed8cec",
61
+ "@strapi/generators": "0.0.0-experimental.2363945b79274c79e6505e5a6c3cdec876ed8cec",
62
+ "@strapi/logger": "0.0.0-experimental.2363945b79274c79e6505e5a6c3cdec876ed8cec",
63
+ "@strapi/pack-up": "0.0.0-experimental.2363945b79274c79e6505e5a6c3cdec876ed8cec",
64
+ "@strapi/permissions": "0.0.0-experimental.2363945b79274c79e6505e5a6c3cdec876ed8cec",
65
+ "@strapi/types": "0.0.0-experimental.2363945b79274c79e6505e5a6c3cdec876ed8cec",
66
+ "@strapi/typescript-utils": "0.0.0-experimental.2363945b79274c79e6505e5a6c3cdec876ed8cec",
67
+ "@strapi/utils": "0.0.0-experimental.2363945b79274c79e6505e5a6c3cdec876ed8cec",
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.22e8a4f31c0b65da00cc6c524a94de53fabc7a28",
125
+ "eslint-config-custom": "0.0.0-experimental.2363945b79274c79e6505e5a6c3cdec876ed8cec",
126
126
  "supertest": "6.3.3",
127
- "tsconfig": "0.0.0-experimental.22e8a4f31c0b65da00cc6c524a94de53fabc7a28"
127
+ "tsconfig": "0.0.0-experimental.2363945b79274c79e6505e5a6c3cdec876ed8cec"
128
128
  },
129
129
  "engines": {
130
130
  "node": ">=18.0.0 <=20.x.x",
131
131
  "npm": ">=6.0.0"
132
132
  },
133
- "gitHead": "22e8a4f31c0b65da00cc6c524a94de53fabc7a28"
133
+ "gitHead": "2363945b79274c79e6505e5a6c3cdec876ed8cec"
134
134
  }
@@ -1,4 +0,0 @@
1
- import type { Schema } from '@strapi/types';
2
- import { type RepositoryFactoryMethod } from './common';
3
- export declare const createCollectionTypeRepository: RepositoryFactoryMethod<Schema.CollectionType>;
4
- //# sourceMappingURL=collection-type.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"collection-type.d.ts","sourceRoot":"","sources":["../../../src/services/document-service/collection-type.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAG5C,OAAO,EAAqB,KAAK,uBAAuB,EAAE,MAAM,UAAU,CAAC;AAK3E,eAAO,MAAM,8BAA8B,EAAE,uBAAuB,CAAC,MAAM,CAAC,cAAc,CAwLzF,CAAC"}
@@ -1,158 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
- const _ = require("lodash/fp");
4
- const strapiUtils = require("@strapi/utils");
5
- const common = require("./common.js");
6
- const documentEngine = require("./document-engine.js");
7
- const draftAndPublish = require("./draft-and-publish.js");
8
- const internationalization = require("./internationalization.js");
9
- const createCollectionTypeRepository = (contentType) => {
10
- const { uid } = contentType;
11
- const documents = documentEngine({ strapi, db: strapi?.db });
12
- async function findMany(params = {}) {
13
- const queryParams = await strapiUtils.pipeAsync(
14
- draftAndPublish.defaultToDraft,
15
- draftAndPublish.statusToLookup,
16
- internationalization.defaultLocale(contentType),
17
- internationalization.localeToLookup(contentType)
18
- )(params);
19
- return documents.findMany(uid, queryParams);
20
- }
21
- async function findFirst(params = {}) {
22
- const queryParams = await strapiUtils.pipeAsync(
23
- draftAndPublish.defaultToDraft,
24
- draftAndPublish.statusToLookup,
25
- internationalization.defaultLocale(contentType),
26
- internationalization.localeToLookup(contentType)
27
- )(params);
28
- return documents.findFirst(uid, queryParams);
29
- }
30
- async function findOne(id, params = {}) {
31
- const queryParams = await strapiUtils.pipeAsync(
32
- draftAndPublish.defaultToDraft,
33
- draftAndPublish.statusToLookup,
34
- internationalization.defaultLocale(contentType),
35
- internationalization.localeToLookup(contentType)
36
- )(params);
37
- return documents.findOne(uid, id, queryParams);
38
- }
39
- async function deleteFn(id, params = {}) {
40
- const queryParams = await strapiUtils.pipeAsync(
41
- _.omit("status"),
42
- internationalization.defaultLocale(contentType),
43
- internationalization.multiLocaleToLookup(contentType)
44
- )(params);
45
- return documents.delete(uid, id, queryParams);
46
- }
47
- async function create(params = {}) {
48
- const queryParams = await strapiUtils.pipeAsync(
49
- draftAndPublish.setStatusToDraft,
50
- draftAndPublish.statusToData,
51
- draftAndPublish.filterDataPublishedAt,
52
- internationalization.defaultLocale(contentType),
53
- internationalization.localeToData(contentType)
54
- )(params);
55
- const doc = await documents.create(uid, queryParams);
56
- if (params.status === "published") {
57
- return documents.create(uid, {
58
- ...queryParams,
59
- data: {
60
- ...queryParams.data,
61
- documentId: doc.id,
62
- publishedAt: params?.data?.publishedAt ?? /* @__PURE__ */ new Date()
63
- }
64
- });
65
- }
66
- return doc;
67
- }
68
- async function clone(id, params = {}) {
69
- const queryParams = await strapiUtils.pipeAsync(
70
- draftAndPublish.filterDataPublishedAt,
71
- internationalization.localeToLookup(contentType)
72
- )(params);
73
- return documents.clone(uid, id, queryParams);
74
- }
75
- async function update(id, params = {}) {
76
- const queryParams = await strapiUtils.pipeAsync(
77
- draftAndPublish.setStatusToDraft,
78
- draftAndPublish.statusToLookup,
79
- draftAndPublish.statusToData,
80
- draftAndPublish.filterDataPublishedAt,
81
- // Default locale will be set if not provided
82
- internationalization.defaultLocale(contentType),
83
- internationalization.localeToLookup(contentType),
84
- internationalization.localeToData(contentType)
85
- )(params);
86
- let updatedDraft = await documents.update(uid, id, queryParams);
87
- if (!updatedDraft) {
88
- const documentExists = await strapi.db.query(contentType.uid).findOne({ where: { documentId: id } });
89
- if (documentExists) {
90
- updatedDraft = await create({
91
- ...queryParams,
92
- data: { ...queryParams.data, documentId: id }
93
- });
94
- }
95
- }
96
- if (updatedDraft && params.status === "published") {
97
- await documents.delete(uid, id, {
98
- ...queryParams,
99
- status: "published",
100
- lookup: { ...params?.lookup, publishedAt: { $notNull: true } }
101
- });
102
- return documents.create(uid, {
103
- ...queryParams,
104
- data: {
105
- ...queryParams.data,
106
- documentId: updatedDraft.id,
107
- publishedAt: params?.data?.publishedAt ?? /* @__PURE__ */ new Date()
108
- }
109
- });
110
- }
111
- return updatedDraft;
112
- }
113
- async function count(params = {}) {
114
- const queryParams = await strapiUtils.pipeAsync(
115
- draftAndPublish.defaultToDraft,
116
- draftAndPublish.statusToLookup,
117
- internationalization.defaultLocale(contentType),
118
- internationalization.localeToLookup(contentType)
119
- )(params);
120
- return documents.count(uid, queryParams);
121
- }
122
- async function publish(id, params = {}) {
123
- const queryParams = await strapiUtils.pipeAsync(
124
- internationalization.defaultLocale(contentType),
125
- internationalization.multiLocaleToLookup(contentType)
126
- )(params);
127
- return documents.publish(uid, id, queryParams);
128
- }
129
- async function unpublish(id, params = {}) {
130
- const queryParams = await strapiUtils.pipeAsync(
131
- internationalization.defaultLocale(contentType),
132
- internationalization.multiLocaleToLookup(contentType)
133
- )(params);
134
- return documents.unpublish(uid, id, queryParams);
135
- }
136
- async function discardDraft(id, params = {}) {
137
- const queryParams = await strapiUtils.pipeAsync(
138
- internationalization.defaultLocale(contentType),
139
- internationalization.multiLocaleToLookup(contentType)
140
- )(params);
141
- return documents.discardDraft(uid, id, queryParams);
142
- }
143
- return {
144
- findMany: common.wrapInTransaction(findMany),
145
- findFirst: common.wrapInTransaction(findFirst),
146
- findOne: common.wrapInTransaction(findOne),
147
- delete: common.wrapInTransaction(deleteFn),
148
- create: common.wrapInTransaction(create),
149
- clone: common.wrapInTransaction(clone),
150
- update: common.wrapInTransaction(update),
151
- count: common.wrapInTransaction(count),
152
- publish: common.wrapInTransaction(publish),
153
- unpublish: common.wrapInTransaction(unpublish),
154
- discardDraft: common.wrapInTransaction(discardDraft)
155
- };
156
- };
157
- exports.createCollectionTypeRepository = createCollectionTypeRepository;
158
- //# sourceMappingURL=collection-type.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"collection-type.js","sources":["../../../src/services/document-service/collection-type.ts"],"sourcesContent":["import { omit } from 'lodash/fp';\n\nimport type { Schema } from '@strapi/types';\nimport { pipeAsync } from '@strapi/utils';\n\nimport { wrapInTransaction, type RepositoryFactoryMethod } from './common';\nimport createDocumentEngine from './document-engine';\nimport * as DP from './draft-and-publish';\nimport * as i18n from './internationalization';\n\nexport const createCollectionTypeRepository: RepositoryFactoryMethod<Schema.CollectionType> = (\n contentType\n) => {\n const { uid } = contentType;\n\n // TODO: move the code back into here instead of using the document-engine\n const documents = createDocumentEngine({ strapi, db: strapi?.db });\n\n async function findMany(params = {} as any) {\n // TODO: replace with chaining\n const queryParams = await pipeAsync(\n DP.defaultToDraft,\n DP.statusToLookup,\n i18n.defaultLocale(contentType),\n i18n.localeToLookup(contentType)\n )(params);\n\n return documents.findMany(uid, queryParams);\n }\n\n async function findFirst(params = {} as any) {\n const queryParams = await pipeAsync(\n DP.defaultToDraft,\n DP.statusToLookup,\n i18n.defaultLocale(contentType),\n i18n.localeToLookup(contentType)\n )(params);\n\n return documents.findFirst(uid, queryParams);\n }\n\n async function findOne(id: string, params = {} as any) {\n const queryParams = await pipeAsync(\n DP.defaultToDraft,\n DP.statusToLookup,\n i18n.defaultLocale(contentType),\n i18n.localeToLookup(contentType)\n )(params);\n\n return documents.findOne(uid, id, queryParams);\n }\n\n async function deleteFn(id: string, params = {} as any) {\n const queryParams = await pipeAsync(\n omit('status'),\n i18n.defaultLocale(contentType),\n i18n.multiLocaleToLookup(contentType)\n )(params);\n\n return documents.delete(uid, id, queryParams);\n }\n\n async function create(params = {} as any) {\n const queryParams = await pipeAsync(\n DP.setStatusToDraft,\n DP.statusToData,\n DP.filterDataPublishedAt,\n i18n.defaultLocale(contentType),\n i18n.localeToData(contentType)\n )(params);\n\n const doc = await documents.create(uid, queryParams);\n\n if (params.status === 'published') {\n return documents.create(uid, {\n ...queryParams,\n data: {\n ...queryParams.data,\n documentId: doc.id,\n publishedAt: params?.data?.publishedAt ?? new Date(),\n },\n });\n }\n\n return doc;\n }\n\n async function clone(id: string, params = {} as any) {\n const queryParams = await pipeAsync(\n DP.filterDataPublishedAt,\n i18n.localeToLookup(contentType)\n )(params);\n\n return documents.clone(uid, id, queryParams);\n }\n\n async function update(id: string, params = {} as any) {\n const queryParams = await pipeAsync(\n DP.setStatusToDraft,\n DP.statusToLookup,\n DP.statusToData,\n DP.filterDataPublishedAt,\n // Default locale will be set if not provided\n i18n.defaultLocale(contentType),\n i18n.localeToLookup(contentType),\n i18n.localeToData(contentType)\n )(params);\n\n let updatedDraft = await documents.update(uid, id, queryParams);\n\n if (!updatedDraft) {\n const documentExists = await strapi.db\n .query(contentType.uid)\n .findOne({ where: { documentId: id } });\n\n if (documentExists) {\n updatedDraft = await create({\n ...queryParams,\n data: { ...queryParams.data, documentId: id },\n });\n }\n }\n\n if (updatedDraft && params.status === 'published') {\n await documents.delete(uid, id, {\n ...queryParams,\n status: 'published',\n lookup: { ...params?.lookup, publishedAt: { $notNull: true } },\n });\n\n return documents.create(uid, {\n ...queryParams,\n data: {\n ...queryParams.data,\n documentId: updatedDraft.id,\n publishedAt: params?.data?.publishedAt ?? new Date(),\n },\n });\n }\n\n return updatedDraft;\n }\n\n async function count(params = {} as any) {\n const queryParams = await pipeAsync(\n DP.defaultToDraft,\n DP.statusToLookup,\n i18n.defaultLocale(contentType),\n i18n.localeToLookup(contentType)\n )(params);\n\n return documents.count(uid, queryParams);\n }\n\n async function publish(id: string, params = {} as any) {\n const queryParams = await pipeAsync(\n i18n.defaultLocale(contentType),\n i18n.multiLocaleToLookup(contentType)\n )(params);\n\n return documents.publish(uid, id, queryParams);\n }\n\n async function unpublish(id: string, params = {} as any) {\n const queryParams = await pipeAsync(\n i18n.defaultLocale(contentType),\n i18n.multiLocaleToLookup(contentType)\n )(params);\n\n return documents.unpublish(uid, id, queryParams);\n }\n\n async function discardDraft(id: string, params = {} as any) {\n const queryParams = await pipeAsync(\n i18n.defaultLocale(contentType),\n i18n.multiLocaleToLookup(contentType)\n )(params);\n\n return documents.discardDraft(uid, id, queryParams);\n }\n\n return {\n findMany: wrapInTransaction(findMany),\n findFirst: wrapInTransaction(findFirst),\n findOne: wrapInTransaction(findOne),\n delete: wrapInTransaction(deleteFn),\n create: wrapInTransaction(create),\n clone: wrapInTransaction(clone),\n update: wrapInTransaction(update),\n count: wrapInTransaction(count),\n publish: wrapInTransaction(publish),\n unpublish: wrapInTransaction(unpublish),\n discardDraft: wrapInTransaction(discardDraft),\n };\n};\n"],"names":["createDocumentEngine","pipeAsync","DP.defaultToDraft","DP.statusToLookup","i18n.defaultLocale","i18n.localeToLookup","omit","i18n.multiLocaleToLookup","DP.setStatusToDraft","DP.statusToData","DP.filterDataPublishedAt","i18n.localeToData","wrapInTransaction"],"mappings":"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"}