@wix/patterns-cms 1.1.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 (163) hide show
  1. package/dist/cjs/adapter/__tests__/cmsFieldActions.spec.js +436 -0
  2. package/dist/cjs/adapter/__tests__/cmsFieldActions.spec.js.map +1 -0
  3. package/dist/cjs/adapter/__tests__/cmsPermissions.spec.js +175 -0
  4. package/dist/cjs/adapter/__tests__/cmsPermissions.spec.js.map +1 -0
  5. package/dist/cjs/adapter/__tests__/createCmsBackend.spec.js +440 -0
  6. package/dist/cjs/adapter/__tests__/createCmsBackend.spec.js.map +1 -0
  7. package/dist/cjs/adapter/__tests__/filterUtils.spec.js +426 -0
  8. package/dist/cjs/adapter/__tests__/filterUtils.spec.js.map +1 -0
  9. package/dist/cjs/adapter/__tests__/getFieldKey.spec.js +24 -0
  10. package/dist/cjs/adapter/__tests__/getFieldKey.spec.js.map +1 -0
  11. package/dist/cjs/adapter/__tests__/loadCmsSchema.spec.js +166 -0
  12. package/dist/cjs/adapter/__tests__/loadCmsSchema.spec.js.map +1 -0
  13. package/dist/cjs/adapter/__tests__/searchUtils.spec.js +116 -0
  14. package/dist/cjs/adapter/__tests__/searchUtils.spec.js.map +1 -0
  15. package/dist/cjs/adapter/__tests__/sortUtils.spec.js +118 -0
  16. package/dist/cjs/adapter/__tests__/sortUtils.spec.js.map +1 -0
  17. package/dist/cjs/adapter/__tests__/transformCmsSchema.spec.js +210 -0
  18. package/dist/cjs/adapter/__tests__/transformCmsSchema.spec.js.map +1 -0
  19. package/dist/cjs/adapter/__tests__/wixDataQueryRecorder.js +54 -0
  20. package/dist/cjs/adapter/__tests__/wixDataQueryRecorder.js.map +1 -0
  21. package/dist/cjs/adapter/cmsBackup.js +52 -0
  22. package/dist/cjs/adapter/cmsBackup.js.map +1 -0
  23. package/dist/cjs/adapter/cmsFieldTypeMap.js +43 -0
  24. package/dist/cjs/adapter/cmsFieldTypeMap.js.map +1 -0
  25. package/dist/cjs/adapter/cmsPermissions.js +94 -0
  26. package/dist/cjs/adapter/cmsPermissions.js.map +1 -0
  27. package/dist/cjs/adapter/constants.js +20 -0
  28. package/dist/cjs/adapter/constants.js.map +1 -0
  29. package/dist/cjs/adapter/createCmsBackend.js +131 -0
  30. package/dist/cjs/adapter/createCmsBackend.js.map +1 -0
  31. package/dist/cjs/adapter/createCmsFieldActions.js +182 -0
  32. package/dist/cjs/adapter/createCmsFieldActions.js.map +1 -0
  33. package/dist/cjs/adapter/fetchExternalDbConnections.js +24 -0
  34. package/dist/cjs/adapter/fetchExternalDbConnections.js.map +1 -0
  35. package/dist/cjs/adapter/fetchUserPermissions.js +24 -0
  36. package/dist/cjs/adapter/fetchUserPermissions.js.map +1 -0
  37. package/dist/cjs/adapter/filterUtils.js +128 -0
  38. package/dist/cjs/adapter/filterUtils.js.map +1 -0
  39. package/dist/cjs/adapter/getFieldKey.js +19 -0
  40. package/dist/cjs/adapter/getFieldKey.js.map +1 -0
  41. package/dist/cjs/adapter/index.js +36 -0
  42. package/dist/cjs/adapter/index.js.map +1 -0
  43. package/dist/cjs/adapter/loadCmsSchema.js +51 -0
  44. package/dist/cjs/adapter/loadCmsSchema.js.map +1 -0
  45. package/dist/cjs/adapter/pollUntilReady.js +30 -0
  46. package/dist/cjs/adapter/pollUntilReady.js.map +1 -0
  47. package/dist/cjs/adapter/searchUtils.js +32 -0
  48. package/dist/cjs/adapter/searchUtils.js.map +1 -0
  49. package/dist/cjs/adapter/sortUtils.js +34 -0
  50. package/dist/cjs/adapter/sortUtils.js.map +1 -0
  51. package/dist/cjs/adapter/transformCmsSchema.js +75 -0
  52. package/dist/cjs/adapter/transformCmsSchema.js.map +1 -0
  53. package/dist/cjs/index.js +10 -0
  54. package/dist/cjs/index.js.map +1 -0
  55. package/dist/esm/adapter/__tests__/cmsFieldActions.spec.js +335 -0
  56. package/dist/esm/adapter/__tests__/cmsFieldActions.spec.js.map +1 -0
  57. package/dist/esm/adapter/__tests__/cmsPermissions.spec.js +173 -0
  58. package/dist/esm/adapter/__tests__/cmsPermissions.spec.js.map +1 -0
  59. package/dist/esm/adapter/__tests__/createCmsBackend.spec.js +307 -0
  60. package/dist/esm/adapter/__tests__/createCmsBackend.spec.js.map +1 -0
  61. package/dist/esm/adapter/__tests__/filterUtils.spec.js +298 -0
  62. package/dist/esm/adapter/__tests__/filterUtils.spec.js.map +1 -0
  63. package/dist/esm/adapter/__tests__/getFieldKey.spec.js +22 -0
  64. package/dist/esm/adapter/__tests__/getFieldKey.spec.js.map +1 -0
  65. package/dist/esm/adapter/__tests__/loadCmsSchema.spec.js +147 -0
  66. package/dist/esm/adapter/__tests__/loadCmsSchema.spec.js.map +1 -0
  67. package/dist/esm/adapter/__tests__/searchUtils.spec.js +109 -0
  68. package/dist/esm/adapter/__tests__/searchUtils.spec.js.map +1 -0
  69. package/dist/esm/adapter/__tests__/sortUtils.spec.js +85 -0
  70. package/dist/esm/adapter/__tests__/sortUtils.spec.js.map +1 -0
  71. package/dist/esm/adapter/__tests__/transformCmsSchema.spec.js +201 -0
  72. package/dist/esm/adapter/__tests__/transformCmsSchema.spec.js.map +1 -0
  73. package/dist/esm/adapter/__tests__/wixDataQueryRecorder.js +42 -0
  74. package/dist/esm/adapter/__tests__/wixDataQueryRecorder.js.map +1 -0
  75. package/dist/esm/adapter/cmsBackup.js +34 -0
  76. package/dist/esm/adapter/cmsBackup.js.map +1 -0
  77. package/dist/esm/adapter/cmsFieldTypeMap.js +37 -0
  78. package/dist/esm/adapter/cmsFieldTypeMap.js.map +1 -0
  79. package/dist/esm/adapter/cmsPermissions.js +91 -0
  80. package/dist/esm/adapter/cmsPermissions.js.map +1 -0
  81. package/dist/esm/adapter/constants.js +25 -0
  82. package/dist/esm/adapter/constants.js.map +1 -0
  83. package/dist/esm/adapter/createCmsBackend.js +113 -0
  84. package/dist/esm/adapter/createCmsBackend.js.map +1 -0
  85. package/dist/esm/adapter/createCmsFieldActions.js +159 -0
  86. package/dist/esm/adapter/createCmsFieldActions.js.map +1 -0
  87. package/dist/esm/adapter/fetchExternalDbConnections.js +17 -0
  88. package/dist/esm/adapter/fetchExternalDbConnections.js.map +1 -0
  89. package/dist/esm/adapter/fetchUserPermissions.js +15 -0
  90. package/dist/esm/adapter/fetchUserPermissions.js.map +1 -0
  91. package/dist/esm/adapter/filterUtils.js +126 -0
  92. package/dist/esm/adapter/filterUtils.js.map +1 -0
  93. package/dist/esm/adapter/getFieldKey.js +13 -0
  94. package/dist/esm/adapter/getFieldKey.js.map +1 -0
  95. package/dist/esm/adapter/index.js +15 -0
  96. package/dist/esm/adapter/index.js.map +1 -0
  97. package/dist/esm/adapter/loadCmsSchema.js +48 -0
  98. package/dist/esm/adapter/loadCmsSchema.js.map +1 -0
  99. package/dist/esm/adapter/pollUntilReady.js +24 -0
  100. package/dist/esm/adapter/pollUntilReady.js.map +1 -0
  101. package/dist/esm/adapter/searchUtils.js +24 -0
  102. package/dist/esm/adapter/searchUtils.js.map +1 -0
  103. package/dist/esm/adapter/sortUtils.js +21 -0
  104. package/dist/esm/adapter/sortUtils.js.map +1 -0
  105. package/dist/esm/adapter/transformCmsSchema.js +70 -0
  106. package/dist/esm/adapter/transformCmsSchema.js.map +1 -0
  107. package/dist/esm/index.js +2 -0
  108. package/dist/esm/index.js.map +1 -0
  109. package/dist/types/adapter/__tests__/cmsFieldActions.spec.d.ts +2 -0
  110. package/dist/types/adapter/__tests__/cmsFieldActions.spec.d.ts.map +1 -0
  111. package/dist/types/adapter/__tests__/cmsPermissions.spec.d.ts +2 -0
  112. package/dist/types/adapter/__tests__/cmsPermissions.spec.d.ts.map +1 -0
  113. package/dist/types/adapter/__tests__/createCmsBackend.spec.d.ts +2 -0
  114. package/dist/types/adapter/__tests__/createCmsBackend.spec.d.ts.map +1 -0
  115. package/dist/types/adapter/__tests__/filterUtils.spec.d.ts +2 -0
  116. package/dist/types/adapter/__tests__/filterUtils.spec.d.ts.map +1 -0
  117. package/dist/types/adapter/__tests__/getFieldKey.spec.d.ts +2 -0
  118. package/dist/types/adapter/__tests__/getFieldKey.spec.d.ts.map +1 -0
  119. package/dist/types/adapter/__tests__/loadCmsSchema.spec.d.ts +2 -0
  120. package/dist/types/adapter/__tests__/loadCmsSchema.spec.d.ts.map +1 -0
  121. package/dist/types/adapter/__tests__/searchUtils.spec.d.ts +2 -0
  122. package/dist/types/adapter/__tests__/searchUtils.spec.d.ts.map +1 -0
  123. package/dist/types/adapter/__tests__/sortUtils.spec.d.ts +2 -0
  124. package/dist/types/adapter/__tests__/sortUtils.spec.d.ts.map +1 -0
  125. package/dist/types/adapter/__tests__/transformCmsSchema.spec.d.ts +2 -0
  126. package/dist/types/adapter/__tests__/transformCmsSchema.spec.d.ts.map +1 -0
  127. package/dist/types/adapter/__tests__/wixDataQueryRecorder.d.ts +40 -0
  128. package/dist/types/adapter/__tests__/wixDataQueryRecorder.d.ts.map +1 -0
  129. package/dist/types/adapter/cmsBackup.d.ts +7 -0
  130. package/dist/types/adapter/cmsBackup.d.ts.map +1 -0
  131. package/dist/types/adapter/cmsFieldTypeMap.d.ts +8 -0
  132. package/dist/types/adapter/cmsFieldTypeMap.d.ts.map +1 -0
  133. package/dist/types/adapter/cmsPermissions.d.ts +21 -0
  134. package/dist/types/adapter/cmsPermissions.d.ts.map +1 -0
  135. package/dist/types/adapter/constants.d.ts +14 -0
  136. package/dist/types/adapter/constants.d.ts.map +1 -0
  137. package/dist/types/adapter/createCmsBackend.d.ts +9 -0
  138. package/dist/types/adapter/createCmsBackend.d.ts.map +1 -0
  139. package/dist/types/adapter/createCmsFieldActions.d.ts +8 -0
  140. package/dist/types/adapter/createCmsFieldActions.d.ts.map +1 -0
  141. package/dist/types/adapter/fetchExternalDbConnections.d.ts +11 -0
  142. package/dist/types/adapter/fetchExternalDbConnections.d.ts.map +1 -0
  143. package/dist/types/adapter/fetchUserPermissions.d.ts +7 -0
  144. package/dist/types/adapter/fetchUserPermissions.d.ts.map +1 -0
  145. package/dist/types/adapter/filterUtils.d.ts +14 -0
  146. package/dist/types/adapter/filterUtils.d.ts.map +1 -0
  147. package/dist/types/adapter/getFieldKey.d.ts +3 -0
  148. package/dist/types/adapter/getFieldKey.d.ts.map +1 -0
  149. package/dist/types/adapter/index.d.ts +15 -0
  150. package/dist/types/adapter/index.d.ts.map +1 -0
  151. package/dist/types/adapter/loadCmsSchema.d.ts +29 -0
  152. package/dist/types/adapter/loadCmsSchema.d.ts.map +1 -0
  153. package/dist/types/adapter/pollUntilReady.d.ts +11 -0
  154. package/dist/types/adapter/pollUntilReady.d.ts.map +1 -0
  155. package/dist/types/adapter/searchUtils.d.ts +12 -0
  156. package/dist/types/adapter/searchUtils.d.ts.map +1 -0
  157. package/dist/types/adapter/sortUtils.d.ts +11 -0
  158. package/dist/types/adapter/sortUtils.d.ts.map +1 -0
  159. package/dist/types/adapter/transformCmsSchema.d.ts +12 -0
  160. package/dist/types/adapter/transformCmsSchema.d.ts.map +1 -0
  161. package/dist/types/index.d.ts +2 -0
  162. package/dist/types/index.d.ts.map +1 -0
  163. package/package.json +123 -0
