@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,335 @@
1
+ import { collections, tasks } from '@wix/data';
2
+ import { createCmsFieldActions } from '../createCmsFieldActions';
3
+ jest.mock('@wix/data', () => {
4
+ const actual = jest.requireActual('@wix/data');
5
+ return {
6
+ ...actual,
7
+ collections: {
8
+ ...actual.collections,
9
+ createDataCollectionField: jest.fn(),
10
+ patchDataCollectionField: jest.fn(),
11
+ deleteDataCollectionField: jest.fn(),
12
+ patchDataCollection: jest.fn(),
13
+ },
14
+ tasks: {
15
+ ...actual.tasks,
16
+ createTask: jest.fn(),
17
+ getTask: jest.fn(),
18
+ },
19
+ };
20
+ });
21
+ // Typed accessors — the @wix/data SDK exposes overloaded callable types
22
+ // (MaybeContext<...>), and jest.Mocked<typeof collections> resolves to the
23
+ // HttpClient-form overload, which makes mockResolvedValue/mock.calls unusable.
24
+ // Re-typing each mock with the call shape the adapter uses unblocks both.
25
+ const createDataCollectionField = collections.createDataCollectionField;
26
+ const patchDataCollectionField = collections.patchDataCollectionField;
27
+ const deleteDataCollectionField = collections.deleteDataCollectionField;
28
+ const patchDataCollection = collections.patchDataCollection;
29
+ const createTask = tasks.createTask;
30
+ const getTask = tasks.getTask;
31
+ const COLLECTION_ID = 'collection-1';
32
+ const makeField = (overrides = {}) => ({
33
+ key: 'sourceField',
34
+ displayName: 'Source Field',
35
+ type: collections.Type.TEXT,
36
+ systemField: false,
37
+ encrypted: false,
38
+ ...overrides,
39
+ });
40
+ const makeCollection = (fields) => ({ _id: COLLECTION_ID, fields });
41
+ const makePatternsField = (overrides = {}) => {
42
+ const base = {
43
+ id: 'ignored-by-addField',
44
+ displayName: 'New Field',
45
+ type: 'SHORT_TEXT',
46
+ };
47
+ return { ...base, ...overrides };
48
+ };
49
+ describe('createCmsFieldActions', () => {
50
+ beforeEach(() => {
51
+ jest.clearAllMocks();
52
+ createDataCollectionField.mockResolvedValue(undefined);
53
+ deleteDataCollectionField.mockResolvedValue(undefined);
54
+ patchDataCollection.mockResolvedValue(undefined);
55
+ patchDataCollectionField.mockResolvedValue(undefined);
56
+ });
57
+ describe('addField', () => {
58
+ it('maps the patterns field type to the CMS type and derives the key from displayName', async () => {
59
+ const actions = createCmsFieldActions(COLLECTION_ID, () => makeCollection([]));
60
+ await actions.addField(makePatternsField({ displayName: 'My New Field' }));
61
+ const [calledCollectionId, payload] = createDataCollectionField.mock.calls[0];
62
+ expect(calledCollectionId).toBe(COLLECTION_ID);
63
+ expect(payload.field).toMatchObject({
64
+ displayName: 'My New Field',
65
+ type: collections.Type.TEXT,
66
+ required: false,
67
+ });
68
+ expect(payload.field.key).toBeTruthy();
69
+ });
70
+ it('appends a numeric suffix when the generated key collides with an existing field', async () => {
71
+ const actions = createCmsFieldActions(COLLECTION_ID, () => makeCollection([makeField({ key: 'newField' })]));
72
+ await actions.addField(makePatternsField({ displayName: 'New Field' }));
73
+ const [, payload] = createDataCollectionField.mock.calls[0];
74
+ expect(payload.field.key).not.toBe('newField');
75
+ });
76
+ it('sets encrypted when isPii is true and description from helpText', async () => {
77
+ const actions = createCmsFieldActions(COLLECTION_ID, () => makeCollection([]));
78
+ await actions.addField(makePatternsField({ isPii: true, helpText: 'Some hint' }));
79
+ const [, payload] = createDataCollectionField.mock.calls[0];
80
+ expect(payload.field.encrypted).toBe(true);
81
+ expect(payload.field.description).toBe('Some hint');
82
+ });
83
+ it('passes numberRange only when the field type is NUMBER', async () => {
84
+ const actions = createCmsFieldActions(COLLECTION_ID, () => makeCollection([]));
85
+ await actions.addField(makePatternsField({
86
+ type: 'NUMBER',
87
+ validation: { required: false, numberRange: { min: 0, max: 10 } },
88
+ }));
89
+ const [, payload] = createDataCollectionField.mock.calls[0];
90
+ expect(payload.field.type).toBe(collections.Type.NUMBER);
91
+ expect(payload.field.numberRange).toEqual({ min: 0, max: 10 });
92
+ });
93
+ it('ignores numberRange when the field type is not NUMBER', async () => {
94
+ const actions = createCmsFieldActions(COLLECTION_ID, () => makeCollection([]));
95
+ await actions.addField(makePatternsField({
96
+ type: 'SHORT_TEXT',
97
+ validation: { required: false, numberRange: { min: 0, max: 10 } },
98
+ }));
99
+ const [, payload] = createDataCollectionField.mock.calls[0];
100
+ expect(payload.field.numberRange).toBeUndefined();
101
+ });
102
+ it('passes stringLengthRange only when the field type is SHORT_TEXT', async () => {
103
+ const actions = createCmsFieldActions(COLLECTION_ID, () => makeCollection([]));
104
+ await actions.addField(makePatternsField({
105
+ type: 'SHORT_TEXT',
106
+ validation: {
107
+ required: false,
108
+ stringLengthRange: { minLength: 1, maxLength: 50 },
109
+ },
110
+ }));
111
+ const [, payload] = createDataCollectionField.mock.calls[0];
112
+ expect(payload.field.stringLengthRange).toEqual({
113
+ minLength: 1,
114
+ maxLength: 50,
115
+ });
116
+ });
117
+ it('throws when the patterns type has no CMS mapping', async () => {
118
+ const actions = createCmsFieldActions(COLLECTION_ID, () => makeCollection([]));
119
+ await expect(actions.addField(makePatternsField({ type: 'IMAGE' }))).rejects.toThrow('Field type IMAGE not supported yet');
120
+ expect(createDataCollectionField).not.toHaveBeenCalled();
121
+ });
122
+ it('uses validation.required when provided', async () => {
123
+ const actions = createCmsFieldActions(COLLECTION_ID, () => makeCollection([]));
124
+ await actions.addField(makePatternsField({ validation: { required: true } }));
125
+ const [, payload] = createDataCollectionField.mock.calls[0];
126
+ expect(payload.field.required).toBe(true);
127
+ });
128
+ });
129
+ describe('editField', () => {
130
+ it('patches only displayName when only displayName is provided', async () => {
131
+ const actions = createCmsFieldActions(COLLECTION_ID, () => makeCollection([makeField({ key: 'name' })]));
132
+ await actions.editField('name', { displayName: 'Renamed' });
133
+ expect(patchDataCollectionField).toHaveBeenCalledWith(COLLECTION_ID, {
134
+ key: 'name',
135
+ displayName: 'Renamed',
136
+ });
137
+ });
138
+ it('maps isPii to encrypted and helpText to description', async () => {
139
+ const actions = createCmsFieldActions(COLLECTION_ID, () => makeCollection([makeField({ key: 'name' })]));
140
+ await actions.editField('name', { isPii: true, helpText: 'hint' });
141
+ expect(patchDataCollectionField).toHaveBeenCalledWith(COLLECTION_ID, {
142
+ key: 'name',
143
+ encrypted: true,
144
+ description: 'hint',
145
+ });
146
+ });
147
+ it('includes numberRange in the patch only when the source CMS field is NUMBER', async () => {
148
+ const actions = createCmsFieldActions(COLLECTION_ID, () => makeCollection([
149
+ makeField({ key: 'age', type: collections.Type.NUMBER }),
150
+ ]));
151
+ await actions.editField('age', {
152
+ validation: { required: true, numberRange: { min: 0, max: 100 } },
153
+ });
154
+ expect(patchDataCollectionField).toHaveBeenCalledWith(COLLECTION_ID, {
155
+ key: 'age',
156
+ required: true,
157
+ numberRange: { min: 0, max: 100 },
158
+ });
159
+ });
160
+ it('omits numberRange when the source CMS field is not NUMBER', async () => {
161
+ const actions = createCmsFieldActions(COLLECTION_ID, () => makeCollection([
162
+ makeField({ key: 'name', type: collections.Type.TEXT }),
163
+ ]));
164
+ await actions.editField('name', {
165
+ validation: { required: true, numberRange: { min: 0, max: 100 } },
166
+ });
167
+ const [, patch] = patchDataCollectionField.mock.calls[0];
168
+ expect(patch).not.toHaveProperty('numberRange');
169
+ expect(patch).toMatchObject({ key: 'name', required: true });
170
+ });
171
+ it('includes stringLengthRange in the patch only when the source CMS field is TEXT', async () => {
172
+ const actions = createCmsFieldActions(COLLECTION_ID, () => makeCollection([
173
+ makeField({ key: 'name', type: collections.Type.TEXT }),
174
+ ]));
175
+ await actions.editField('name', {
176
+ validation: {
177
+ required: false,
178
+ stringLengthRange: { minLength: 1, maxLength: 30 },
179
+ },
180
+ });
181
+ expect(patchDataCollectionField).toHaveBeenCalledWith(COLLECTION_ID, {
182
+ key: 'name',
183
+ required: false,
184
+ stringLengthRange: { minLength: 1, maxLength: 30 },
185
+ });
186
+ });
187
+ it('omits stringLengthRange when the source CMS field is not TEXT', async () => {
188
+ const actions = createCmsFieldActions(COLLECTION_ID, () => makeCollection([
189
+ makeField({ key: 'age', type: collections.Type.NUMBER }),
190
+ ]));
191
+ await actions.editField('age', {
192
+ validation: {
193
+ required: false,
194
+ stringLengthRange: { minLength: 1, maxLength: 30 },
195
+ },
196
+ });
197
+ const [, patch] = patchDataCollectionField.mock.calls[0];
198
+ expect(patch).not.toHaveProperty('stringLengthRange');
199
+ });
200
+ });
201
+ describe('renameField', () => {
202
+ it('patches the field displayName with the new name', async () => {
203
+ const actions = createCmsFieldActions(COLLECTION_ID, () => makeCollection([makeField({ key: 'name' })]));
204
+ await actions.renameField('name', 'Renamed');
205
+ expect(patchDataCollectionField).toHaveBeenCalledWith(COLLECTION_ID, {
206
+ key: 'name',
207
+ displayName: 'Renamed',
208
+ });
209
+ });
210
+ });
211
+ describe('deleteField', () => {
212
+ it('calls collections.deleteDataCollectionField with the field key', async () => {
213
+ const actions = createCmsFieldActions(COLLECTION_ID, () => makeCollection([makeField({ key: 'toDelete' })]));
214
+ await actions.deleteField('toDelete');
215
+ expect(deleteDataCollectionField).toHaveBeenCalledTimes(1);
216
+ expect(deleteDataCollectionField).toHaveBeenCalledWith(COLLECTION_ID, {
217
+ fieldKey: 'toDelete',
218
+ });
219
+ });
220
+ });
221
+ describe('makePrimary', () => {
222
+ it('patches the collection displayField with the given field id', async () => {
223
+ const actions = createCmsFieldActions(COLLECTION_ID, () => makeCollection([makeField({ key: 'newPrimary' })]));
224
+ await actions.makePrimary('newPrimary');
225
+ expect(patchDataCollection).toHaveBeenCalledTimes(1);
226
+ expect(patchDataCollection).toHaveBeenCalledWith(COLLECTION_ID, {
227
+ displayField: 'newPrimary',
228
+ });
229
+ });
230
+ });
231
+ describe('duplicateField', () => {
232
+ it('clones the source field with a "(Copy)" suffix and a fresh key', async () => {
233
+ const actions = createCmsFieldActions(COLLECTION_ID, () => makeCollection([
234
+ makeField({ key: 'sourceField', displayName: 'Source Field' }),
235
+ ]));
236
+ await actions.duplicateField('sourceField');
237
+ expect(createDataCollectionField).toHaveBeenCalledTimes(1);
238
+ const [calledCollectionId, payload] = createDataCollectionField.mock.calls[0];
239
+ expect(calledCollectionId).toBe(COLLECTION_ID);
240
+ expect(payload.field).toMatchObject({
241
+ displayName: 'Source Field (Copy)',
242
+ type: collections.Type.TEXT,
243
+ });
244
+ expect(payload.field.key).not.toBe('sourceField');
245
+ });
246
+ it('strips systemField and capabilities from the cloned field', async () => {
247
+ const actions = createCmsFieldActions(COLLECTION_ID, () => makeCollection([
248
+ makeField({
249
+ systemField: true,
250
+ capabilities: {
251
+ sortable: true,
252
+ queryOperators: [collections.QueryOperator.EQ],
253
+ },
254
+ }),
255
+ ]));
256
+ await actions.duplicateField('sourceField');
257
+ const [, payload] = createDataCollectionField.mock.calls[0];
258
+ expect(payload.field).not.toHaveProperty('systemField');
259
+ expect(payload.field).not.toHaveProperty('capabilities');
260
+ });
261
+ it('clears typeMetadata.multiReference.referencingFieldKey on clone', async () => {
262
+ const sourceField = makeField({
263
+ key: 'multiRef',
264
+ displayName: 'Multi Ref',
265
+ type: collections.Type.MULTI_REFERENCE,
266
+ typeMetadata: {
267
+ multiReference: {
268
+ referencingFieldKey: 'someExistingKey',
269
+ referencedCollectionId: 'other-collection',
270
+ },
271
+ },
272
+ });
273
+ const actions = createCmsFieldActions(COLLECTION_ID, () => makeCollection([sourceField]));
274
+ await actions.duplicateField('multiRef');
275
+ const [, payload] = createDataCollectionField.mock.calls[0];
276
+ expect(payload.field.typeMetadata?.multiReference?.referencingFieldKey).toBeUndefined();
277
+ expect(payload.field.typeMetadata?.multiReference?.referencedCollectionId).toBe('other-collection');
278
+ });
279
+ it('appends a numeric suffix when the generated key collides with an existing field', async () => {
280
+ const actions = createCmsFieldActions(COLLECTION_ID, () => makeCollection([
281
+ makeField({ key: 'sourceField', displayName: 'Source Field' }),
282
+ makeField({ key: 'sourceFieldCopy' }),
283
+ ]));
284
+ await actions.duplicateField('sourceField');
285
+ const [, payload] = createDataCollectionField.mock.calls[0];
286
+ expect(payload.field.key).not.toBe('sourceField');
287
+ expect(payload.field.key).not.toBe('sourceFieldCopy');
288
+ });
289
+ it('throws when the source field is not found', async () => {
290
+ const actions = createCmsFieldActions(COLLECTION_ID, () => makeCollection([]));
291
+ await expect(actions.duplicateField('missing')).rejects.toThrow('Field missing not found');
292
+ expect(createDataCollectionField).not.toHaveBeenCalled();
293
+ });
294
+ });
295
+ describe('duplicateFieldWithContent', () => {
296
+ it('creates the cloned field, kicks off a COPY_FIELD_DATA task, and waits for completion', async () => {
297
+ createTask.mockResolvedValue({ _id: 'task-1' });
298
+ getTask.mockResolvedValue({ _id: 'task-1', status: 'COMPLETED' });
299
+ const actions = createCmsFieldActions(COLLECTION_ID, () => makeCollection([
300
+ makeField({ key: 'sourceField', displayName: 'Source Field' }),
301
+ ]));
302
+ await actions.duplicateFieldWithContent('sourceField');
303
+ expect(createDataCollectionField).toHaveBeenCalledTimes(1);
304
+ const [, payload] = createDataCollectionField.mock.calls[0];
305
+ const targetFieldKey = payload.field.key;
306
+ expect(createTask).toHaveBeenCalledTimes(1);
307
+ expect(createTask).toHaveBeenCalledWith({
308
+ type: 'COPY_FIELD_DATA',
309
+ copyFieldDataOptions: {
310
+ dataCollectionId: COLLECTION_ID,
311
+ sourceFieldKey: 'sourceField',
312
+ targetFieldKey,
313
+ },
314
+ });
315
+ expect(getTask).toHaveBeenCalledWith('task-1');
316
+ });
317
+ it('throws when the copy task reports FAILED, surfacing the failure code and description', async () => {
318
+ createTask.mockResolvedValue({ _id: 'task-2' });
319
+ getTask.mockResolvedValue({
320
+ _id: 'task-2',
321
+ status: 'FAILED',
322
+ failures: [{ code: 'INTERNAL', description: 'Copy boom' }],
323
+ });
324
+ const actions = createCmsFieldActions(COLLECTION_ID, () => makeCollection([makeField()]));
325
+ await expect(actions.duplicateFieldWithContent('sourceField')).rejects.toThrow('INTERNAL: Copy boom');
326
+ });
327
+ it('throws when the source field is not found and never creates a task', async () => {
328
+ const actions = createCmsFieldActions(COLLECTION_ID, () => makeCollection([]));
329
+ await expect(actions.duplicateFieldWithContent('missing')).rejects.toThrow('Field missing not found');
330
+ expect(createDataCollectionField).not.toHaveBeenCalled();
331
+ expect(createTask).not.toHaveBeenCalled();
332
+ });
333
+ });
334
+ });
335
+ //# sourceMappingURL=cmsFieldActions.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cmsFieldActions.spec.js","sourceRoot":"","sources":["../../../../src/adapter/__tests__/cmsFieldActions.spec.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,WAAW,CAAC;AAE/C,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AAEjE,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,EAAE;IAC1B,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC;IAC/C,OAAO;QACL,GAAG,MAAM;QACT,WAAW,EAAE;YACX,GAAG,MAAM,CAAC,WAAW;YACrB,yBAAyB,EAAE,IAAI,CAAC,EAAE,EAAE;YACpC,wBAAwB,EAAE,IAAI,CAAC,EAAE,EAAE;YACnC,yBAAyB,EAAE,IAAI,CAAC,EAAE,EAAE;YACpC,mBAAmB,EAAE,IAAI,CAAC,EAAE,EAAE;SAC/B;QACD,KAAK,EAAE;YACL,GAAG,MAAM,CAAC,KAAK;YACf,UAAU,EAAE,IAAI,CAAC,EAAE,EAAE;YACrB,OAAO,EAAE,IAAI,CAAC,EAAE,EAAE;SACnB;KACF,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,wEAAwE;AACxE,2EAA2E;AAC3E,+EAA+E;AAC/E,0EAA0E;AAC1E,MAAM,yBAAyB,GAC7B,WAAW,CAAC,yBAGX,CAAC;AACJ,MAAM,wBAAwB,GAC5B,WAAW,CAAC,wBAGX,CAAC;AACJ,MAAM,yBAAyB,GAC7B,WAAW,CAAC,yBAGX,CAAC;AACJ,MAAM,mBAAmB,GACvB,WAAW,CAAC,mBAGX,CAAC;AAQJ,MAAM,UAAU,GAAG,KAAK,CAAC,UAGxB,CAAC;AACF,MAAM,OAAO,GAAG,KAAK,CAAC,OAGrB,CAAC;AAEF,MAAM,aAAa,GAAG,cAAc,CAAC;AAErC,MAAM,SAAS,GAAG,CAChB,YAAwC,EAAE,EACvB,EAAE,CAAC,CAAC;IACvB,GAAG,EAAE,aAAa;IAClB,WAAW,EAAE,cAAc;IAC3B,IAAI,EAAE,WAAW,CAAC,IAAI,CAAC,IAAI;IAC3B,WAAW,EAAE,KAAK;IAClB,SAAS,EAAE,KAAK;IAChB,GAAG,SAAS;CACb,CAAC,CAAC;AAEH,MAAM,cAAc,GAAG,CACrB,MAA2B,EACC,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,aAAa,EAAE,MAAM,EAAE,CAAC,CAAC;AAElE,MAAM,iBAAiB,GAAG,CAAC,YAA4B,EAAE,EAAS,EAAE;IAClE,MAAM,IAAI,GAAU;QAClB,EAAE,EAAE,qBAAqB;QACzB,WAAW,EAAE,WAAW;QACxB,IAAI,EAAE,YAAY;KACnB,CAAC;IACF,OAAO,EAAE,GAAG,IAAI,EAAE,GAAG,SAAS,EAAW,CAAC;AAC5C,CAAC,CAAC;AAEF,QAAQ,CAAC,uBAAuB,EAAE,GAAG,EAAE;IACrC,UAAU,CAAC,GAAG,EAAE;QACd,IAAI,CAAC,aAAa,EAAE,CAAC;QACrB,yBAAyB,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC;QACvD,yBAAyB,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC;QACvD,mBAAmB,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC;QACjD,wBAAwB,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC;IACxD,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,UAAU,EAAE,GAAG,EAAE;QACxB,EAAE,CAAC,mFAAmF,EAAE,KAAK,IAAI,EAAE;YACjG,MAAM,OAAO,GAAG,qBAAqB,CAAC,aAAa,EAAE,GAAG,EAAE,CACxD,cAAc,CAAC,EAAE,CAAC,CACnB,CAAC;YAEF,MAAM,OAAO,CAAC,QAAS,CACrB,iBAAiB,CAAC,EAAE,WAAW,EAAE,cAAc,EAAE,CAAC,CACnD,CAAC;YAEF,MAAM,CAAC,kBAAkB,EAAE,OAAO,CAAC,GACjC,yBAAyB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAC1C,MAAM,CAAC,kBAAkB,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YAC/C,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,aAAa,CAAC;gBAClC,WAAW,EAAE,cAAc;gBAC3B,IAAI,EAAE,WAAW,CAAC,IAAI,CAAC,IAAI;gBAC3B,QAAQ,EAAE,KAAK;aAChB,CAAC,CAAC;YACH,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,UAAU,EAAE,CAAC;QACzC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,iFAAiF,EAAE,KAAK,IAAI,EAAE;YAC/F,MAAM,OAAO,GAAG,qBAAqB,CAAC,aAAa,EAAE,GAAG,EAAE,CACxD,cAAc,CAAC,CAAC,SAAS,CAAC,EAAE,GAAG,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,CACjD,CAAC;YAEF,MAAM,OAAO,CAAC,QAAS,CAAC,iBAAiB,CAAC,EAAE,WAAW,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC;YAEzE,MAAM,CAAC,EAAE,OAAO,CAAC,GAAG,yBAAyB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAC5D,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACjD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,iEAAiE,EAAE,KAAK,IAAI,EAAE;YAC/E,MAAM,OAAO,GAAG,qBAAqB,CAAC,aAAa,EAAE,GAAG,EAAE,CACxD,cAAc,CAAC,EAAE,CAAC,CACnB,CAAC;YAEF,MAAM,OAAO,CAAC,QAAS,CACrB,iBAAiB,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,CAAC,CAC1D,CAAC;YAEF,MAAM,CAAC,EAAE,OAAO,CAAC,GAAG,yBAAyB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAC5D,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC3C,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACtD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,uDAAuD,EAAE,KAAK,IAAI,EAAE;YACrE,MAAM,OAAO,GAAG,qBAAqB,CAAC,aAAa,EAAE,GAAG,EAAE,CACxD,cAAc,CAAC,EAAE,CAAC,CACnB,CAAC;YAEF,MAAM,OAAO,CAAC,QAAS,CACrB,iBAAiB,CAAC;gBAChB,IAAI,EAAE,QAAQ;gBACd,UAAU,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,WAAW,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE;aAClE,CAAC,CACH,CAAC;YAEF,MAAM,CAAC,EAAE,OAAO,CAAC,GAAG,yBAAyB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAC5D,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACzD,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,OAAO,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,CAAC;QACjE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,uDAAuD,EAAE,KAAK,IAAI,EAAE;YACrE,MAAM,OAAO,GAAG,qBAAqB,CAAC,aAAa,EAAE,GAAG,EAAE,CACxD,cAAc,CAAC,EAAE,CAAC,CACnB,CAAC;YAEF,MAAM,OAAO,CAAC,QAAS,CACrB,iBAAiB,CAAC;gBAChB,IAAI,EAAE,YAAY;gBAClB,UAAU,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,WAAW,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE;aAClE,CAAC,CACH,CAAC;YAEF,MAAM,CAAC,EAAE,OAAO,CAAC,GAAG,yBAAyB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAC5D,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,aAAa,EAAE,CAAC;QACpD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,iEAAiE,EAAE,KAAK,IAAI,EAAE;YAC/E,MAAM,OAAO,GAAG,qBAAqB,CAAC,aAAa,EAAE,GAAG,EAAE,CACxD,cAAc,CAAC,EAAE,CAAC,CACnB,CAAC;YAEF,MAAM,OAAO,CAAC,QAAS,CACrB,iBAAiB,CAAC;gBAChB,IAAI,EAAE,YAAY;gBAClB,UAAU,EAAE;oBACV,QAAQ,EAAE,KAAK;oBACf,iBAAiB,EAAE,EAAE,SAAS,EAAE,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE;iBACnD;aACF,CAAC,CACH,CAAC;YAEF,MAAM,CAAC,EAAE,OAAO,CAAC,GAAG,yBAAyB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAC5D,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC,OAAO,CAAC;gBAC9C,SAAS,EAAE,CAAC;gBACZ,SAAS,EAAE,EAAE;aACd,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,kDAAkD,EAAE,KAAK,IAAI,EAAE;YAChE,MAAM,OAAO,GAAG,qBAAqB,CAAC,aAAa,EAAE,GAAG,EAAE,CACxD,cAAc,CAAC,EAAE,CAAC,CACnB,CAAC;YAEF,MAAM,MAAM,CACV,OAAO,CAAC,QAAS,CAAC,iBAAiB,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC,CACxD,CAAC,OAAO,CAAC,OAAO,CAAC,oCAAoC,CAAC,CAAC;YACxD,MAAM,CAAC,yBAAyB,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;QAC3D,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,wCAAwC,EAAE,KAAK,IAAI,EAAE;YACtD,MAAM,OAAO,GAAG,qBAAqB,CAAC,aAAa,EAAE,GAAG,EAAE,CACxD,cAAc,CAAC,EAAE,CAAC,CACnB,CAAC;YAEF,MAAM,OAAO,CAAC,QAAS,CACrB,iBAAiB,CAAC,EAAE,UAAU,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE,CAAC,CACtD,CAAC;YAEF,MAAM,CAAC,EAAE,OAAO,CAAC,GAAG,yBAAyB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAC5D,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC5C,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,WAAW,EAAE,GAAG,EAAE;QACzB,EAAE,CAAC,4DAA4D,EAAE,KAAK,IAAI,EAAE;YAC1E,MAAM,OAAO,GAAG,qBAAqB,CAAC,aAAa,EAAE,GAAG,EAAE,CACxD,cAAc,CAAC,CAAC,SAAS,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,CAC7C,CAAC;YAEF,MAAM,OAAO,CAAC,SAAU,CAAC,MAAM,EAAE,EAAE,WAAW,EAAE,SAAS,EAAE,CAAC,CAAC;YAE7D,MAAM,CAAC,wBAAwB,CAAC,CAAC,oBAAoB,CAAC,aAAa,EAAE;gBACnE,GAAG,EAAE,MAAM;gBACX,WAAW,EAAE,SAAS;aACvB,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,qDAAqD,EAAE,KAAK,IAAI,EAAE;YACnE,MAAM,OAAO,GAAG,qBAAqB,CAAC,aAAa,EAAE,GAAG,EAAE,CACxD,cAAc,CAAC,CAAC,SAAS,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,CAC7C,CAAC;YAEF,MAAM,OAAO,CAAC,SAAU,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC;YAEpE,MAAM,CAAC,wBAAwB,CAAC,CAAC,oBAAoB,CAAC,aAAa,EAAE;gBACnE,GAAG,EAAE,MAAM;gBACX,SAAS,EAAE,IAAI;gBACf,WAAW,EAAE,MAAM;aACpB,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,4EAA4E,EAAE,KAAK,IAAI,EAAE;YAC1F,MAAM,OAAO,GAAG,qBAAqB,CAAC,aAAa,EAAE,GAAG,EAAE,CACxD,cAAc,CAAC;gBACb,SAAS,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;aACzD,CAAC,CACH,CAAC;YAEF,MAAM,OAAO,CAAC,SAAU,CAAC,KAAK,EAAE;gBAC9B,UAAU,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE;aAClE,CAAC,CAAC;YAEH,MAAM,CAAC,wBAAwB,CAAC,CAAC,oBAAoB,CAAC,aAAa,EAAE;gBACnE,GAAG,EAAE,KAAK;gBACV,QAAQ,EAAE,IAAI;gBACd,WAAW,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE;aAClC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,2DAA2D,EAAE,KAAK,IAAI,EAAE;YACzE,MAAM,OAAO,GAAG,qBAAqB,CAAC,aAAa,EAAE,GAAG,EAAE,CACxD,cAAc,CAAC;gBACb,SAAS,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;aACxD,CAAC,CACH,CAAC;YAEF,MAAM,OAAO,CAAC,SAAU,CAAC,MAAM,EAAE;gBAC/B,UAAU,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE;aAClE,CAAC,CAAC;YAEH,MAAM,CAAC,EAAE,KAAK,CAAC,GAAG,wBAAwB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YACzD,MAAM,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC;YAChD,MAAM,CAAC,KAAK,CAAC,CAAC,aAAa,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;QAC/D,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,gFAAgF,EAAE,KAAK,IAAI,EAAE;YAC9F,MAAM,OAAO,GAAG,qBAAqB,CAAC,aAAa,EAAE,GAAG,EAAE,CACxD,cAAc,CAAC;gBACb,SAAS,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;aACxD,CAAC,CACH,CAAC;YAEF,MAAM,OAAO,CAAC,SAAU,CAAC,MAAM,EAAE;gBAC/B,UAAU,EAAE;oBACV,QAAQ,EAAE,KAAK;oBACf,iBAAiB,EAAE,EAAE,SAAS,EAAE,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE;iBACnD;aACF,CAAC,CAAC;YAEH,MAAM,CAAC,wBAAwB,CAAC,CAAC,oBAAoB,CAAC,aAAa,EAAE;gBACnE,GAAG,EAAE,MAAM;gBACX,QAAQ,EAAE,KAAK;gBACf,iBAAiB,EAAE,EAAE,SAAS,EAAE,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE;aACnD,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,+DAA+D,EAAE,KAAK,IAAI,EAAE;YAC7E,MAAM,OAAO,GAAG,qBAAqB,CAAC,aAAa,EAAE,GAAG,EAAE,CACxD,cAAc,CAAC;gBACb,SAAS,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;aACzD,CAAC,CACH,CAAC;YAEF,MAAM,OAAO,CAAC,SAAU,CAAC,KAAK,EAAE;gBAC9B,UAAU,EAAE;oBACV,QAAQ,EAAE,KAAK;oBACf,iBAAiB,EAAE,EAAE,SAAS,EAAE,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE;iBACnD;aACF,CAAC,CAAC;YAEH,MAAM,CAAC,EAAE,KAAK,CAAC,GAAG,wBAAwB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YACzD,MAAM,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,cAAc,CAAC,mBAAmB,CAAC,CAAC;QACxD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE;QAC3B,EAAE,CAAC,iDAAiD,EAAE,KAAK,IAAI,EAAE;YAC/D,MAAM,OAAO,GAAG,qBAAqB,CAAC,aAAa,EAAE,GAAG,EAAE,CACxD,cAAc,CAAC,CAAC,SAAS,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,CAC7C,CAAC;YAEF,MAAM,OAAO,CAAC,WAAY,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;YAE9C,MAAM,CAAC,wBAAwB,CAAC,CAAC,oBAAoB,CAAC,aAAa,EAAE;gBACnE,GAAG,EAAE,MAAM;gBACX,WAAW,EAAE,SAAS;aACvB,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE;QAC3B,EAAE,CAAC,gEAAgE,EAAE,KAAK,IAAI,EAAE;YAC9E,MAAM,OAAO,GAAG,qBAAqB,CAAC,aAAa,EAAE,GAAG,EAAE,CACxD,cAAc,CAAC,CAAC,SAAS,CAAC,EAAE,GAAG,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,CACjD,CAAC;YAEF,MAAM,OAAO,CAAC,WAAY,CAAC,UAAU,CAAC,CAAC;YAEvC,MAAM,CAAC,yBAAyB,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;YAC3D,MAAM,CAAC,yBAAyB,CAAC,CAAC,oBAAoB,CAAC,aAAa,EAAE;gBACpE,QAAQ,EAAE,UAAU;aACrB,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE;QAC3B,EAAE,CAAC,6DAA6D,EAAE,KAAK,IAAI,EAAE;YAC3E,MAAM,OAAO,GAAG,qBAAqB,CAAC,aAAa,EAAE,GAAG,EAAE,CACxD,cAAc,CAAC,CAAC,SAAS,CAAC,EAAE,GAAG,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC,CACnD,CAAC;YAEF,MAAM,OAAO,CAAC,WAAY,CAAC,YAAY,CAAC,CAAC;YAEzC,MAAM,CAAC,mBAAmB,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;YACrD,MAAM,CAAC,mBAAmB,CAAC,CAAC,oBAAoB,CAAC,aAAa,EAAE;gBAC9D,YAAY,EAAE,YAAY;aAC3B,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;QAC9B,EAAE,CAAC,gEAAgE,EAAE,KAAK,IAAI,EAAE;YAC9E,MAAM,OAAO,GAAG,qBAAqB,CAAC,aAAa,EAAE,GAAG,EAAE,CACxD,cAAc,CAAC;gBACb,SAAS,CAAC,EAAE,GAAG,EAAE,aAAa,EAAE,WAAW,EAAE,cAAc,EAAE,CAAC;aAC/D,CAAC,CACH,CAAC;YAEF,MAAM,OAAO,CAAC,cAAe,CAAC,aAAa,CAAC,CAAC;YAE7C,MAAM,CAAC,yBAAyB,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;YAC3D,MAAM,CAAC,kBAAkB,EAAE,OAAO,CAAC,GACjC,yBAAyB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAC1C,MAAM,CAAC,kBAAkB,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YAC/C,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,aAAa,CAAC;gBAClC,WAAW,EAAE,qBAAqB;gBAClC,IAAI,EAAE,WAAW,CAAC,IAAI,CAAC,IAAI;aAC5B,CAAC,CAAC;YACH,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QACpD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,2DAA2D,EAAE,KAAK,IAAI,EAAE;YACzE,MAAM,OAAO,GAAG,qBAAqB,CAAC,aAAa,EAAE,GAAG,EAAE,CACxD,cAAc,CAAC;gBACb,SAAS,CAAC;oBACR,WAAW,EAAE,IAAI;oBACjB,YAAY,EAAE;wBACZ,QAAQ,EAAE,IAAI;wBACd,cAAc,EAAE,CAAC,WAAW,CAAC,aAAa,CAAC,EAAE,CAAC;qBAC/C;iBACF,CAAC;aACH,CAAC,CACH,CAAC;YAEF,MAAM,OAAO,CAAC,cAAe,CAAC,aAAa,CAAC,CAAC;YAE7C,MAAM,CAAC,EAAE,OAAO,CAAC,GAAG,yBAAyB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAC5D,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC;YACxD,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,cAAc,CAAC,cAAc,CAAC,CAAC;QAC3D,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,iEAAiE,EAAE,KAAK,IAAI,EAAE;YAC/E,MAAM,WAAW,GAAsB,SAAS,CAAC;gBAC/C,GAAG,EAAE,UAAU;gBACf,WAAW,EAAE,WAAW;gBACxB,IAAI,EAAE,WAAW,CAAC,IAAI,CAAC,eAAe;gBACtC,YAAY,EAAE;oBACZ,cAAc,EAAE;wBACd,mBAAmB,EAAE,iBAAiB;wBACtC,sBAAsB,EAAE,kBAAkB;qBAC3C;iBACF;aACF,CAAC,CAAC;YAEH,MAAM,OAAO,GAAG,qBAAqB,CAAC,aAAa,EAAE,GAAG,EAAE,CACxD,cAAc,CAAC,CAAC,WAAW,CAAC,CAAC,CAC9B,CAAC;YAEF,MAAM,OAAO,CAAC,cAAe,CAAC,UAAU,CAAC,CAAC;YAE1C,MAAM,CAAC,EAAE,OAAO,CAAC,GAAG,yBAAyB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAC5D,MAAM,CACJ,OAAO,CAAC,KAAK,CAAC,YAAY,EAAE,cAAc,EAAE,mBAAmB,CAChE,CAAC,aAAa,EAAE,CAAC;YAClB,MAAM,CACJ,OAAO,CAAC,KAAK,CAAC,YAAY,EAAE,cAAc,EAAE,sBAAsB,CACnE,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;QAC7B,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,iFAAiF,EAAE,KAAK,IAAI,EAAE;YAC/F,MAAM,OAAO,GAAG,qBAAqB,CAAC,aAAa,EAAE,GAAG,EAAE,CACxD,cAAc,CAAC;gBACb,SAAS,CAAC,EAAE,GAAG,EAAE,aAAa,EAAE,WAAW,EAAE,cAAc,EAAE,CAAC;gBAC9D,SAAS,CAAC,EAAE,GAAG,EAAE,iBAAiB,EAAE,CAAC;aACtC,CAAC,CACH,CAAC;YAEF,MAAM,OAAO,CAAC,cAAe,CAAC,aAAa,CAAC,CAAC;YAE7C,MAAM,CAAC,EAAE,OAAO,CAAC,GAAG,yBAAyB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAC5D,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YAClD,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;QACxD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,2CAA2C,EAAE,KAAK,IAAI,EAAE;YACzD,MAAM,OAAO,GAAG,qBAAqB,CAAC,aAAa,EAAE,GAAG,EAAE,CACxD,cAAc,CAAC,EAAE,CAAC,CACnB,CAAC;YAEF,MAAM,MAAM,CAAC,OAAO,CAAC,cAAe,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAC9D,yBAAyB,CAC1B,CAAC;YACF,MAAM,CAAC,yBAAyB,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;QAC3D,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,2BAA2B,EAAE,GAAG,EAAE;QACzC,EAAE,CAAC,sFAAsF,EAAE,KAAK,IAAI,EAAE;YACpG,UAAU,CAAC,iBAAiB,CAAC,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC,CAAC;YAChD,OAAO,CAAC,iBAAiB,CAAC,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC,CAAC;YAElE,MAAM,OAAO,GAAG,qBAAqB,CAAC,aAAa,EAAE,GAAG,EAAE,CACxD,cAAc,CAAC;gBACb,SAAS,CAAC,EAAE,GAAG,EAAE,aAAa,EAAE,WAAW,EAAE,cAAc,EAAE,CAAC;aAC/D,CAAC,CACH,CAAC;YAEF,MAAM,OAAO,CAAC,yBAA0B,CAAC,aAAa,CAAC,CAAC;YAExD,MAAM,CAAC,yBAAyB,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;YAC3D,MAAM,CAAC,EAAE,OAAO,CAAC,GAAG,yBAAyB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAC5D,MAAM,cAAc,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC;YAEzC,MAAM,CAAC,UAAU,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;YAC5C,MAAM,CAAC,UAAU,CAAC,CAAC,oBAAoB,CAAC;gBACtC,IAAI,EAAE,iBAAiB;gBACvB,oBAAoB,EAAE;oBACpB,gBAAgB,EAAE,aAAa;oBAC/B,cAAc,EAAE,aAAa;oBAC7B,cAAc;iBACf;aACF,CAAC,CAAC;YACH,MAAM,CAAC,OAAO,CAAC,CAAC,oBAAoB,CAAC,QAAQ,CAAC,CAAC;QACjD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,sFAAsF,EAAE,KAAK,IAAI,EAAE;YACpG,UAAU,CAAC,iBAAiB,CAAC,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC,CAAC;YAChD,OAAO,CAAC,iBAAiB,CAAC;gBACxB,GAAG,EAAE,QAAQ;gBACb,MAAM,EAAE,QAAQ;gBAChB,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,WAAW,EAAE,WAAW,EAAE,CAAC;aAC3D,CAAC,CAAC;YAEH,MAAM,OAAO,GAAG,qBAAqB,CAAC,aAAa,EAAE,GAAG,EAAE,CACxD,cAAc,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,CAC9B,CAAC;YAEF,MAAM,MAAM,CACV,OAAO,CAAC,yBAA0B,CAAC,aAAa,CAAC,CAClD,CAAC,OAAO,CAAC,OAAO,CAAC,qBAAqB,CAAC,CAAC;QAC3C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,oEAAoE,EAAE,KAAK,IAAI,EAAE;YAClF,MAAM,OAAO,GAAG,qBAAqB,CAAC,aAAa,EAAE,GAAG,EAAE,CACxD,cAAc,CAAC,EAAE,CAAC,CACnB,CAAC;YAEF,MAAM,MAAM,CACV,OAAO,CAAC,yBAA0B,CAAC,SAAS,CAAC,CAC9C,CAAC,OAAO,CAAC,OAAO,CAAC,yBAAyB,CAAC,CAAC;YAC7C,MAAM,CAAC,yBAAyB,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;YACzD,MAAM,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;QAC5C,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,173 @@
1
+ import { computeCmsPermissions } from '../cmsPermissions';
2
+ const WIX_STORES = '1380b703-ce81-ff05-f115-39571d94dfcd';
3
+ const SITE_MEMBERS = 'SiteMembers';
4
+ const FORM_APP = '225dd912-7dea-4738-8688-4b8c6955ffc2';
5
+ const WIX_DATA = {
6
+ CREATE_FIELD: 'WIX_DATA.CREATE_COLLECTION_FIELD',
7
+ UPDATE_FIELD: 'WIX_DATA.UPDATE_COLLECTION_FIELD',
8
+ DELETE_FIELD: 'WIX_DATA.DELETE_COLLECTION_FIELD',
9
+ INSERT: 'WIX_DATA.INSERT',
10
+ UPDATE: 'WIX_DATA.UPDATE',
11
+ REMOVE: 'WIX_DATA.REMOVE',
12
+ };
13
+ const ALL_FIELD_PERMS = [
14
+ WIX_DATA.CREATE_FIELD,
15
+ WIX_DATA.UPDATE_FIELD,
16
+ WIX_DATA.DELETE_FIELD,
17
+ ];
18
+ const ALL_PERMS = [
19
+ ...ALL_FIELD_PERMS,
20
+ WIX_DATA.INSERT,
21
+ WIX_DATA.UPDATE,
22
+ WIX_DATA.REMOVE,
23
+ ];
24
+ const makeSchema = (overrides = {}) => {
25
+ const base = {
26
+ _id: 'col-1',
27
+ collectionType: 'NATIVE',
28
+ capabilities: { dataOperations: ['SAVE', 'UPDATE', 'REMOVE'] },
29
+ permissions: {
30
+ read: 'ANYONE',
31
+ insert: 'SITE_MEMBER',
32
+ update: 'SITE_MEMBER',
33
+ remove: 'SITE_MEMBER',
34
+ },
35
+ plugins: [],
36
+ };
37
+ return { ...base, ...overrides };
38
+ };
39
+ describe('computeCmsPermissions', () => {
40
+ it('shared collection: schema not editable, no item permissions', () => {
41
+ const schema = makeSchema({
42
+ plugins: [{ type: 'SHARED' }],
43
+ });
44
+ const result = computeCmsPermissions(schema, ALL_PERMS, []);
45
+ // patterns-cms returns `schemaPermissions: undefined` (NOT an isSchemaEditable boolean)
46
+ // when the schema is not structurally editable.
47
+ expect(result.schemaPermissions).toBeUndefined();
48
+ expect(result.itemPermissions).toEqual({
49
+ createItem: false,
50
+ updateItem: false,
51
+ deleteItem: false,
52
+ });
53
+ });
54
+ it('Wix-app collection (Stores): item permissions all false', () => {
55
+ const schema = makeSchema({
56
+ collectionType: 'WIX_APP',
57
+ ownerAppId: WIX_STORES,
58
+ });
59
+ const result = computeCmsPermissions(schema, ALL_PERMS, []);
60
+ expect(result.itemPermissions).toEqual({
61
+ createItem: false,
62
+ updateItem: false,
63
+ deleteItem: false,
64
+ });
65
+ });
66
+ it('Wix-app SiteMembers: NOT treated as readonly', () => {
67
+ const schema = makeSchema({
68
+ collectionType: 'WIX_APP',
69
+ ownerAppId: SITE_MEMBERS,
70
+ });
71
+ const result = computeCmsPermissions(schema, ALL_PERMS, []);
72
+ expect(result.itemPermissions.createItem).toBe(true);
73
+ expect(result.itemPermissions.updateItem).toBe(true);
74
+ expect(result.itemPermissions.deleteItem).toBe(true);
75
+ });
76
+ it('Wix-app Forms collection: NOT treated as readonly', () => {
77
+ const schema = makeSchema({
78
+ collectionType: 'WIX_APP',
79
+ ownerAppId: FORM_APP,
80
+ });
81
+ const result = computeCmsPermissions(schema, ALL_PERMS, []);
82
+ expect(result.itemPermissions.createItem).toBe(true);
83
+ expect(result.itemPermissions.updateItem).toBe(true);
84
+ expect(result.itemPermissions.deleteItem).toBe(true);
85
+ });
86
+ it('NATIVE collection with full ABAC + roles: all permissions granted', () => {
87
+ const schema = makeSchema();
88
+ const result = computeCmsPermissions(schema, ALL_PERMS, []);
89
+ // Structurally editable → schemaPermissions is defined.
90
+ expect(result.schemaPermissions).toEqual({
91
+ createField: true,
92
+ updateField: true,
93
+ deleteField: true,
94
+ });
95
+ expect(result.itemPermissions).toEqual({
96
+ createItem: true,
97
+ updateItem: true,
98
+ deleteItem: true,
99
+ });
100
+ });
101
+ it("role 'ANYONE' bypasses ABAC for update/remove but NOT for insert", () => {
102
+ const schema = makeSchema({
103
+ permissions: {
104
+ read: 'ANYONE',
105
+ insert: 'ANYONE',
106
+ update: 'ANYONE',
107
+ remove: 'ANYONE',
108
+ },
109
+ });
110
+ // User has ZERO ABAC permissions.
111
+ const result = computeCmsPermissions(schema, [], []);
112
+ // Insert intentionally does NOT honor ANYONE bypass (cms-web parity).
113
+ expect(result.itemPermissions.createItem).toBe(false);
114
+ expect(result.itemPermissions.updateItem).toBe(true);
115
+ expect(result.itemPermissions.deleteItem).toBe(true);
116
+ });
117
+ it('allowedDataPermissions.itemRemove === false overrides role grant', () => {
118
+ const schema = makeSchema({
119
+ allowedDataPermissions: { itemRemove: false },
120
+ });
121
+ const result = computeCmsPermissions(schema, ALL_PERMS, []);
122
+ expect(result.itemPermissions.deleteItem).toBe(false);
123
+ expect(result.itemPermissions.updateItem).toBe(true);
124
+ expect(result.itemPermissions.createItem).toBe(true);
125
+ });
126
+ it('EXTERNAL collection with no matching connection: schema not editable', () => {
127
+ const schema = makeSchema({
128
+ _id: 'mydb/products',
129
+ collectionType: 'EXTERNAL',
130
+ });
131
+ const result = computeCmsPermissions(schema, ALL_PERMS, []);
132
+ expect(result.schemaPermissions).toBeUndefined();
133
+ });
134
+ it('EXTERNAL collection with capable connection: schema editable', () => {
135
+ const schema = makeSchema({
136
+ _id: 'mydb/products',
137
+ collectionType: 'EXTERNAL',
138
+ });
139
+ const connections = [
140
+ {
141
+ namespace: 'mydb',
142
+ capabilities: {
143
+ collectionModificationsSupported: true,
144
+ fieldTypes: ['TEXT', 'NUMBER'],
145
+ },
146
+ },
147
+ ];
148
+ const result = computeCmsPermissions(schema, ALL_PERMS, connections);
149
+ expect(result.schemaPermissions).toEqual({
150
+ createField: true,
151
+ updateField: true,
152
+ deleteField: true,
153
+ });
154
+ });
155
+ it('NATIVE editable but missing field-management ABAC: schemaPermissions all false', () => {
156
+ const schema = makeSchema();
157
+ const userPermissions = [
158
+ WIX_DATA.INSERT,
159
+ WIX_DATA.UPDATE,
160
+ WIX_DATA.REMOVE,
161
+ // Note: no field-management perms.
162
+ ];
163
+ const result = computeCmsPermissions(schema, userPermissions, []);
164
+ // Schema is editable so schemaPermissions is defined, but each flag is false
165
+ // because the user lacks field-management ABAC.
166
+ expect(result.schemaPermissions).toEqual({
167
+ createField: false,
168
+ updateField: false,
169
+ deleteField: false,
170
+ });
171
+ });
172
+ });
173
+ //# sourceMappingURL=cmsPermissions.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cmsPermissions.spec.js","sourceRoot":"","sources":["../../../../src/adapter/__tests__/cmsPermissions.spec.ts"],"names":[],"mappings":"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"}