@strapi/content-type-builder 5.56.0 → 5.58.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (178) hide show
  1. package/dist/admin/components/AIChat/lib/transforms/schemas/toCTB.js +117 -13
  2. package/dist/admin/components/AIChat/lib/transforms/schemas/toCTB.js.map +1 -1
  3. package/dist/admin/components/AIChat/lib/transforms/schemas/toCTB.mjs +118 -13
  4. package/dist/admin/components/AIChat/lib/transforms/schemas/toCTB.mjs.map +1 -1
  5. package/dist/admin/components/AIChat/providers/SchemaProvider.js +31 -19
  6. package/dist/admin/components/AIChat/providers/SchemaProvider.js.map +1 -1
  7. package/dist/admin/components/AIChat/providers/SchemaProvider.mjs +31 -19
  8. package/dist/admin/components/AIChat/providers/SchemaProvider.mjs.map +1 -1
  9. package/dist/admin/components/DataManager/DataManagerContext.js.map +1 -1
  10. package/dist/admin/components/DataManager/DataManagerContext.mjs.map +1 -1
  11. package/dist/admin/components/DataManager/DataManagerProvider.js +166 -6
  12. package/dist/admin/components/DataManager/DataManagerProvider.js.map +1 -1
  13. package/dist/admin/components/DataManager/DataManagerProvider.mjs +165 -7
  14. package/dist/admin/components/DataManager/DataManagerProvider.mjs.map +1 -1
  15. package/dist/admin/components/DataManager/RenameMigrationModal.js +285 -0
  16. package/dist/admin/components/DataManager/RenameMigrationModal.js.map +1 -0
  17. package/dist/admin/components/DataManager/RenameMigrationModal.mjs +257 -0
  18. package/dist/admin/components/DataManager/RenameMigrationModal.mjs.map +1 -0
  19. package/dist/admin/components/DataManager/reducer.js +129 -2
  20. package/dist/admin/components/DataManager/reducer.js.map +1 -1
  21. package/dist/admin/components/DataManager/reducer.mjs +128 -2
  22. package/dist/admin/components/DataManager/reducer.mjs.map +1 -1
  23. package/dist/admin/components/DataManager/utils/cleanData.js +8 -1
  24. package/dist/admin/components/DataManager/utils/cleanData.js.map +1 -1
  25. package/dist/admin/components/DataManager/utils/cleanData.mjs +8 -1
  26. package/dist/admin/components/DataManager/utils/cleanData.mjs.map +1 -1
  27. package/dist/admin/components/DataManager/utils/groupRenameChains.js +86 -0
  28. package/dist/admin/components/DataManager/utils/groupRenameChains.js.map +1 -0
  29. package/dist/admin/components/DataManager/utils/groupRenameChains.mjs +84 -0
  30. package/dist/admin/components/DataManager/utils/groupRenameChains.mjs.map +1 -0
  31. package/dist/admin/components/DataManager/utils/isStorageCompatibleRename.js +29 -0
  32. package/dist/admin/components/DataManager/utils/isStorageCompatibleRename.js.map +1 -0
  33. package/dist/admin/components/DataManager/utils/isStorageCompatibleRename.mjs +27 -0
  34. package/dist/admin/components/DataManager/utils/isStorageCompatibleRename.mjs.map +1 -0
  35. package/dist/admin/components/DataManager/utils/resolveAfterEditRenameConsent.js +35 -0
  36. package/dist/admin/components/DataManager/utils/resolveAfterEditRenameConsent.js.map +1 -0
  37. package/dist/admin/components/DataManager/utils/resolveAfterEditRenameConsent.mjs +33 -0
  38. package/dist/admin/components/DataManager/utils/resolveAfterEditRenameConsent.mjs.map +1 -0
  39. package/dist/admin/components/DataManager/utils/splitChainsByInheritedConsent.js +48 -0
  40. package/dist/admin/components/DataManager/utils/splitChainsByInheritedConsent.js.map +1 -0
  41. package/dist/admin/components/DataManager/utils/splitChainsByInheritedConsent.mjs +45 -0
  42. package/dist/admin/components/DataManager/utils/splitChainsByInheritedConsent.mjs.map +1 -0
  43. package/dist/admin/components/FormModal/FormModal.js +178 -70
  44. package/dist/admin/components/FormModal/FormModal.js.map +1 -1
  45. package/dist/admin/components/FormModal/FormModal.mjs +179 -71
  46. package/dist/admin/components/FormModal/FormModal.mjs.map +1 -1
  47. package/dist/admin/components/FormModal/attributes/validation/common.js +6 -5
  48. package/dist/admin/components/FormModal/attributes/validation/common.js.map +1 -1
  49. package/dist/admin/components/FormModal/attributes/validation/common.mjs +1 -1
  50. package/dist/admin/components/FormModal/attributes/validation/common.mjs.map +1 -1
  51. package/dist/admin/components/FormModal/component/createComponentSchema.js +10 -7
  52. package/dist/admin/components/FormModal/component/createComponentSchema.js.map +1 -1
  53. package/dist/admin/components/FormModal/component/createComponentSchema.mjs +1 -1
  54. package/dist/admin/components/FormModal/component/createComponentSchema.mjs.map +1 -1
  55. package/dist/admin/components/FormModal/contentType/createContentTypeSchema.js +24 -21
  56. package/dist/admin/components/FormModal/contentType/createContentTypeSchema.js.map +1 -1
  57. package/dist/admin/components/FormModal/contentType/createContentTypeSchema.mjs +1 -1
  58. package/dist/admin/components/FormModal/contentType/createContentTypeSchema.mjs.map +1 -1
  59. package/dist/admin/components/FormModal/forms/utils/createCollectionName.js +3 -2
  60. package/dist/admin/components/FormModal/forms/utils/createCollectionName.js.map +1 -1
  61. package/dist/admin/components/FormModal/forms/utils/createCollectionName.mjs +1 -1
  62. package/dist/admin/components/FormModal/forms/utils/createCollectionName.mjs.map +1 -1
  63. package/dist/admin/components/FormModal/utils/getRenameStorageChange.js +73 -0
  64. package/dist/admin/components/FormModal/utils/getRenameStorageChange.js.map +1 -0
  65. package/dist/admin/components/FormModal/utils/getRenameStorageChange.mjs +70 -0
  66. package/dist/admin/components/FormModal/utils/getRenameStorageChange.mjs.map +1 -0
  67. package/dist/admin/src/components/AIChat/lib/transforms/schemas/toCTB.d.ts +4 -3
  68. package/dist/admin/src/components/AIChat/lib/types/schema.d.ts +6 -1
  69. package/dist/admin/src/components/DataManager/DataManagerContext.d.ts +28 -2
  70. package/dist/admin/src/components/DataManager/RenameMigrationModal.d.ts +73 -0
  71. package/dist/admin/src/components/DataManager/reducer.d.ts +17 -2
  72. package/dist/admin/src/components/DataManager/utils/cleanData.d.ts +24 -8
  73. package/dist/admin/src/components/DataManager/utils/groupRenameChains.d.ts +31 -0
  74. package/dist/admin/src/components/DataManager/utils/isStorageCompatibleRename.d.ts +10 -0
  75. package/dist/admin/src/components/DataManager/utils/resolveAfterEditRenameConsent.d.ts +24 -0
  76. package/dist/admin/src/components/DataManager/utils/splitChainsByInheritedConsent.d.ts +26 -0
  77. package/dist/admin/src/components/FormModal/utils/getRenameStorageChange.d.ts +40 -0
  78. package/dist/admin/src/types.d.ts +23 -0
  79. package/dist/admin/translations/cs.json.js +0 -2
  80. package/dist/admin/translations/cs.json.js.map +1 -1
  81. package/dist/admin/translations/cs.json.mjs +0 -2
  82. package/dist/admin/translations/cs.json.mjs.map +1 -1
  83. package/dist/admin/translations/de.json.js +0 -2
  84. package/dist/admin/translations/de.json.js.map +1 -1
  85. package/dist/admin/translations/de.json.mjs +0 -2
  86. package/dist/admin/translations/de.json.mjs.map +1 -1
  87. package/dist/admin/translations/en.json.js +12 -2
  88. package/dist/admin/translations/en.json.js.map +1 -1
  89. package/dist/admin/translations/en.json.mjs +12 -2
  90. package/dist/admin/translations/en.json.mjs.map +1 -1
  91. package/dist/admin/translations/ja.json.js +0 -2
  92. package/dist/admin/translations/ja.json.js.map +1 -1
  93. package/dist/admin/translations/ja.json.mjs +0 -2
  94. package/dist/admin/translations/ja.json.mjs.map +1 -1
  95. package/dist/admin/translations/ko.json.js +0 -2
  96. package/dist/admin/translations/ko.json.js.map +1 -1
  97. package/dist/admin/translations/ko.json.mjs +0 -2
  98. package/dist/admin/translations/ko.json.mjs.map +1 -1
  99. package/dist/admin/translations/nl.json.js +0 -2
  100. package/dist/admin/translations/nl.json.js.map +1 -1
  101. package/dist/admin/translations/nl.json.mjs +0 -2
  102. package/dist/admin/translations/nl.json.mjs.map +1 -1
  103. package/dist/admin/translations/pl.json.js +0 -2
  104. package/dist/admin/translations/pl.json.js.map +1 -1
  105. package/dist/admin/translations/pl.json.mjs +0 -2
  106. package/dist/admin/translations/pl.json.mjs.map +1 -1
  107. package/dist/admin/translations/ru.json.js +0 -2
  108. package/dist/admin/translations/ru.json.js.map +1 -1
  109. package/dist/admin/translations/ru.json.mjs +0 -2
  110. package/dist/admin/translations/ru.json.mjs.map +1 -1
  111. package/dist/admin/translations/sk.json.js +0 -2
  112. package/dist/admin/translations/sk.json.js.map +1 -1
  113. package/dist/admin/translations/sk.json.mjs +0 -2
  114. package/dist/admin/translations/sk.json.mjs.map +1 -1
  115. package/dist/server/config.js +24 -3
  116. package/dist/server/config.js.map +1 -1
  117. package/dist/server/config.mjs +21 -3
  118. package/dist/server/config.mjs.map +1 -1
  119. package/dist/server/controllers/schema.js +2 -2
  120. package/dist/server/controllers/schema.js.map +1 -1
  121. package/dist/server/controllers/schema.mjs +1 -1
  122. package/dist/server/controllers/schema.mjs.map +1 -1
  123. package/dist/server/controllers/validation/content-type.js +9 -11
  124. package/dist/server/controllers/validation/content-type.js.map +1 -1
  125. package/dist/server/controllers/validation/content-type.mjs +7 -9
  126. package/dist/server/controllers/validation/content-type.mjs.map +1 -1
  127. package/dist/server/controllers/validation/model-schema.js +2 -3
  128. package/dist/server/controllers/validation/model-schema.js.map +1 -1
  129. package/dist/server/controllers/validation/model-schema.mjs +1 -2
  130. package/dist/server/controllers/validation/model-schema.mjs.map +1 -1
  131. package/dist/server/controllers/validation/relations.js +1 -2
  132. package/dist/server/controllers/validation/relations.js.map +1 -1
  133. package/dist/server/controllers/validation/relations.mjs +1 -2
  134. package/dist/server/controllers/validation/relations.mjs.map +1 -1
  135. package/dist/server/controllers/validation/schema.js +42 -23
  136. package/dist/server/controllers/validation/schema.js.map +1 -1
  137. package/dist/server/controllers/validation/schema.mjs +43 -24
  138. package/dist/server/controllers/validation/schema.mjs.map +1 -1
  139. package/dist/server/index.js +1 -1
  140. package/dist/server/index.js.map +1 -1
  141. package/dist/server/services/content-types.js +1 -2
  142. package/dist/server/services/content-types.js.map +1 -1
  143. package/dist/server/services/content-types.mjs +2 -3
  144. package/dist/server/services/content-types.mjs.map +1 -1
  145. package/dist/server/services/migration-builder/index.js +580 -0
  146. package/dist/server/services/migration-builder/index.js.map +1 -0
  147. package/dist/server/services/migration-builder/index.mjs +573 -0
  148. package/dist/server/services/migration-builder/index.mjs.map +1 -0
  149. package/dist/server/services/schema-builder/content-type-builder.js +31 -1
  150. package/dist/server/services/schema-builder/content-type-builder.js.map +1 -1
  151. package/dist/server/services/schema-builder/content-type-builder.mjs +31 -1
  152. package/dist/server/services/schema-builder/content-type-builder.mjs.map +1 -1
  153. package/dist/server/services/schema-mutation.js +30 -2
  154. package/dist/server/services/schema-mutation.js.map +1 -1
  155. package/dist/server/services/schema-mutation.mjs +10 -2
  156. package/dist/server/services/schema-mutation.mjs.map +1 -1
  157. package/dist/server/services/schema.js +312 -15
  158. package/dist/server/services/schema.js.map +1 -1
  159. package/dist/server/services/schema.mjs +305 -9
  160. package/dist/server/services/schema.mjs.map +1 -1
  161. package/dist/server/src/config.d.ts +23 -2
  162. package/dist/server/src/config.d.ts.map +1 -1
  163. package/dist/server/src/controllers/validation/content-type.d.ts +0 -1
  164. package/dist/server/src/controllers/validation/content-type.d.ts.map +1 -1
  165. package/dist/server/src/controllers/validation/relations.d.ts.map +1 -1
  166. package/dist/server/src/controllers/validation/schema.d.ts +28 -0
  167. package/dist/server/src/controllers/validation/schema.d.ts.map +1 -1
  168. package/dist/server/src/index.d.ts +10 -2
  169. package/dist/server/src/index.d.ts.map +1 -1
  170. package/dist/server/src/services/content-types.d.ts.map +1 -1
  171. package/dist/server/src/services/migration-builder/index.d.ts +83 -0
  172. package/dist/server/src/services/migration-builder/index.d.ts.map +1 -0
  173. package/dist/server/src/services/schema-builder/content-type-builder.d.ts.map +1 -1
  174. package/dist/server/src/services/schema-mutation.d.ts +4 -2
  175. package/dist/server/src/services/schema-mutation.d.ts.map +1 -1
  176. package/dist/server/src/services/schema.d.ts +19 -0
  177. package/dist/server/src/services/schema.d.ts.map +1 -1
  178. package/package.json +7 -6