@@ -0,0 +1,436 @@
1
+ "use strict";
2
+
3
+ var _data = require("@wix/data");
4
+ var _createCmsFieldActions = require("../createCmsFieldActions");
5
+ jest.mock('@wix/data', () => {
6
+ const actual = jest.requireActual('@wix/data');
7
+ return {
8
+ ...actual,
9
+ collections: {
10
+ ...actual.collections,
11
+ createDataCollectionField: jest.fn(),
12
+ patchDataCollectionField: jest.fn(),
13
+ deleteDataCollectionField: jest.fn(),
14
+ patchDataCollection: jest.fn()
15
+ },
16
+ tasks: {
17
+ ...actual.tasks,
18
+ createTask: jest.fn(),
19
+ getTask: jest.fn()
20
+ }
21
+ };
22
+ });
23
+
24
+ // Typed accessors — the @wix/data SDK exposes overloaded callable types
25
+ // (MaybeContext<...>), and jest.Mocked<typeof collections> resolves to the
26
+ // HttpClient-form overload, which makes mockResolvedValue/mock.calls unusable.
27
+ // Re-typing each mock with the call shape the adapter uses unblocks both.
28
+ const createDataCollectionField = _data.collections.createDataCollectionField;
29
+ const patchDataCollectionField = _data.collections.patchDataCollectionField;
30
+ const deleteDataCollectionField = _data.collections.deleteDataCollectionField;
31
+ const patchDataCollection = _data.collections.patchDataCollection;
32
+ const createTask = _data.tasks.createTask;
33
+ const getTask = _data.tasks.getTask;
34
+ const COLLECTION_ID = 'collection-1';
35
+ const makeField = (overrides = {}) => ({
36
+ key: 'sourceField',
37
+ displayName: 'Source Field',
38
+ type: _data.collections.Type.TEXT,
39
+ systemField: false,
40
+ encrypted: false,
41
+ ...overrides
42
+ });
43
+ const makeCollection = fields => ({
44
+ _id: COLLECTION_ID,
45
+ fields
46
+ });
47
+ const makePatternsField = (overrides = {}) => {
48
+ const base = {
49
+ id: 'ignored-by-addField',
50
+ displayName: 'New Field',
51
+ type: 'SHORT_TEXT'
52
+ };
53
+ return {
54
+ ...base,
55
+ ...overrides
56
+ };
57
+ };
58
+ describe('createCmsFieldActions', () => {
59
+ beforeEach(() => {
60
+ jest.clearAllMocks();
61
+ createDataCollectionField.mockResolvedValue(undefined);
62
+ deleteDataCollectionField.mockResolvedValue(undefined);
63
+ patchDataCollection.mockResolvedValue(undefined);
64
+ patchDataCollectionField.mockResolvedValue(undefined);
65
+ });
66
+ describe('addField', () => {
67
+ it('maps the patterns field type to the CMS type and derives the key from displayName', async () => {
68
+ const actions = (0, _createCmsFieldActions.createCmsFieldActions)(COLLECTION_ID, () => makeCollection([]));
69
+ await actions.addField(makePatternsField({
70
+ displayName: 'My New Field'
71
+ }));
72
+ const [calledCollectionId, payload] = createDataCollectionField.mock.calls[0];
73
+ expect(calledCollectionId).toBe(COLLECTION_ID);
74
+ expect(payload.field).toMatchObject({
75
+ displayName: 'My New Field',
76
+ type: _data.collections.Type.TEXT,
77
+ required: false
78
+ });
79
+ expect(payload.field.key).toBeTruthy();
80
+ });
81
+ it('appends a numeric suffix when the generated key collides with an existing field', async () => {
82
+ const actions = (0, _createCmsFieldActions.createCmsFieldActions)(COLLECTION_ID, () => makeCollection([makeField({
83
+ key: 'newField'
84
+ })]));
85
+ await actions.addField(makePatternsField({
86
+ displayName: 'New Field'
87
+ }));
88
+ const [, payload] = createDataCollectionField.mock.calls[0];
89
+ expect(payload.field.key).not.toBe('newField');
90
+ });
91
+ it('sets encrypted when isPii is true and description from helpText', async () => {
92
+ const actions = (0, _createCmsFieldActions.createCmsFieldActions)(COLLECTION_ID, () => makeCollection([]));
93
+ await actions.addField(makePatternsField({
94
+ isPii: true,
95
+ helpText: 'Some hint'
96
+ }));
97
+ const [, payload] = createDataCollectionField.mock.calls[0];
98
+ expect(payload.field.encrypted).toBe(true);
99
+ expect(payload.field.description).toBe('Some hint');
100
+ });
101
+ it('passes numberRange only when the field type is NUMBER', async () => {
102
+ const actions = (0, _createCmsFieldActions.createCmsFieldActions)(COLLECTION_ID, () => makeCollection([]));
103
+ await actions.addField(makePatternsField({
104
+ type: 'NUMBER',
105
+ validation: {
106
+ required: false,
107
+ numberRange: {
108
+ min: 0,
109
+ max: 10
110
+ }
111
+ }
112
+ }));
113
+ const [, payload] = createDataCollectionField.mock.calls[0];
114
+ expect(payload.field.type).toBe(_data.collections.Type.NUMBER);
115
+ expect(payload.field.numberRange).toEqual({
116
+ min: 0,
117
+ max: 10
118
+ });
119
+ });
120
+ it('ignores numberRange when the field type is not NUMBER', async () => {
121
+ const actions = (0, _createCmsFieldActions.createCmsFieldActions)(COLLECTION_ID, () => makeCollection([]));
122
+ await actions.addField(makePatternsField({
123
+ type: 'SHORT_TEXT',
124
+ validation: {
125
+ required: false,
126
+ numberRange: {
127
+ min: 0,
128
+ max: 10
129
+ }
130
+ }
131
+ }));
132
+ const [, payload] = createDataCollectionField.mock.calls[0];
133
+ expect(payload.field.numberRange).toBeUndefined();
134
+ });
135
+ it('passes stringLengthRange only when the field type is SHORT_TEXT', async () => {
136
+ const actions = (0, _createCmsFieldActions.createCmsFieldActions)(COLLECTION_ID, () => makeCollection([]));
137
+ await actions.addField(makePatternsField({
138
+ type: 'SHORT_TEXT',
139
+ validation: {
140
+ required: false,
141
+ stringLengthRange: {
142
+ minLength: 1,
143
+ maxLength: 50
144
+ }
145
+ }
146
+ }));
147
+ const [, payload] = createDataCollectionField.mock.calls[0];
148
+ expect(payload.field.stringLengthRange).toEqual({
149
+ minLength: 1,
150
+ maxLength: 50
151
+ });
152
+ });
153
+ it('throws when the patterns type has no CMS mapping', async () => {
154
+ const actions = (0, _createCmsFieldActions.createCmsFieldActions)(COLLECTION_ID, () => makeCollection([]));
155
+ await expect(actions.addField(makePatternsField({
156
+ type: 'IMAGE'
157
+ }))).rejects.toThrow('Field type IMAGE not supported yet');
158
+ expect(createDataCollectionField).not.toHaveBeenCalled();
159
+ });
160
+ it('uses validation.required when provided', async () => {
161
+ const actions = (0, _createCmsFieldActions.createCmsFieldActions)(COLLECTION_ID, () => makeCollection([]));
162
+ await actions.addField(makePatternsField({
163
+ validation: {
164
+ required: true
165
+ }
166
+ }));
167
+ const [, payload] = createDataCollectionField.mock.calls[0];
168
+ expect(payload.field.required).toBe(true);
169
+ });
170
+ });
171
+ describe('editField', () => {
172
+ it('patches only displayName when only displayName is provided', async () => {
173
+ const actions = (0, _createCmsFieldActions.createCmsFieldActions)(COLLECTION_ID, () => makeCollection([makeField({
174
+ key: 'name'
175
+ })]));
176
+ await actions.editField('name', {
177
+ displayName: 'Renamed'
178
+ });
179
+ expect(patchDataCollectionField).toHaveBeenCalledWith(COLLECTION_ID, {
180
+ key: 'name',
181
+ displayName: 'Renamed'
182
+ });
183
+ });
184
+ it('maps isPii to encrypted and helpText to description', async () => {
185
+ const actions = (0, _createCmsFieldActions.createCmsFieldActions)(COLLECTION_ID, () => makeCollection([makeField({
186
+ key: 'name'
187
+ })]));
188
+ await actions.editField('name', {
189
+ isPii: true,
190
+ helpText: 'hint'
191
+ });
192
+ expect(patchDataCollectionField).toHaveBeenCalledWith(COLLECTION_ID, {
193
+ key: 'name',
194
+ encrypted: true,
195
+ description: 'hint'
196
+ });
197
+ });
198
+ it('includes numberRange in the patch only when the source CMS field is NUMBER', async () => {
199
+ const actions = (0, _createCmsFieldActions.createCmsFieldActions)(COLLECTION_ID, () => makeCollection([makeField({
200
+ key: 'age',
201
+ type: _data.collections.Type.NUMBER
202
+ })]));
203
+ await actions.editField('age', {
204
+ validation: {
205
+ required: true,
206
+ numberRange: {
207
+ min: 0,
208
+ max: 100
209
+ }
210
+ }
211
+ });
212
+ expect(patchDataCollectionField).toHaveBeenCalledWith(COLLECTION_ID, {
213
+ key: 'age',
214
+ required: true,
215
+ numberRange: {
216
+ min: 0,
217
+ max: 100
218
+ }
219
+ });
220
+ });
221
+ it('omits numberRange when the source CMS field is not NUMBER', async () => {
222
+ const actions = (0, _createCmsFieldActions.createCmsFieldActions)(COLLECTION_ID, () => makeCollection([makeField({
223
+ key: 'name',
224
+ type: _data.collections.Type.TEXT
225
+ })]));
226
+ await actions.editField('name', {
227
+ validation: {
228
+ required: true,
229
+ numberRange: {
230
+ min: 0,
231
+ max: 100
232
+ }
233
+ }
234
+ });
235
+ const [, patch] = patchDataCollectionField.mock.calls[0];
236
+ expect(patch).not.toHaveProperty('numberRange');
237
+ expect(patch).toMatchObject({
238
+ key: 'name',
239
+ required: true
240
+ });
241
+ });
242
+ it('includes stringLengthRange in the patch only when the source CMS field is TEXT', async () => {
243
+ const actions = (0, _createCmsFieldActions.createCmsFieldActions)(COLLECTION_ID, () => makeCollection([makeField({
244
+ key: 'name',
245
+ type: _data.collections.Type.TEXT
246
+ })]));
247
+ await actions.editField('name', {
248
+ validation: {
249
+ required: false,
250
+ stringLengthRange: {
251
+ minLength: 1,
252
+ maxLength: 30
253
+ }
254
+ }
255
+ });
256
+ expect(patchDataCollectionField).toHaveBeenCalledWith(COLLECTION_ID, {
257
+ key: 'name',
258
+ required: false,
259
+ stringLengthRange: {
260
+ minLength: 1,
261
+ maxLength: 30
262
+ }
263
+ });
264
+ });
265
+ it('omits stringLengthRange when the source CMS field is not TEXT', async () => {
266
+ const actions = (0, _createCmsFieldActions.createCmsFieldActions)(COLLECTION_ID, () => makeCollection([makeField({
267
+ key: 'age',
268
+ type: _data.collections.Type.NUMBER
269
+ })]));
270
+ await actions.editField('age', {
271
+ validation: {
272
+ required: false,
273
+ stringLengthRange: {
274
+ minLength: 1,
275
+ maxLength: 30
276
+ }
277
+ }
278
+ });
279
+ const [, patch] = patchDataCollectionField.mock.calls[0];
280
+ expect(patch).not.toHaveProperty('stringLengthRange');
281
+ });
282
+ });
283
+ describe('renameField', () => {
284
+ it('patches the field displayName with the new name', async () => {
285
+ const actions = (0, _createCmsFieldActions.createCmsFieldActions)(COLLECTION_ID, () => makeCollection([makeField({
286
+ key: 'name'
287
+ })]));
288
+ await actions.renameField('name', 'Renamed');
289
+ expect(patchDataCollectionField).toHaveBeenCalledWith(COLLECTION_ID, {
290
+ key: 'name',
291
+ displayName: 'Renamed'
292
+ });
293
+ });
294
+ });
295
+ describe('deleteField', () => {
296
+ it('calls collections.deleteDataCollectionField with the field key', async () => {
297
+ const actions = (0, _createCmsFieldActions.createCmsFieldActions)(COLLECTION_ID, () => makeCollection([makeField({
298
+ key: 'toDelete'
299
+ })]));
300
+ await actions.deleteField('toDelete');
301
+ expect(deleteDataCollectionField).toHaveBeenCalledTimes(1);
302
+ expect(deleteDataCollectionField).toHaveBeenCalledWith(COLLECTION_ID, {
303
+ fieldKey: 'toDelete'
304
+ });
305
+ });
306
+ });
307
+ describe('makePrimary', () => {
308
+ it('patches the collection displayField with the given field id', async () => {
309
+ const actions = (0, _createCmsFieldActions.createCmsFieldActions)(COLLECTION_ID, () => makeCollection([makeField({
310
+ key: 'newPrimary'
311
+ })]));
312
+ await actions.makePrimary('newPrimary');
313
+ expect(patchDataCollection).toHaveBeenCalledTimes(1);
314
+ expect(patchDataCollection).toHaveBeenCalledWith(COLLECTION_ID, {
315
+ displayField: 'newPrimary'
316
+ });
317
+ });
318
+ });
319
+ describe('duplicateField', () => {
320
+ it('clones the source field with a "(Copy)" suffix and a fresh key', async () => {
321
+ const actions = (0, _createCmsFieldActions.createCmsFieldActions)(COLLECTION_ID, () => makeCollection([makeField({
322
+ key: 'sourceField',
323
+ displayName: 'Source Field'
324
+ })]));
325
+ await actions.duplicateField('sourceField');
326
+ expect(createDataCollectionField).toHaveBeenCalledTimes(1);
327
+ const [calledCollectionId, payload] = createDataCollectionField.mock.calls[0];
328
+ expect(calledCollectionId).toBe(COLLECTION_ID);
329
+ expect(payload.field).toMatchObject({
330
+ displayName: 'Source Field (Copy)',
331
+ type: _data.collections.Type.TEXT
332
+ });
333
+ expect(payload.field.key).not.toBe('sourceField');
334
+ });
335
+ it('strips systemField and capabilities from the cloned field', async () => {
336
+ const actions = (0, _createCmsFieldActions.createCmsFieldActions)(COLLECTION_ID, () => makeCollection([makeField({
337
+ systemField: true,
338
+ capabilities: {
339
+ sortable: true,
340
+ queryOperators: [_data.collections.QueryOperator.EQ]
341
+ }
342
+ })]));
343
+ await actions.duplicateField('sourceField');
344
+ const [, payload] = createDataCollectionField.mock.calls[0];
345
+ expect(payload.field).not.toHaveProperty('systemField');
346
+ expect(payload.field).not.toHaveProperty('capabilities');
347
+ });
348
+ it('clears typeMetadata.multiReference.referencingFieldKey on clone', async () => {
349
+ var _payload$field$typeMe, _payload$field$typeMe2;
350
+ const sourceField = makeField({
351
+ key: 'multiRef',
352
+ displayName: 'Multi Ref',
353
+ type: _data.collections.Type.MULTI_REFERENCE,
354
+ typeMetadata: {
355
+ multiReference: {
356
+ referencingFieldKey: 'someExistingKey',
357
+ referencedCollectionId: 'other-collection'
358
+ }
359
+ }
360
+ });
361
+ const actions = (0, _createCmsFieldActions.createCmsFieldActions)(COLLECTION_ID, () => makeCollection([sourceField]));
362
+ await actions.duplicateField('multiRef');
363
+ const [, payload] = createDataCollectionField.mock.calls[0];
364
+ expect((_payload$field$typeMe = payload.field.typeMetadata) == null || (_payload$field$typeMe = _payload$field$typeMe.multiReference) == null ? void 0 : _payload$field$typeMe.referencingFieldKey).toBeUndefined();
365
+ expect((_payload$field$typeMe2 = payload.field.typeMetadata) == null || (_payload$field$typeMe2 = _payload$field$typeMe2.multiReference) == null ? void 0 : _payload$field$typeMe2.referencedCollectionId).toBe('other-collection');
366
+ });
367
+ it('appends a numeric suffix when the generated key collides with an existing field', async () => {
368
+ const actions = (0, _createCmsFieldActions.createCmsFieldActions)(COLLECTION_ID, () => makeCollection([makeField({
369
+ key: 'sourceField',
370
+ displayName: 'Source Field'
371
+ }), makeField({
372
+ key: 'sourceFieldCopy'
373
+ })]));
374
+ await actions.duplicateField('sourceField');
375
+ const [, payload] = createDataCollectionField.mock.calls[0];
376
+ expect(payload.field.key).not.toBe('sourceField');
377
+ expect(payload.field.key).not.toBe('sourceFieldCopy');
378
+ });
379
+ it('throws when the source field is not found', async () => {
380
+ const actions = (0, _createCmsFieldActions.createCmsFieldActions)(COLLECTION_ID, () => makeCollection([]));
381
+ await expect(actions.duplicateField('missing')).rejects.toThrow('Field missing not found');
382
+ expect(createDataCollectionField).not.toHaveBeenCalled();
383
+ });
384
+ });
385
+ describe('duplicateFieldWithContent', () => {
386
+ it('creates the cloned field, kicks off a COPY_FIELD_DATA task, and waits for completion', async () => {
387
+ createTask.mockResolvedValue({
388
+ _id: 'task-1'
389
+ });
390
+ getTask.mockResolvedValue({
391
+ _id: 'task-1',
392
+ status: 'COMPLETED'
393
+ });
394
+ const actions = (0, _createCmsFieldActions.createCmsFieldActions)(COLLECTION_ID, () => makeCollection([makeField({
395
+ key: 'sourceField',
396
+ displayName: 'Source Field'
397
+ })]));
398
+ await actions.duplicateFieldWithContent('sourceField');
399
+ expect(createDataCollectionField).toHaveBeenCalledTimes(1);
400
+ const [, payload] = createDataCollectionField.mock.calls[0];
401
+ const targetFieldKey = payload.field.key;
402
+ expect(createTask).toHaveBeenCalledTimes(1);
403
+ expect(createTask).toHaveBeenCalledWith({
404
+ type: 'COPY_FIELD_DATA',
405
+ copyFieldDataOptions: {
406
+ dataCollectionId: COLLECTION_ID,
407
+ sourceFieldKey: 'sourceField',
408
+ targetFieldKey
409
+ }
410
+ });
411
+ expect(getTask).toHaveBeenCalledWith('task-1');
412
+ });
413
+ it('throws when the copy task reports FAILED, surfacing the failure code and description', async () => {
414
+ createTask.mockResolvedValue({
415
+ _id: 'task-2'
416
+ });
417
+ getTask.mockResolvedValue({
418
+ _id: 'task-2',
419
+ status: 'FAILED',
420
+ failures: [{
421
+ code: 'INTERNAL',
422
+ description: 'Copy boom'
423
+ }]
424
+ });
425
+ const actions = (0, _createCmsFieldActions.createCmsFieldActions)(COLLECTION_ID, () => makeCollection([makeField()]));
426
+ await expect(actions.duplicateFieldWithContent('sourceField')).rejects.toThrow('INTERNAL: Copy boom');
427
+ });
428
+ it('throws when the source field is not found and never creates a task', async () => {
429
+ const actions = (0, _createCmsFieldActions.createCmsFieldActions)(COLLECTION_ID, () => makeCollection([]));
430
+ await expect(actions.duplicateFieldWithContent('missing')).rejects.toThrow('Field missing not found');
431
+ expect(createDataCollectionField).not.toHaveBeenCalled();
432
+ expect(createTask).not.toHaveBeenCalled();
433
+ });
434
+ });
435
+ });
436
+ //# sourceMappingURL=cmsFieldActions.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_data","require","_createCmsFieldActions","jest","mock","actual","requireActual","collections","createDataCollectionField","fn","patchDataCollectionField","deleteDataCollectionField","patchDataCollection","tasks","createTask","getTask","COLLECTION_ID","makeField","overrides","key","displayName","type","Type","TEXT","systemField","encrypted","makeCollection","fields","_id","makePatternsField","base","id","describe","beforeEach","clearAllMocks","mockResolvedValue","undefined","it","actions","createCmsFieldActions","addField","calledCollectionId","payload","calls","expect","toBe","field","toMatchObject","required","toBeTruthy","not","isPii","helpText","description","validation","numberRange","min","max","NUMBER","toEqual","toBeUndefined","stringLengthRange","minLength","maxLength","rejects","toThrow","toHaveBeenCalled","editField","toHaveBeenCalledWith","patch","toHaveProperty","renameField","deleteField","toHaveBeenCalledTimes","fieldKey","makePrimary","displayField","duplicateField","capabilities","sortable","queryOperators","QueryOperator","EQ","_payload$field$typeMe","_payload$field$typeMe2","sourceField","MULTI_REFERENCE","typeMetadata","multiReference","referencingFieldKey","referencedCollectionId","status","duplicateFieldWithContent","targetFieldKey","copyFieldDataOptions","dataCollectionId","sourceFieldKey","failures","code"],"sources":["../../../../src/adapter/__tests__/cmsFieldActions.spec.ts"],"sourcesContent":["import { collections, tasks } from '@wix/data';\nimport type { Field } from '@wix/bex-core';\nimport { createCmsFieldActions } from '../createCmsFieldActions';\n\njest.mock('@wix/data', () => {\n const actual = jest.requireActual('@wix/data');\n return {\n ...actual,\n collections: {\n ...actual.collections,\n createDataCollectionField: jest.fn(),\n patchDataCollectionField: jest.fn(),\n deleteDataCollectionField: jest.fn(),\n patchDataCollection: jest.fn(),\n },\n tasks: {\n ...actual.tasks,\n createTask: jest.fn(),\n getTask: jest.fn(),\n },\n };\n});\n\n// Typed accessors — the @wix/data SDK exposes overloaded callable types\n// (MaybeContext<...>), and jest.Mocked<typeof collections> resolves to the\n// HttpClient-form overload, which makes mockResolvedValue/mock.calls unusable.\n// Re-typing each mock with the call shape the adapter uses unblocks both.\nconst createDataCollectionField =\n collections.createDataCollectionField as unknown as jest.Mock<\n Promise<void>,\n [collectionId: string, options: { field: collections.Field }]\n >;\nconst patchDataCollectionField =\n collections.patchDataCollectionField as unknown as jest.Mock<\n Promise<void>,\n [collectionId: string, field: collections.Field]\n >;\nconst deleteDataCollectionField =\n collections.deleteDataCollectionField as unknown as jest.Mock<\n Promise<void>,\n [collectionId: string, options: { fieldKey: string }]\n >;\nconst patchDataCollection =\n collections.patchDataCollection as unknown as jest.Mock<\n Promise<void>,\n [collectionId: string, dataCollection: collections.PatchDataCollection]\n >;\n\ninterface CopyTaskState {\n _id: string;\n status: 'NEW' | 'RUNNING' | 'COMPLETED' | 'FAILED';\n failures?: { code?: string; description?: string }[];\n}\n\nconst createTask = tasks.createTask as unknown as jest.Mock<\n Promise<{ _id: string }>,\n [task: { type: string; copyFieldDataOptions: unknown }]\n>;\nconst getTask = tasks.getTask as unknown as jest.Mock<\n Promise<CopyTaskState>,\n [taskId: string]\n>;\n\nconst COLLECTION_ID = 'collection-1';\n\nconst makeField = (\n overrides: Partial<collections.Field> = {},\n): collections.Field => ({\n key: 'sourceField',\n displayName: 'Source Field',\n type: collections.Type.TEXT,\n systemField: false,\n encrypted: false,\n ...overrides,\n});\n\nconst makeCollection = (\n fields: collections.Field[],\n): collections.DataCollection => ({ _id: COLLECTION_ID, fields });\n\nconst makePatternsField = (overrides: Partial<Field> = {}): Field => {\n const base: Field = {\n id: 'ignored-by-addField',\n displayName: 'New Field',\n type: 'SHORT_TEXT',\n };\n return { ...base, ...overrides } as Field;\n};\n\ndescribe('createCmsFieldActions', () => {\n beforeEach(() => {\n jest.clearAllMocks();\n createDataCollectionField.mockResolvedValue(undefined);\n deleteDataCollectionField.mockResolvedValue(undefined);\n patchDataCollection.mockResolvedValue(undefined);\n patchDataCollectionField.mockResolvedValue(undefined);\n });\n\n describe('addField', () => {\n it('maps the patterns field type to the CMS type and derives the key from displayName', async () => {\n const actions = createCmsFieldActions(COLLECTION_ID, () =>\n makeCollection([]),\n );\n\n await actions.addField!(\n makePatternsField({ displayName: 'My New Field' }),\n );\n\n const [calledCollectionId, payload] =\n createDataCollectionField.mock.calls[0];\n expect(calledCollectionId).toBe(COLLECTION_ID);\n expect(payload.field).toMatchObject({\n displayName: 'My New Field',\n type: collections.Type.TEXT,\n required: false,\n });\n expect(payload.field.key).toBeTruthy();\n });\n\n it('appends a numeric suffix when the generated key collides with an existing field', async () => {\n const actions = createCmsFieldActions(COLLECTION_ID, () =>\n makeCollection([makeField({ key: 'newField' })]),\n );\n\n await actions.addField!(makePatternsField({ displayName: 'New Field' }));\n\n const [, payload] = createDataCollectionField.mock.calls[0];\n expect(payload.field.key).not.toBe('newField');\n });\n\n it('sets encrypted when isPii is true and description from helpText', async () => {\n const actions = createCmsFieldActions(COLLECTION_ID, () =>\n makeCollection([]),\n );\n\n await actions.addField!(\n makePatternsField({ isPii: true, helpText: 'Some hint' }),\n );\n\n const [, payload] = createDataCollectionField.mock.calls[0];\n expect(payload.field.encrypted).toBe(true);\n expect(payload.field.description).toBe('Some hint');\n });\n\n it('passes numberRange only when the field type is NUMBER', async () => {\n const actions = createCmsFieldActions(COLLECTION_ID, () =>\n makeCollection([]),\n );\n\n await actions.addField!(\n makePatternsField({\n type: 'NUMBER',\n validation: { required: false, numberRange: { min: 0, max: 10 } },\n }),\n );\n\n const [, payload] = createDataCollectionField.mock.calls[0];\n expect(payload.field.type).toBe(collections.Type.NUMBER);\n expect(payload.field.numberRange).toEqual({ min: 0, max: 10 });\n });\n\n it('ignores numberRange when the field type is not NUMBER', async () => {\n const actions = createCmsFieldActions(COLLECTION_ID, () =>\n makeCollection([]),\n );\n\n await actions.addField!(\n makePatternsField({\n type: 'SHORT_TEXT',\n validation: { required: false, numberRange: { min: 0, max: 10 } },\n }),\n );\n\n const [, payload] = createDataCollectionField.mock.calls[0];\n expect(payload.field.numberRange).toBeUndefined();\n });\n\n it('passes stringLengthRange only when the field type is SHORT_TEXT', async () => {\n const actions = createCmsFieldActions(COLLECTION_ID, () =>\n makeCollection([]),\n );\n\n await actions.addField!(\n makePatternsField({\n type: 'SHORT_TEXT',\n validation: {\n required: false,\n stringLengthRange: { minLength: 1, maxLength: 50 },\n },\n }),\n );\n\n const [, payload] = createDataCollectionField.mock.calls[0];\n expect(payload.field.stringLengthRange).toEqual({\n minLength: 1,\n maxLength: 50,\n });\n });\n\n it('throws when the patterns type has no CMS mapping', async () => {\n const actions = createCmsFieldActions(COLLECTION_ID, () =>\n makeCollection([]),\n );\n\n await expect(\n actions.addField!(makePatternsField({ type: 'IMAGE' })),\n ).rejects.toThrow('Field type IMAGE not supported yet');\n expect(createDataCollectionField).not.toHaveBeenCalled();\n });\n\n it('uses validation.required when provided', async () => {\n const actions = createCmsFieldActions(COLLECTION_ID, () =>\n makeCollection([]),\n );\n\n await actions.addField!(\n makePatternsField({ validation: { required: true } }),\n );\n\n const [, payload] = createDataCollectionField.mock.calls[0];\n expect(payload.field.required).toBe(true);\n });\n });\n\n describe('editField', () => {\n it('patches only displayName when only displayName is provided', async () => {\n const actions = createCmsFieldActions(COLLECTION_ID, () =>\n makeCollection([makeField({ key: 'name' })]),\n );\n\n await actions.editField!('name', { displayName: 'Renamed' });\n\n expect(patchDataCollectionField).toHaveBeenCalledWith(COLLECTION_ID, {\n key: 'name',\n displayName: 'Renamed',\n });\n });\n\n it('maps isPii to encrypted and helpText to description', async () => {\n const actions = createCmsFieldActions(COLLECTION_ID, () =>\n makeCollection([makeField({ key: 'name' })]),\n );\n\n await actions.editField!('name', { isPii: true, helpText: 'hint' });\n\n expect(patchDataCollectionField).toHaveBeenCalledWith(COLLECTION_ID, {\n key: 'name',\n encrypted: true,\n description: 'hint',\n });\n });\n\n it('includes numberRange in the patch only when the source CMS field is NUMBER', async () => {\n const actions = createCmsFieldActions(COLLECTION_ID, () =>\n makeCollection([\n makeField({ key: 'age', type: collections.Type.NUMBER }),\n ]),\n );\n\n await actions.editField!('age', {\n validation: { required: true, numberRange: { min: 0, max: 100 } },\n });\n\n expect(patchDataCollectionField).toHaveBeenCalledWith(COLLECTION_ID, {\n key: 'age',\n required: true,\n numberRange: { min: 0, max: 100 },\n });\n });\n\n it('omits numberRange when the source CMS field is not NUMBER', async () => {\n const actions = createCmsFieldActions(COLLECTION_ID, () =>\n makeCollection([\n makeField({ key: 'name', type: collections.Type.TEXT }),\n ]),\n );\n\n await actions.editField!('name', {\n validation: { required: true, numberRange: { min: 0, max: 100 } },\n });\n\n const [, patch] = patchDataCollectionField.mock.calls[0];\n expect(patch).not.toHaveProperty('numberRange');\n expect(patch).toMatchObject({ key: 'name', required: true });\n });\n\n it('includes stringLengthRange in the patch only when the source CMS field is TEXT', async () => {\n const actions = createCmsFieldActions(COLLECTION_ID, () =>\n makeCollection([\n makeField({ key: 'name', type: collections.Type.TEXT }),\n ]),\n );\n\n await actions.editField!('name', {\n validation: {\n required: false,\n stringLengthRange: { minLength: 1, maxLength: 30 },\n },\n });\n\n expect(patchDataCollectionField).toHaveBeenCalledWith(COLLECTION_ID, {\n key: 'name',\n required: false,\n stringLengthRange: { minLength: 1, maxLength: 30 },\n });\n });\n\n it('omits stringLengthRange when the source CMS field is not TEXT', async () => {\n const actions = createCmsFieldActions(COLLECTION_ID, () =>\n makeCollection([\n makeField({ key: 'age', type: collections.Type.NUMBER }),\n ]),\n );\n\n await actions.editField!('age', {\n validation: {\n required: false,\n stringLengthRange: { minLength: 1, maxLength: 30 },\n },\n });\n\n const [, patch] = patchDataCollectionField.mock.calls[0];\n expect(patch).not.toHaveProperty('stringLengthRange');\n });\n });\n\n describe('renameField', () => {\n it('patches the field displayName with the new name', async () => {\n const actions = createCmsFieldActions(COLLECTION_ID, () =>\n makeCollection([makeField({ key: 'name' })]),\n );\n\n await actions.renameField!('name', 'Renamed');\n\n expect(patchDataCollectionField).toHaveBeenCalledWith(COLLECTION_ID, {\n key: 'name',\n displayName: 'Renamed',\n });\n });\n });\n\n describe('deleteField', () => {\n it('calls collections.deleteDataCollectionField with the field key', async () => {\n const actions = createCmsFieldActions(COLLECTION_ID, () =>\n makeCollection([makeField({ key: 'toDelete' })]),\n );\n\n await actions.deleteField!('toDelete');\n\n expect(deleteDataCollectionField).toHaveBeenCalledTimes(1);\n expect(deleteDataCollectionField).toHaveBeenCalledWith(COLLECTION_ID, {\n fieldKey: 'toDelete',\n });\n });\n });\n\n describe('makePrimary', () => {\n it('patches the collection displayField with the given field id', async () => {\n const actions = createCmsFieldActions(COLLECTION_ID, () =>\n makeCollection([makeField({ key: 'newPrimary' })]),\n );\n\n await actions.makePrimary!('newPrimary');\n\n expect(patchDataCollection).toHaveBeenCalledTimes(1);\n expect(patchDataCollection).toHaveBeenCalledWith(COLLECTION_ID, {\n displayField: 'newPrimary',\n });\n });\n });\n\n describe('duplicateField', () => {\n it('clones the source field with a \"(Copy)\" suffix and a fresh key', async () => {\n const actions = createCmsFieldActions(COLLECTION_ID, () =>\n makeCollection([\n makeField({ key: 'sourceField', displayName: 'Source Field' }),\n ]),\n );\n\n await actions.duplicateField!('sourceField');\n\n expect(createDataCollectionField).toHaveBeenCalledTimes(1);\n const [calledCollectionId, payload] =\n createDataCollectionField.mock.calls[0];\n expect(calledCollectionId).toBe(COLLECTION_ID);\n expect(payload.field).toMatchObject({\n displayName: 'Source Field (Copy)',\n type: collections.Type.TEXT,\n });\n expect(payload.field.key).not.toBe('sourceField');\n });\n\n it('strips systemField and capabilities from the cloned field', async () => {\n const actions = createCmsFieldActions(COLLECTION_ID, () =>\n makeCollection([\n makeField({\n systemField: true,\n capabilities: {\n sortable: true,\n queryOperators: [collections.QueryOperator.EQ],\n },\n }),\n ]),\n );\n\n await actions.duplicateField!('sourceField');\n\n const [, payload] = createDataCollectionField.mock.calls[0];\n expect(payload.field).not.toHaveProperty('systemField');\n expect(payload.field).not.toHaveProperty('capabilities');\n });\n\n it('clears typeMetadata.multiReference.referencingFieldKey on clone', async () => {\n const sourceField: collections.Field = makeField({\n key: 'multiRef',\n displayName: 'Multi Ref',\n type: collections.Type.MULTI_REFERENCE,\n typeMetadata: {\n multiReference: {\n referencingFieldKey: 'someExistingKey',\n referencedCollectionId: 'other-collection',\n },\n },\n });\n\n const actions = createCmsFieldActions(COLLECTION_ID, () =>\n makeCollection([sourceField]),\n );\n\n await actions.duplicateField!('multiRef');\n\n const [, payload] = createDataCollectionField.mock.calls[0];\n expect(\n payload.field.typeMetadata?.multiReference?.referencingFieldKey,\n ).toBeUndefined();\n expect(\n payload.field.typeMetadata?.multiReference?.referencedCollectionId,\n ).toBe('other-collection');\n });\n\n it('appends a numeric suffix when the generated key collides with an existing field', async () => {\n const actions = createCmsFieldActions(COLLECTION_ID, () =>\n makeCollection([\n makeField({ key: 'sourceField', displayName: 'Source Field' }),\n makeField({ key: 'sourceFieldCopy' }),\n ]),\n );\n\n await actions.duplicateField!('sourceField');\n\n const [, payload] = createDataCollectionField.mock.calls[0];\n expect(payload.field.key).not.toBe('sourceField');\n expect(payload.field.key).not.toBe('sourceFieldCopy');\n });\n\n it('throws when the source field is not found', async () => {\n const actions = createCmsFieldActions(COLLECTION_ID, () =>\n makeCollection([]),\n );\n\n await expect(actions.duplicateField!('missing')).rejects.toThrow(\n 'Field missing not found',\n );\n expect(createDataCollectionField).not.toHaveBeenCalled();\n });\n });\n\n describe('duplicateFieldWithContent', () => {\n it('creates the cloned field, kicks off a COPY_FIELD_DATA task, and waits for completion', async () => {\n createTask.mockResolvedValue({ _id: 'task-1' });\n getTask.mockResolvedValue({ _id: 'task-1', status: 'COMPLETED' });\n\n const actions = createCmsFieldActions(COLLECTION_ID, () =>\n makeCollection([\n makeField({ key: 'sourceField', displayName: 'Source Field' }),\n ]),\n );\n\n await actions.duplicateFieldWithContent!('sourceField');\n\n expect(createDataCollectionField).toHaveBeenCalledTimes(1);\n const [, payload] = createDataCollectionField.mock.calls[0];\n const targetFieldKey = payload.field.key;\n\n expect(createTask).toHaveBeenCalledTimes(1);\n expect(createTask).toHaveBeenCalledWith({\n type: 'COPY_FIELD_DATA',\n copyFieldDataOptions: {\n dataCollectionId: COLLECTION_ID,\n sourceFieldKey: 'sourceField',\n targetFieldKey,\n },\n });\n expect(getTask).toHaveBeenCalledWith('task-1');\n });\n\n it('throws when the copy task reports FAILED, surfacing the failure code and description', async () => {\n createTask.mockResolvedValue({ _id: 'task-2' });\n getTask.mockResolvedValue({\n _id: 'task-2',\n status: 'FAILED',\n failures: [{ code: 'INTERNAL', description: 'Copy boom' }],\n });\n\n const actions = createCmsFieldActions(COLLECTION_ID, () =>\n makeCollection([makeField()]),\n );\n\n await expect(\n actions.duplicateFieldWithContent!('sourceField'),\n ).rejects.toThrow('INTERNAL: Copy boom');\n });\n\n it('throws when the source field is not found and never creates a task', async () => {\n const actions = createCmsFieldActions(COLLECTION_ID, () =>\n makeCollection([]),\n );\n\n await expect(\n actions.duplicateFieldWithContent!('missing'),\n ).rejects.toThrow('Field missing not found');\n expect(createDataCollectionField).not.toHaveBeenCalled();\n expect(createTask).not.toHaveBeenCalled();\n });\n });\n});\n"],"mappings":"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","ignoreList":[]}