@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.
- package/dist/cjs/adapter/__tests__/cmsFieldActions.spec.js +436 -0
- package/dist/cjs/adapter/__tests__/cmsFieldActions.spec.js.map +1 -0
- package/dist/cjs/adapter/__tests__/cmsPermissions.spec.js +175 -0
- package/dist/cjs/adapter/__tests__/cmsPermissions.spec.js.map +1 -0
- package/dist/cjs/adapter/__tests__/createCmsBackend.spec.js +440 -0
- package/dist/cjs/adapter/__tests__/createCmsBackend.spec.js.map +1 -0
- package/dist/cjs/adapter/__tests__/filterUtils.spec.js +426 -0
- package/dist/cjs/adapter/__tests__/filterUtils.spec.js.map +1 -0
- package/dist/cjs/adapter/__tests__/getFieldKey.spec.js +24 -0
- package/dist/cjs/adapter/__tests__/getFieldKey.spec.js.map +1 -0
- package/dist/cjs/adapter/__tests__/loadCmsSchema.spec.js +166 -0
- package/dist/cjs/adapter/__tests__/loadCmsSchema.spec.js.map +1 -0
- package/dist/cjs/adapter/__tests__/searchUtils.spec.js +116 -0
- package/dist/cjs/adapter/__tests__/searchUtils.spec.js.map +1 -0
- package/dist/cjs/adapter/__tests__/sortUtils.spec.js +118 -0
- package/dist/cjs/adapter/__tests__/sortUtils.spec.js.map +1 -0
- package/dist/cjs/adapter/__tests__/transformCmsSchema.spec.js +210 -0
- package/dist/cjs/adapter/__tests__/transformCmsSchema.spec.js.map +1 -0
- package/dist/cjs/adapter/__tests__/wixDataQueryRecorder.js +54 -0
- package/dist/cjs/adapter/__tests__/wixDataQueryRecorder.js.map +1 -0
- package/dist/cjs/adapter/cmsBackup.js +52 -0
- package/dist/cjs/adapter/cmsBackup.js.map +1 -0
- package/dist/cjs/adapter/cmsFieldTypeMap.js +43 -0
- package/dist/cjs/adapter/cmsFieldTypeMap.js.map +1 -0
- package/dist/cjs/adapter/cmsPermissions.js +94 -0
- package/dist/cjs/adapter/cmsPermissions.js.map +1 -0
- package/dist/cjs/adapter/constants.js +20 -0
- package/dist/cjs/adapter/constants.js.map +1 -0
- package/dist/cjs/adapter/createCmsBackend.js +131 -0
- package/dist/cjs/adapter/createCmsBackend.js.map +1 -0
- package/dist/cjs/adapter/createCmsFieldActions.js +182 -0
- package/dist/cjs/adapter/createCmsFieldActions.js.map +1 -0
- package/dist/cjs/adapter/fetchExternalDbConnections.js +24 -0
- package/dist/cjs/adapter/fetchExternalDbConnections.js.map +1 -0
- package/dist/cjs/adapter/fetchUserPermissions.js +24 -0
- package/dist/cjs/adapter/fetchUserPermissions.js.map +1 -0
- package/dist/cjs/adapter/filterUtils.js +128 -0
- package/dist/cjs/adapter/filterUtils.js.map +1 -0
- package/dist/cjs/adapter/getFieldKey.js +19 -0
- package/dist/cjs/adapter/getFieldKey.js.map +1 -0
- package/dist/cjs/adapter/index.js +36 -0
- package/dist/cjs/adapter/index.js.map +1 -0
- package/dist/cjs/adapter/loadCmsSchema.js +51 -0
- package/dist/cjs/adapter/loadCmsSchema.js.map +1 -0
- package/dist/cjs/adapter/pollUntilReady.js +30 -0
- package/dist/cjs/adapter/pollUntilReady.js.map +1 -0
- package/dist/cjs/adapter/searchUtils.js +32 -0
- package/dist/cjs/adapter/searchUtils.js.map +1 -0
- package/dist/cjs/adapter/sortUtils.js +34 -0
- package/dist/cjs/adapter/sortUtils.js.map +1 -0
- package/dist/cjs/adapter/transformCmsSchema.js +75 -0
- package/dist/cjs/adapter/transformCmsSchema.js.map +1 -0
- package/dist/cjs/index.js +10 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/esm/adapter/__tests__/cmsFieldActions.spec.js +335 -0
- package/dist/esm/adapter/__tests__/cmsFieldActions.spec.js.map +1 -0
- package/dist/esm/adapter/__tests__/cmsPermissions.spec.js +173 -0
- package/dist/esm/adapter/__tests__/cmsPermissions.spec.js.map +1 -0
- package/dist/esm/adapter/__tests__/createCmsBackend.spec.js +307 -0
- package/dist/esm/adapter/__tests__/createCmsBackend.spec.js.map +1 -0
- package/dist/esm/adapter/__tests__/filterUtils.spec.js +298 -0
- package/dist/esm/adapter/__tests__/filterUtils.spec.js.map +1 -0
- package/dist/esm/adapter/__tests__/getFieldKey.spec.js +22 -0
- package/dist/esm/adapter/__tests__/getFieldKey.spec.js.map +1 -0
- package/dist/esm/adapter/__tests__/loadCmsSchema.spec.js +147 -0
- package/dist/esm/adapter/__tests__/loadCmsSchema.spec.js.map +1 -0
- package/dist/esm/adapter/__tests__/searchUtils.spec.js +109 -0
- package/dist/esm/adapter/__tests__/searchUtils.spec.js.map +1 -0
- package/dist/esm/adapter/__tests__/sortUtils.spec.js +85 -0
- package/dist/esm/adapter/__tests__/sortUtils.spec.js.map +1 -0
- package/dist/esm/adapter/__tests__/transformCmsSchema.spec.js +201 -0
- package/dist/esm/adapter/__tests__/transformCmsSchema.spec.js.map +1 -0
- package/dist/esm/adapter/__tests__/wixDataQueryRecorder.js +42 -0
- package/dist/esm/adapter/__tests__/wixDataQueryRecorder.js.map +1 -0
- package/dist/esm/adapter/cmsBackup.js +34 -0
- package/dist/esm/adapter/cmsBackup.js.map +1 -0
- package/dist/esm/adapter/cmsFieldTypeMap.js +37 -0
- package/dist/esm/adapter/cmsFieldTypeMap.js.map +1 -0
- package/dist/esm/adapter/cmsPermissions.js +91 -0
- package/dist/esm/adapter/cmsPermissions.js.map +1 -0
- package/dist/esm/adapter/constants.js +25 -0
- package/dist/esm/adapter/constants.js.map +1 -0
- package/dist/esm/adapter/createCmsBackend.js +113 -0
- package/dist/esm/adapter/createCmsBackend.js.map +1 -0
- package/dist/esm/adapter/createCmsFieldActions.js +159 -0
- package/dist/esm/adapter/createCmsFieldActions.js.map +1 -0
- package/dist/esm/adapter/fetchExternalDbConnections.js +17 -0
- package/dist/esm/adapter/fetchExternalDbConnections.js.map +1 -0
- package/dist/esm/adapter/fetchUserPermissions.js +15 -0
- package/dist/esm/adapter/fetchUserPermissions.js.map +1 -0
- package/dist/esm/adapter/filterUtils.js +126 -0
- package/dist/esm/adapter/filterUtils.js.map +1 -0
- package/dist/esm/adapter/getFieldKey.js +13 -0
- package/dist/esm/adapter/getFieldKey.js.map +1 -0
- package/dist/esm/adapter/index.js +15 -0
- package/dist/esm/adapter/index.js.map +1 -0
- package/dist/esm/adapter/loadCmsSchema.js +48 -0
- package/dist/esm/adapter/loadCmsSchema.js.map +1 -0
- package/dist/esm/adapter/pollUntilReady.js +24 -0
- package/dist/esm/adapter/pollUntilReady.js.map +1 -0
- package/dist/esm/adapter/searchUtils.js +24 -0
- package/dist/esm/adapter/searchUtils.js.map +1 -0
- package/dist/esm/adapter/sortUtils.js +21 -0
- package/dist/esm/adapter/sortUtils.js.map +1 -0
- package/dist/esm/adapter/transformCmsSchema.js +70 -0
- package/dist/esm/adapter/transformCmsSchema.js.map +1 -0
- package/dist/esm/index.js +2 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/types/adapter/__tests__/cmsFieldActions.spec.d.ts +2 -0
- package/dist/types/adapter/__tests__/cmsFieldActions.spec.d.ts.map +1 -0
- package/dist/types/adapter/__tests__/cmsPermissions.spec.d.ts +2 -0
- package/dist/types/adapter/__tests__/cmsPermissions.spec.d.ts.map +1 -0
- package/dist/types/adapter/__tests__/createCmsBackend.spec.d.ts +2 -0
- package/dist/types/adapter/__tests__/createCmsBackend.spec.d.ts.map +1 -0
- package/dist/types/adapter/__tests__/filterUtils.spec.d.ts +2 -0
- package/dist/types/adapter/__tests__/filterUtils.spec.d.ts.map +1 -0
- package/dist/types/adapter/__tests__/getFieldKey.spec.d.ts +2 -0
- package/dist/types/adapter/__tests__/getFieldKey.spec.d.ts.map +1 -0
- package/dist/types/adapter/__tests__/loadCmsSchema.spec.d.ts +2 -0
- package/dist/types/adapter/__tests__/loadCmsSchema.spec.d.ts.map +1 -0
- package/dist/types/adapter/__tests__/searchUtils.spec.d.ts +2 -0
- package/dist/types/adapter/__tests__/searchUtils.spec.d.ts.map +1 -0
- package/dist/types/adapter/__tests__/sortUtils.spec.d.ts +2 -0
- package/dist/types/adapter/__tests__/sortUtils.spec.d.ts.map +1 -0
- package/dist/types/adapter/__tests__/transformCmsSchema.spec.d.ts +2 -0
- package/dist/types/adapter/__tests__/transformCmsSchema.spec.d.ts.map +1 -0
- package/dist/types/adapter/__tests__/wixDataQueryRecorder.d.ts +40 -0
- package/dist/types/adapter/__tests__/wixDataQueryRecorder.d.ts.map +1 -0
- package/dist/types/adapter/cmsBackup.d.ts +7 -0
- package/dist/types/adapter/cmsBackup.d.ts.map +1 -0
- package/dist/types/adapter/cmsFieldTypeMap.d.ts +8 -0
- package/dist/types/adapter/cmsFieldTypeMap.d.ts.map +1 -0
- package/dist/types/adapter/cmsPermissions.d.ts +21 -0
- package/dist/types/adapter/cmsPermissions.d.ts.map +1 -0
- package/dist/types/adapter/constants.d.ts +14 -0
- package/dist/types/adapter/constants.d.ts.map +1 -0
- package/dist/types/adapter/createCmsBackend.d.ts +9 -0
- package/dist/types/adapter/createCmsBackend.d.ts.map +1 -0
- package/dist/types/adapter/createCmsFieldActions.d.ts +8 -0
- package/dist/types/adapter/createCmsFieldActions.d.ts.map +1 -0
- package/dist/types/adapter/fetchExternalDbConnections.d.ts +11 -0
- package/dist/types/adapter/fetchExternalDbConnections.d.ts.map +1 -0
- package/dist/types/adapter/fetchUserPermissions.d.ts +7 -0
- package/dist/types/adapter/fetchUserPermissions.d.ts.map +1 -0
- package/dist/types/adapter/filterUtils.d.ts +14 -0
- package/dist/types/adapter/filterUtils.d.ts.map +1 -0
- package/dist/types/adapter/getFieldKey.d.ts +3 -0
- package/dist/types/adapter/getFieldKey.d.ts.map +1 -0
- package/dist/types/adapter/index.d.ts +15 -0
- package/dist/types/adapter/index.d.ts.map +1 -0
- package/dist/types/adapter/loadCmsSchema.d.ts +29 -0
- package/dist/types/adapter/loadCmsSchema.d.ts.map +1 -0
- package/dist/types/adapter/pollUntilReady.d.ts +11 -0
- package/dist/types/adapter/pollUntilReady.d.ts.map +1 -0
- package/dist/types/adapter/searchUtils.d.ts +12 -0
- package/dist/types/adapter/searchUtils.d.ts.map +1 -0
- package/dist/types/adapter/sortUtils.d.ts +11 -0
- package/dist/types/adapter/sortUtils.d.ts.map +1 -0
- package/dist/types/adapter/transformCmsSchema.d.ts +12 -0
- package/dist/types/adapter/transformCmsSchema.d.ts.map +1 -0
- package/dist/types/index.d.ts +2 -0
- package/dist/types/index.d.ts.map +1 -0
- 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":"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"}
|
|
@@ -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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"}
|