@@ -1,10 +1,13 @@
1
1
  import merge from 'lodash/merge';
2
2
  import omit from 'lodash/omit';
3
+ import uniq from 'lodash/uniq';
3
4
  import { applyPrivateSearchDefault } from '../../utils/applyPrivateSearchDefault.mjs';
5
+ import { getVisibleConditionEntries } from '../../utils/conditions.mjs';
4
6
  import { getRelationType } from '../../utils/getRelationType.mjs';
5
7
  import { makeUnique } from '../../utils/makeUnique.mjs';
6
8
  import { createUndoRedoSlice } from './undoRedo.mjs';
7
9
  import { sectionKeyForKind, getDeleteFolderOnlySiblingNameCollisions, MAX_FOLDER_DEPTH, isFolderNameTakenBySibling, createEmptyContentStructure, findSiblingFolderByName } from './utils/contentStructure.mjs';
10
+ import { isStorageCompatibleRename } from './utils/isStorageCompatibleRename.mjs';
8
11
 
9
12
  const initialState = {
10
13
  components: {},
@@ -73,6 +76,84 @@ const createAttribute = (properties)=>{
73
76
  status: 'NEW'
74
77
  };
75
78
  };
79
+ /**
80
+ * Records an attribute rename hop in the order the user performed it, so the
81
+ * server can replay the exact path as a data-preserving migration.
82
+ *
83
+ * - Only renames of fields that already exist in the database are recorded; a
84
+ * brand-new field (status NEW) has no data yet, so its renames are ignored.
85
+ * - A rename that also changes the field's type / relation / component is not
86
+ * recorded (see `isStorageCompatibleRename`).
87
+ * - Each hop (`previousName -> newName`) is appended verbatim. The recorded
88
+ * sequence is inherently collision-free because the CTB never allows two
89
+ * fields to share a name — a "swap" is expressed through the user's own
90
+ * intermediate-name hop, so no synthetic temp column is ever needed.
91
+ */ const recordRename = (type, previousAttribute, newAttribute)=>{
92
+ if (previousAttribute.status === 'NEW') {
93
+ return;
94
+ }
95
+ const oldName = previousAttribute.name;
96
+ const newName = newAttribute?.name;
97
+ if (!newName || oldName === newName) {
98
+ return;
99
+ }
100
+ if (!isStorageCompatibleRename(previousAttribute, newAttribute)) {
101
+ return;
102
+ }
103
+ if (!type.renames) {
104
+ type.renames = [];
105
+ }
106
+ type.renames.push({
107
+ oldName,
108
+ newName
109
+ });
110
+ };
111
+ /**
112
+ * Remembers the names of a rename hop the user declined to preserve data for,
113
+ * so the rest of that chain is declined without another prompt.
114
+ */ const recordDeclinedRename = (type, previousAttribute, newAttribute)=>{
115
+ const oldName = previousAttribute.name;
116
+ const newName = newAttribute?.name;
117
+ if (!newName || oldName === newName) {
118
+ return;
119
+ }
120
+ type.declinedRenameNames = uniq([
121
+ ...type.declinedRenameNames ?? [],
122
+ oldName,
123
+ newName
124
+ ]);
125
+ };
126
+ /**
127
+ * Applies the rename consent carried by an edit: either records the hop or
128
+ * remembers it as declined. Never both.
129
+ */ const applyRenameConsent = (type, previousAttribute, newAttribute, { recordRename: shouldRecordRename = true, declineRename: shouldDecline = false })=>{
130
+ if (shouldDecline) {
131
+ recordDeclinedRename(type, previousAttribute, newAttribute);
132
+ return;
133
+ }
134
+ if (shouldRecordRename) {
135
+ recordRename(type, previousAttribute, newAttribute);
136
+ }
137
+ };
138
+ /**
139
+ * Points the conditions of the type's other fields at the new name of a renamed
140
+ * field. Runs for every rename, recorded or not, so the conditions follow the
141
+ * field whether or not its data is preserved.
142
+ */ const renameConditionVars = (type, previousAttribute, newAttribute)=>{
143
+ const oldName = previousAttribute.name;
144
+ const newName = newAttribute?.name;
145
+ if (!newName || oldName === newName) {
146
+ return;
147
+ }
148
+ type.attributes.forEach((attribute)=>{
149
+ getVisibleConditionEntries(attribute.conditions).forEach(({ fieldVar })=>{
150
+ if (fieldVar.var === oldName) {
151
+ fieldVar.var = newName;
152
+ setAttributeStatus(attribute, 'CHANGED');
153
+ }
154
+ });
155
+ });
156
+ };
76
157
  const setAttributeAt = (type, index, attribute)=>{
77
158
  const previousAttribute = type.attributes[index];
78
159
  const newStatus = getNewStatus(previousAttribute.status, 'CHANGED');
@@ -112,6 +193,30 @@ const removeAttributeByName = (type, name)=>{
112
193
  setAttributeStatus(attr, 'REMOVED');
113
194
  }
114
195
  };
196
+ /**
197
+ * Carries the pending rename state of `existing` over to a full replacement of
198
+ * the type (the AI chat's `applyChange`). Appending the incoming hops after the
199
+ * existing ones is order-correct: the chat transform diffs against the current
200
+ * reducer entry, whose attributes already carry the manual renames, so its hops
201
+ * start from where the manual hops ended.
202
+ */ const mergeRenameState = (existing, incoming)=>{
203
+ const renames = [
204
+ ...existing?.renames ?? [],
205
+ ...incoming.renames ?? []
206
+ ];
207
+ const declinedRenameNames = uniq([
208
+ ...existing?.declinedRenameNames ?? [],
209
+ ...incoming.declinedRenameNames ?? []
210
+ ]);
211
+ return {
212
+ ...renames.length > 0 ? {
213
+ renames
214
+ } : {},
215
+ ...declinedRenameNames.length > 0 ? {
216
+ declinedRenameNames
217
+ } : {}
218
+ };
219
+ };
115
220
  const updateType = (type, data)=>{
116
221
  merge(type, data);
117
222
  setStatus(type, 'CHANGED');
@@ -401,7 +506,7 @@ const slice = createUndoRedoSlice({
401
506
  attr.components = updatedComponents;
402
507
  },
403
508
  editAttribute: (state, action)=>{
404
- const { name, attributeToSet, forTarget, targetUid } = action.payload;
509
+ const { name, attributeToSet, forTarget, targetUid, recordRename, declineRename, recordTargetRename, declineTargetRename } = action.payload;
405
510
  const type = getType(state, {
406
511
  forTarget,
407
512
  targetUid
@@ -411,6 +516,11 @@ const slice = createUndoRedoSlice({
411
516
  return;
412
517
  }
413
518
  const previousAttribute = type.attributes[initialAttributeIndex];
519
+ applyRenameConsent(type, previousAttribute, attributeToSet, {
520
+ recordRename,
521
+ declineRename
522
+ });
523
+ renameConditionVars(type, previousAttribute, attributeToSet);
414
524
  setAttributeAt(type, initialAttributeIndex, attributeToSet);
415
525
  if (previousAttribute.type !== attributeToSet.type) {
416
526
  return;
@@ -450,6 +560,14 @@ const slice = createUndoRedoSlice({
450
560
  };
451
561
  // create or recreate(at old index) targetAttribute
452
562
  if (previousTargetAttributeIndex !== -1 && previousTarget.uid === newTarget.uid) {
563
+ // The counterpart is renamed on the target type: without a hop
564
+ // there, the side owning the join table would lose its links.
565
+ if (previousTargetAttribute) {
566
+ applyRenameConsent(newTarget, previousTargetAttribute, newTargetAttribute, {
567
+ recordRename: recordTargetRename,
568
+ declineRename: declineTargetRename
569
+ });
570
+ }
453
571
  // re-create at previousIdx if possible
454
572
  replaceAttributeAt(newTarget, previousTargetAttributeIndex, newTargetAttribute);
455
573
  } else {
@@ -461,14 +579,20 @@ const slice = createUndoRedoSlice({
461
579
  }
462
580
  },
463
581
  editCustomFieldAttribute: (state, action)=>{
464
- const { forTarget, targetUid, name, attributeToSet } = action.payload;
582
+ const { forTarget, targetUid, name, attributeToSet, recordRename, declineRename } = action.payload;
465
583
  const initialAttributeName = name;
466
584
  const type = getType(state, {
467
585
  forTarget,
468
586
  targetUid
469
587
  });
470
588
  const initialAttributeIndex = findAttributeIndex(type, initialAttributeName);
589
+ const previousAttribute = type.attributes[initialAttributeIndex];
471
590
  setAttributeAt(type, initialAttributeIndex, attributeToSet);
591
+ applyRenameConsent(type, previousAttribute, attributeToSet, {
592
+ recordRename,
593
+ declineRename
594
+ });
595
+ renameConditionVars(type, previousAttribute, attributeToSet);
472
596
  },
473
597
  reloadPlugin: ()=>{
474
598
  return initialState;
@@ -887,6 +1011,7 @@ const slice = createUndoRedoSlice({
887
1011
  const component = state.components[uid];
888
1012
  state.components[uid] = {
889
1013
  ...schema,
1014
+ ...mergeRenameState(component, schema),
890
1015
  status: component?.status === 'NEW' ? 'NEW' : schema.status
891
1016
  };
892
1017
  } else {
@@ -894,6 +1019,7 @@ const slice = createUndoRedoSlice({
894
1019
  const previousKind = contentType?.kind;
895
1020
  state.contentTypes[uid] = {
896
1021
  ...schema,
1022
+ ...mergeRenameState(contentType, schema),
897
1023
  status: contentType?.status === 'NEW' ? 'NEW' : schema.status
898
1024
  };
899
1025
  if (previousKind && schema.kind && schema.kind !== previousKind) {