@wix/patterns-cms 1.17.0 → 1.18.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 +59 -27
- package/dist/cjs/adapter/__tests__/cmsFieldActions.spec.js.map +1 -1
- package/dist/cjs/adapter/__tests__/useCmsSchemaSource.spec.js +34 -2
- package/dist/cjs/adapter/__tests__/useCmsSchemaSource.spec.js.map +1 -1
- package/dist/cjs/adapter/createCmsFieldActions.js +35 -3
- package/dist/cjs/adapter/createCmsFieldActions.js.map +1 -1
- package/dist/cjs/adapter/fieldSettings/CmsFieldSettings.js +359 -0
- package/dist/cjs/adapter/fieldSettings/CmsFieldSettings.js.map +1 -0
- package/dist/cjs/adapter/fieldSettings/CmsFieldSettingsState.js +144 -0
- package/dist/cjs/adapter/fieldSettings/CmsFieldSettingsState.js.map +1 -0
- package/dist/cjs/adapter/fieldSettings/createCmsFieldSettings.js +29 -0
- package/dist/cjs/adapter/fieldSettings/createCmsFieldSettings.js.map +1 -0
- package/dist/cjs/adapter/useCmsSchemaSource.js +70 -56
- package/dist/cjs/adapter/useCmsSchemaSource.js.map +1 -1
- package/dist/esm/adapter/__tests__/cmsFieldActions.spec.js +50 -23
- package/dist/esm/adapter/__tests__/cmsFieldActions.spec.js.map +1 -1
- package/dist/esm/adapter/__tests__/useCmsSchemaSource.spec.js +24 -2
- package/dist/esm/adapter/__tests__/useCmsSchemaSource.spec.js.map +1 -1
- package/dist/esm/adapter/createCmsFieldActions.js +28 -3
- package/dist/esm/adapter/createCmsFieldActions.js.map +1 -1
- package/dist/esm/adapter/fieldSettings/CmsFieldSettings.js +45 -0
- package/dist/esm/adapter/fieldSettings/CmsFieldSettings.js.map +1 -0
- package/dist/esm/adapter/fieldSettings/CmsFieldSettingsState.js +136 -0
- package/dist/esm/adapter/fieldSettings/CmsFieldSettingsState.js.map +1 -0
- package/dist/esm/adapter/fieldSettings/createCmsFieldSettings.js +13 -0
- package/dist/esm/adapter/fieldSettings/createCmsFieldSettings.js.map +1 -0
- package/dist/esm/adapter/useCmsSchemaSource.js +71 -59
- package/dist/esm/adapter/useCmsSchemaSource.js.map +1 -1
- package/dist/types/adapter/createCmsFieldActions.d.ts.map +1 -1
- package/dist/types/adapter/fieldSettings/CmsFieldSettings.d.ts +12 -0
- package/dist/types/adapter/fieldSettings/CmsFieldSettings.d.ts.map +1 -0
- package/dist/types/adapter/fieldSettings/CmsFieldSettingsState.d.ts +53 -0
- package/dist/types/adapter/fieldSettings/CmsFieldSettingsState.d.ts.map +1 -0
- package/dist/types/adapter/fieldSettings/createCmsFieldSettings.d.ts +3 -0
- package/dist/types/adapter/fieldSettings/createCmsFieldSettings.d.ts.map +1 -0
- package/dist/types/adapter/useCmsSchemaSource.d.ts.map +1 -1
- package/package.json +9 -4
|
@@ -10,6 +10,7 @@ jest.mock('@wix/data', () => {
|
|
|
10
10
|
...actual.collections,
|
|
11
11
|
createDataCollectionField: jest.fn(),
|
|
12
12
|
patchDataCollectionField: jest.fn(),
|
|
13
|
+
updateDataCollectionField: jest.fn(),
|
|
13
14
|
deleteDataCollectionField: jest.fn(),
|
|
14
15
|
patchDataCollection: jest.fn(),
|
|
15
16
|
updateDataCollection: jest.fn()
|
|
@@ -28,6 +29,7 @@ jest.mock('@wix/data', () => {
|
|
|
28
29
|
// Re-typing each mock with the call shape the adapter uses unblocks both.
|
|
29
30
|
const createDataCollectionField = _data.collections.createDataCollectionField;
|
|
30
31
|
const patchDataCollectionField = _data.collections.patchDataCollectionField;
|
|
32
|
+
const updateDataCollectionField = _data.collections.updateDataCollectionField;
|
|
31
33
|
const deleteDataCollectionField = _data.collections.deleteDataCollectionField;
|
|
32
34
|
const patchDataCollection = _data.collections.patchDataCollection;
|
|
33
35
|
// updateDataCollection resolves with the updated collection directly (not
|
|
@@ -74,6 +76,9 @@ describe('createCmsFieldActions', () => {
|
|
|
74
76
|
patchDataCollectionField.mockResolvedValue({
|
|
75
77
|
dataCollection: makeCollection([])
|
|
76
78
|
});
|
|
79
|
+
updateDataCollectionField.mockResolvedValue({
|
|
80
|
+
dataCollection: makeCollection([])
|
|
81
|
+
});
|
|
77
82
|
updateDataCollection.mockImplementation(async dataCollection => dataCollection);
|
|
78
83
|
});
|
|
79
84
|
describe('addField', () => {
|
|
@@ -246,17 +251,26 @@ describe('createCmsFieldActions', () => {
|
|
|
246
251
|
expect(updateDataCollection).not.toHaveBeenCalled();
|
|
247
252
|
});
|
|
248
253
|
});
|
|
254
|
+
|
|
255
|
+
// editField sends the whole field definition through updateDataCollectionField,
|
|
256
|
+
// not a patch: patchDataCollectionField rejects `required` and the range props.
|
|
257
|
+
// Every assertion here is on the merged result — the existing field minus its
|
|
258
|
+
// read-only props, with the update applied on top.
|
|
249
259
|
describe('editField', () => {
|
|
250
|
-
it('
|
|
260
|
+
it('changes displayName and keeps the rest of the field definition', async () => {
|
|
251
261
|
const actions = (0, _createCmsFieldActions.createCmsFieldActions)(COLLECTION_ID, () => makeCollection([makeField({
|
|
252
262
|
key: 'name'
|
|
253
263
|
})]));
|
|
254
264
|
await actions.editField('name', {
|
|
255
265
|
displayName: 'Renamed'
|
|
256
266
|
});
|
|
257
|
-
expect(
|
|
258
|
-
|
|
259
|
-
|
|
267
|
+
expect(updateDataCollectionField).toHaveBeenCalledWith(COLLECTION_ID, {
|
|
268
|
+
field: {
|
|
269
|
+
key: 'name',
|
|
270
|
+
displayName: 'Renamed',
|
|
271
|
+
type: _data.collections.Type.TEXT,
|
|
272
|
+
encrypted: false
|
|
273
|
+
}
|
|
260
274
|
});
|
|
261
275
|
});
|
|
262
276
|
it('maps isPii to encrypted and helpText to description', async () => {
|
|
@@ -267,13 +281,17 @@ describe('createCmsFieldActions', () => {
|
|
|
267
281
|
isPii: true,
|
|
268
282
|
helpText: 'hint'
|
|
269
283
|
});
|
|
270
|
-
expect(
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
284
|
+
expect(updateDataCollectionField).toHaveBeenCalledWith(COLLECTION_ID, {
|
|
285
|
+
field: {
|
|
286
|
+
key: 'name',
|
|
287
|
+
displayName: 'Source Field',
|
|
288
|
+
type: _data.collections.Type.TEXT,
|
|
289
|
+
encrypted: true,
|
|
290
|
+
description: 'hint'
|
|
291
|
+
}
|
|
274
292
|
});
|
|
275
293
|
});
|
|
276
|
-
it('includes numberRange
|
|
294
|
+
it('includes numberRange only when the source CMS field is NUMBER', async () => {
|
|
277
295
|
const actions = (0, _createCmsFieldActions.createCmsFieldActions)(COLLECTION_ID, () => makeCollection([makeField({
|
|
278
296
|
key: 'age',
|
|
279
297
|
type: _data.collections.Type.NUMBER
|
|
@@ -287,12 +305,17 @@ describe('createCmsFieldActions', () => {
|
|
|
287
305
|
}
|
|
288
306
|
}
|
|
289
307
|
});
|
|
290
|
-
expect(
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
308
|
+
expect(updateDataCollectionField).toHaveBeenCalledWith(COLLECTION_ID, {
|
|
309
|
+
field: {
|
|
310
|
+
key: 'age',
|
|
311
|
+
displayName: 'Source Field',
|
|
312
|
+
type: _data.collections.Type.NUMBER,
|
|
313
|
+
encrypted: false,
|
|
314
|
+
required: true,
|
|
315
|
+
numberRange: {
|
|
316
|
+
min: 0,
|
|
317
|
+
max: 100
|
|
318
|
+
}
|
|
296
319
|
}
|
|
297
320
|
});
|
|
298
321
|
});
|
|
@@ -310,14 +333,16 @@ describe('createCmsFieldActions', () => {
|
|
|
310
333
|
}
|
|
311
334
|
}
|
|
312
335
|
});
|
|
313
|
-
const [,
|
|
314
|
-
|
|
315
|
-
|
|
336
|
+
const [, {
|
|
337
|
+
field
|
|
338
|
+
}] = updateDataCollectionField.mock.calls[0];
|
|
339
|
+
expect(field).not.toHaveProperty('numberRange');
|
|
340
|
+
expect(field).toMatchObject({
|
|
316
341
|
key: 'name',
|
|
317
342
|
required: true
|
|
318
343
|
});
|
|
319
344
|
});
|
|
320
|
-
it('includes stringLengthRange
|
|
345
|
+
it('includes stringLengthRange only when the source CMS field is TEXT', async () => {
|
|
321
346
|
const actions = (0, _createCmsFieldActions.createCmsFieldActions)(COLLECTION_ID, () => makeCollection([makeField({
|
|
322
347
|
key: 'name',
|
|
323
348
|
type: _data.collections.Type.TEXT
|
|
@@ -331,12 +356,17 @@ describe('createCmsFieldActions', () => {
|
|
|
331
356
|
}
|
|
332
357
|
}
|
|
333
358
|
});
|
|
334
|
-
expect(
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
359
|
+
expect(updateDataCollectionField).toHaveBeenCalledWith(COLLECTION_ID, {
|
|
360
|
+
field: {
|
|
361
|
+
key: 'name',
|
|
362
|
+
displayName: 'Source Field',
|
|
363
|
+
type: _data.collections.Type.TEXT,
|
|
364
|
+
encrypted: false,
|
|
365
|
+
required: false,
|
|
366
|
+
stringLengthRange: {
|
|
367
|
+
minLength: 1,
|
|
368
|
+
maxLength: 30
|
|
369
|
+
}
|
|
340
370
|
}
|
|
341
371
|
});
|
|
342
372
|
});
|
|
@@ -354,8 +384,10 @@ describe('createCmsFieldActions', () => {
|
|
|
354
384
|
}
|
|
355
385
|
}
|
|
356
386
|
});
|
|
357
|
-
const [,
|
|
358
|
-
|
|
387
|
+
const [, {
|
|
388
|
+
field
|
|
389
|
+
}] = updateDataCollectionField.mock.calls[0];
|
|
390
|
+
expect(field).not.toHaveProperty('stringLengthRange');
|
|
359
391
|
});
|
|
360
392
|
});
|
|
361
393
|
describe('renameField', () => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_data","require","_createCmsFieldActions","jest","mock","actual","requireActual","collections","createDataCollectionField","fn","patchDataCollectionField","deleteDataCollectionField","patchDataCollection","updateDataCollection","tasks","createTask","getTask","COLLECTION_ID","makeField","overrides","key","displayName","type","Type","TEXT","systemField","encrypted","makeCollection","fields","_id","makePatternsField","base","id","describe","beforeEach","clearAllMocks","mockResolvedValue","dataCollection","mockImplementation","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","existing","addFields","toHaveBeenCalledTimes","Object","keys","color","editField","toHaveBeenCalledWith","patch","toHaveProperty","renameField","deleteField","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/patterns';\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 updateDataCollection: 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<{ dataCollection: collections.DataCollection }>,\n [collectionId: string, options: { field: collections.Field }]\n >;\nconst patchDataCollectionField =\n collections.patchDataCollectionField as unknown as jest.Mock<\n Promise<{ dataCollection: collections.DataCollection }>,\n [collectionId: string, field: collections.Field]\n >;\nconst deleteDataCollectionField =\n collections.deleteDataCollectionField as unknown as jest.Mock<\n Promise<{ dataCollection: collections.DataCollection }>,\n [collectionId: string, options: { fieldKey: string }]\n >;\nconst patchDataCollection =\n collections.patchDataCollection as unknown as jest.Mock<\n Promise<{ dataCollection: collections.DataCollection }>,\n [collectionId: string, dataCollection: collections.PatchDataCollection]\n >;\n// updateDataCollection resolves with the updated collection directly (not\n// wrapped in `{ dataCollection }`, unlike the field mutations).\nconst updateDataCollection =\n collections.updateDataCollection as unknown as jest.Mock<\n Promise<collections.DataCollection>,\n [dataCollection: collections.DataCollection]\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({\n dataCollection: makeCollection([]),\n });\n deleteDataCollectionField.mockResolvedValue({\n dataCollection: makeCollection([]),\n });\n patchDataCollection.mockResolvedValue({\n dataCollection: makeCollection([]),\n });\n patchDataCollectionField.mockResolvedValue({\n dataCollection: makeCollection([]),\n });\n updateDataCollection.mockImplementation(\n async (dataCollection) => dataCollection,\n );\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('addFields', () => {\n it('appends all new fields in one updateDataCollection call, keyed by field.id, preserving existing fields', async () => {\n const existing = makeField({ key: 'name', displayName: 'Name' });\n const actions = createCmsFieldActions(COLLECTION_ID, () =>\n makeCollection([existing]),\n );\n\n await actions.addFields!([\n makePatternsField({\n id: 'color',\n displayName: 'Color',\n type: 'SHORT_TEXT',\n }),\n makePatternsField({\n id: 'count',\n displayName: 'Count',\n type: 'NUMBER',\n }),\n ]);\n\n expect(updateDataCollection).toHaveBeenCalledTimes(1);\n const [dataCollection] = updateDataCollection.mock.calls[0];\n expect(dataCollection._id).toBe(COLLECTION_ID);\n // Existing field kept; new fields appended under their given ids as keys.\n expect(dataCollection.fields).toEqual([\n existing,\n {\n key: 'color',\n displayName: 'Color',\n type: collections.Type.TEXT,\n required: false,\n },\n {\n key: 'count',\n displayName: 'Count',\n type: collections.Type.NUMBER,\n required: false,\n },\n ]);\n expect(createDataCollectionField).not.toHaveBeenCalled();\n });\n\n it('resolves with the full updated fields map (existing + added), keyed by field key', async () => {\n const actions = createCmsFieldActions(COLLECTION_ID, () =>\n makeCollection([makeField({ key: 'name', displayName: 'Name' })]),\n );\n\n const fields = await actions.addFields!([\n makePatternsField({\n id: 'color',\n displayName: 'Color',\n type: 'SHORT_TEXT',\n }),\n ]);\n\n expect(Object.keys(fields)).toEqual(['name', 'color']);\n expect(fields.color).toMatchObject({ id: 'color', displayName: 'Color' });\n });\n\n it('throws before any write when a field type has no CMS mapping', async () => {\n const actions = createCmsFieldActions(COLLECTION_ID, () =>\n makeCollection([]),\n );\n\n await expect(\n actions.addFields!([makePatternsField({ id: 'pic', type: 'IMAGE' })]),\n ).rejects.toThrow('Field type IMAGE not supported yet');\n expect(updateDataCollection).not.toHaveBeenCalled();\n });\n\n it('throws when the collection cannot be read', async () => {\n const actions = createCmsFieldActions(COLLECTION_ID, () => null);\n\n await expect(\n actions.addFields!([makePatternsField({ id: 'color' })]),\n ).rejects.toThrow(`Collection ${COLLECTION_ID} not found`);\n expect(updateDataCollection).not.toHaveBeenCalled();\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":[]}
|
|
1
|
+
{"version":3,"names":["_data","require","_createCmsFieldActions","jest","mock","actual","requireActual","collections","createDataCollectionField","fn","patchDataCollectionField","updateDataCollectionField","deleteDataCollectionField","patchDataCollection","updateDataCollection","tasks","createTask","getTask","COLLECTION_ID","makeField","overrides","key","displayName","type","Type","TEXT","systemField","encrypted","makeCollection","fields","_id","makePatternsField","base","id","describe","beforeEach","clearAllMocks","mockResolvedValue","dataCollection","mockImplementation","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","existing","addFields","toHaveBeenCalledTimes","Object","keys","color","editField","toHaveBeenCalledWith","toHaveProperty","renameField","deleteField","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/patterns';\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 updateDataCollectionField: jest.fn(),\n deleteDataCollectionField: jest.fn(),\n patchDataCollection: jest.fn(),\n updateDataCollection: 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<{ dataCollection: collections.DataCollection }>,\n [collectionId: string, options: { field: collections.Field }]\n >;\nconst patchDataCollectionField =\n collections.patchDataCollectionField as unknown as jest.Mock<\n Promise<{ dataCollection: collections.DataCollection }>,\n [collectionId: string, field: collections.Field]\n >;\nconst updateDataCollectionField =\n collections.updateDataCollectionField as unknown as jest.Mock<\n Promise<{ dataCollection: collections.DataCollection }>,\n [collectionId: string, options: { field: collections.Field }]\n >;\nconst deleteDataCollectionField =\n collections.deleteDataCollectionField as unknown as jest.Mock<\n Promise<{ dataCollection: collections.DataCollection }>,\n [collectionId: string, options: { fieldKey: string }]\n >;\nconst patchDataCollection =\n collections.patchDataCollection as unknown as jest.Mock<\n Promise<{ dataCollection: collections.DataCollection }>,\n [collectionId: string, dataCollection: collections.PatchDataCollection]\n >;\n// updateDataCollection resolves with the updated collection directly (not\n// wrapped in `{ dataCollection }`, unlike the field mutations).\nconst updateDataCollection =\n collections.updateDataCollection as unknown as jest.Mock<\n Promise<collections.DataCollection>,\n [dataCollection: collections.DataCollection]\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({\n dataCollection: makeCollection([]),\n });\n deleteDataCollectionField.mockResolvedValue({\n dataCollection: makeCollection([]),\n });\n patchDataCollection.mockResolvedValue({\n dataCollection: makeCollection([]),\n });\n patchDataCollectionField.mockResolvedValue({\n dataCollection: makeCollection([]),\n });\n updateDataCollectionField.mockResolvedValue({\n dataCollection: makeCollection([]),\n });\n updateDataCollection.mockImplementation(\n async (dataCollection) => dataCollection,\n );\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('addFields', () => {\n it('appends all new fields in one updateDataCollection call, keyed by field.id, preserving existing fields', async () => {\n const existing = makeField({ key: 'name', displayName: 'Name' });\n const actions = createCmsFieldActions(COLLECTION_ID, () =>\n makeCollection([existing]),\n );\n\n await actions.addFields!([\n makePatternsField({\n id: 'color',\n displayName: 'Color',\n type: 'SHORT_TEXT',\n }),\n makePatternsField({\n id: 'count',\n displayName: 'Count',\n type: 'NUMBER',\n }),\n ]);\n\n expect(updateDataCollection).toHaveBeenCalledTimes(1);\n const [dataCollection] = updateDataCollection.mock.calls[0];\n expect(dataCollection._id).toBe(COLLECTION_ID);\n // Existing field kept; new fields appended under their given ids as keys.\n expect(dataCollection.fields).toEqual([\n existing,\n {\n key: 'color',\n displayName: 'Color',\n type: collections.Type.TEXT,\n required: false,\n },\n {\n key: 'count',\n displayName: 'Count',\n type: collections.Type.NUMBER,\n required: false,\n },\n ]);\n expect(createDataCollectionField).not.toHaveBeenCalled();\n });\n\n it('resolves with the full updated fields map (existing + added), keyed by field key', async () => {\n const actions = createCmsFieldActions(COLLECTION_ID, () =>\n makeCollection([makeField({ key: 'name', displayName: 'Name' })]),\n );\n\n const fields = await actions.addFields!([\n makePatternsField({\n id: 'color',\n displayName: 'Color',\n type: 'SHORT_TEXT',\n }),\n ]);\n\n expect(Object.keys(fields)).toEqual(['name', 'color']);\n expect(fields.color).toMatchObject({ id: 'color', displayName: 'Color' });\n });\n\n it('throws before any write when a field type has no CMS mapping', async () => {\n const actions = createCmsFieldActions(COLLECTION_ID, () =>\n makeCollection([]),\n );\n\n await expect(\n actions.addFields!([makePatternsField({ id: 'pic', type: 'IMAGE' })]),\n ).rejects.toThrow('Field type IMAGE not supported yet');\n expect(updateDataCollection).not.toHaveBeenCalled();\n });\n\n it('throws when the collection cannot be read', async () => {\n const actions = createCmsFieldActions(COLLECTION_ID, () => null);\n\n await expect(\n actions.addFields!([makePatternsField({ id: 'color' })]),\n ).rejects.toThrow(`Collection ${COLLECTION_ID} not found`);\n expect(updateDataCollection).not.toHaveBeenCalled();\n });\n });\n\n // editField sends the whole field definition through updateDataCollectionField,\n // not a patch: patchDataCollectionField rejects `required` and the range props.\n // Every assertion here is on the merged result — the existing field minus its\n // read-only props, with the update applied on top.\n describe('editField', () => {\n it('changes displayName and keeps the rest of the field definition', async () => {\n const actions = createCmsFieldActions(COLLECTION_ID, () =>\n makeCollection([makeField({ key: 'name' })]),\n );\n\n await actions.editField!('name', { displayName: 'Renamed' });\n\n expect(updateDataCollectionField).toHaveBeenCalledWith(COLLECTION_ID, {\n field: {\n key: 'name',\n displayName: 'Renamed',\n type: collections.Type.TEXT,\n encrypted: false,\n },\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(updateDataCollectionField).toHaveBeenCalledWith(COLLECTION_ID, {\n field: {\n key: 'name',\n displayName: 'Source Field',\n type: collections.Type.TEXT,\n encrypted: true,\n description: 'hint',\n },\n });\n });\n\n it('includes numberRange 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(updateDataCollectionField).toHaveBeenCalledWith(COLLECTION_ID, {\n field: {\n key: 'age',\n displayName: 'Source Field',\n type: collections.Type.NUMBER,\n encrypted: false,\n required: true,\n numberRange: { min: 0, max: 100 },\n },\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 [, { field }] = updateDataCollectionField.mock.calls[0];\n expect(field).not.toHaveProperty('numberRange');\n expect(field).toMatchObject({ key: 'name', required: true });\n });\n\n it('includes stringLengthRange 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(updateDataCollectionField).toHaveBeenCalledWith(COLLECTION_ID, {\n field: {\n key: 'name',\n displayName: 'Source Field',\n type: collections.Type.TEXT,\n encrypted: false,\n required: false,\n stringLengthRange: { minLength: 1, maxLength: 30 },\n },\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 [, { field }] = updateDataCollectionField.mock.calls[0];\n expect(field).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":[]}
|
|
@@ -89,14 +89,29 @@ describe('useCmsSchemaSource', () => {
|
|
|
89
89
|
fetchUserPermissionsMock.mockResolvedValue([]);
|
|
90
90
|
fetchExternalDbConnectionsMock.mockResolvedValue([]);
|
|
91
91
|
});
|
|
92
|
-
it('declares the
|
|
92
|
+
it('declares the field type options in display order, with CMS labels, subtitles and groups', () => {
|
|
93
93
|
const source = (0, _schema.defineSchemaSource)((0, _useCmsSchemaSource.cmsSchemaSourceInput)({
|
|
94
94
|
collectionId: 'Pokemon',
|
|
95
95
|
httpClient
|
|
96
96
|
}));
|
|
97
97
|
const essentials = 'Essentials';
|
|
98
98
|
const timeAndLocation = 'Time and location';
|
|
99
|
-
|
|
99
|
+
// Only the copy each type shows in the picker; the settings section and the
|
|
100
|
+
// PII warning they also carry have their own tests.
|
|
101
|
+
const display = source.fieldModal.types.map(({
|
|
102
|
+
patternsType,
|
|
103
|
+
label,
|
|
104
|
+
subtitle,
|
|
105
|
+
group,
|
|
106
|
+
supportsPii
|
|
107
|
+
}) => ({
|
|
108
|
+
patternsType,
|
|
109
|
+
label,
|
|
110
|
+
subtitle,
|
|
111
|
+
group,
|
|
112
|
+
supportsPii
|
|
113
|
+
}));
|
|
114
|
+
expect(display).toEqual([{
|
|
100
115
|
patternsType: 'SHORT_TEXT',
|
|
101
116
|
label: 'Text',
|
|
102
117
|
subtitle: 'Titles, paragraph',
|
|
@@ -121,6 +136,23 @@ describe('useCmsSchemaSource', () => {
|
|
|
121
136
|
supportsPii: false
|
|
122
137
|
}]);
|
|
123
138
|
});
|
|
139
|
+
it('gives every type the same settings section, so the modal keeps one set of inputs', () => {
|
|
140
|
+
const source = (0, _schema.defineSchemaSource)((0, _useCmsSchemaSource.cmsSchemaSourceInput)({
|
|
141
|
+
collectionId: 'Pokemon',
|
|
142
|
+
httpClient
|
|
143
|
+
}));
|
|
144
|
+
const sections = source.fieldModal.types.map(t => t.settingsSection);
|
|
145
|
+
expect(sections.every(section => section === sections[0])).toBe(true);
|
|
146
|
+
expect(sections[0]).toBeDefined();
|
|
147
|
+
});
|
|
148
|
+
it('warns about PII only on the type that can be marked PII', () => {
|
|
149
|
+
const source = (0, _schema.defineSchemaSource)((0, _useCmsSchemaSource.cmsSchemaSourceInput)({
|
|
150
|
+
collectionId: 'Pokemon',
|
|
151
|
+
httpClient
|
|
152
|
+
}));
|
|
153
|
+
const withWarning = source.fieldModal.types.filter(t => t.piiWarning).map(t => t.patternsType);
|
|
154
|
+
expect(withWarning).toEqual(['SHORT_TEXT']);
|
|
155
|
+
});
|
|
124
156
|
it('builds an offset source keyed by the collectionId', () => {
|
|
125
157
|
const source = (0, _schema.defineSchemaSource)((0, _useCmsSchemaSource.cmsSchemaSourceInput)({
|
|
126
158
|
collectionId: 'Pokemon',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_patterns","require","_schema","_data","_useCmsSchemaSource","_fetchUserPermissions","_fetchExternalDbConnections","jest","mock","errorHandler","withErrorHandler","fn","actual","requireActual","collections","getDataCollection","fetchUserPermissions","fetchExternalDbConnections","fetchUserPermissionsMock","fetchExternalDbConnectionsMock","httpClient","collectionWithReference","_id","collectionType","displayField","capabilities","dataOperations","permissions","read","insert","update","remove","plugins","fields","key","type","Type","TEXT","systemField","encrypted","displayName","queryOperators","sortable","REFERENCE","typeMetadata","reference","referencedCollectionId","describe","beforeEach","clearAllMocks","mockResolvedValue","it","source","defineSchemaSource","cmsSchemaSourceInput","collectionId","essentials","timeAndLocation","expect","creatableFieldTypes","toEqual","patternsType","label","subtitle","group","supportsPii","toBe","paginationMode","rating","defineFieldType","display","icons","Small","Medium","filter","filterable","fieldTypes","references","loadSchema","Camels","toBeDefined","seeded"],"sources":["../../../../src/adapter/__tests__/useCmsSchemaSource.spec.ts"],"sourcesContent":["import { defineFieldType } from '@wix/patterns';\nimport { defineSchemaSource } from '@wix/patterns/schema';\nimport { collections } from '@wix/data';\nimport { cmsSchemaSourceInput } from '../useCmsSchemaSource';\nimport { fetchUserPermissions } from '../fetchUserPermissions';\nimport { fetchExternalDbConnections } from '../fetchExternalDbConnections';\n\n// loadCmsSchema imports errorHandler at evaluation time; stub it so importing\n// the source builder is side-effect free.\njest.mock('@wix/essentials', () => ({\n errorHandler: {\n withErrorHandler: (fn: () => unknown) => fn(),\n },\n}));\n\n// Keep @wix/data real (cmsFieldTypeMap reads `collections.Type` at evaluation\n// time) and stub only the collection fetch, so loadSchema runs the real\n// loader + transform against a fixed collection.\njest.mock('@wix/data', () => {\n const actual = jest.requireActual('@wix/data');\n return {\n ...actual,\n collections: {\n ...actual.collections,\n getDataCollection: jest.fn(),\n },\n };\n});\njest.mock('../fetchUserPermissions', () => ({\n fetchUserPermissions: jest.fn(),\n}));\njest.mock('../fetchExternalDbConnections', () => ({\n fetchExternalDbConnections: jest.fn(),\n}));\n\nconst getDataCollection = collections.getDataCollection as unknown as jest.Mock;\nconst fetchUserPermissionsMock = fetchUserPermissions as unknown as jest.Mock;\nconst fetchExternalDbConnectionsMock =\n fetchExternalDbConnections as unknown as jest.Mock;\n\nconst httpClient = {} as unknown as Parameters<\n typeof cmsSchemaSourceInput\n>[0]['httpClient'];\n\n// A collection with one reference field pointing at \"Camels\".\nconst collectionWithReference = (): collections.DataCollection => ({\n _id: 'Products',\n collectionType: 'NATIVE',\n displayField: 'title',\n capabilities: { dataOperations: ['SAVE', 'UPDATE', 'REMOVE'] },\n permissions: {\n read: 'ANYONE',\n insert: 'SITE_MEMBER',\n update: 'SITE_MEMBER',\n remove: 'SITE_MEMBER',\n },\n plugins: [],\n fields: [\n {\n key: 'title',\n type: collections.Type.TEXT,\n systemField: false,\n encrypted: false,\n plugins: [],\n displayName: 'Title',\n capabilities: { queryOperators: [], sortable: true },\n },\n {\n key: 'supplier',\n type: collections.Type.REFERENCE,\n systemField: false,\n encrypted: false,\n plugins: [],\n displayName: 'Supplier',\n capabilities: { queryOperators: [], sortable: false },\n typeMetadata: { reference: { referencedCollectionId: 'Camels' } },\n },\n ],\n});\n\ndescribe('useCmsSchemaSource', () => {\n beforeEach(() => {\n jest.clearAllMocks();\n getDataCollection.mockResolvedValue(collectionWithReference());\n fetchUserPermissionsMock.mockResolvedValue([]);\n fetchExternalDbConnectionsMock.mockResolvedValue([]);\n });\n\n it('declares the creatable types in display order, with CMS labels, subtitles and groups', () => {\n const source = defineSchemaSource(\n cmsSchemaSourceInput({\n collectionId: 'Pokemon',\n httpClient,\n }),\n );\n\n const essentials = 'Essentials';\n const timeAndLocation = 'Time and location';\n expect(source.creatableFieldTypes).toEqual([\n {\n patternsType: 'SHORT_TEXT',\n label: 'Text',\n subtitle: 'Titles, paragraph',\n group: essentials,\n },\n {\n patternsType: 'NUMBER',\n label: 'Number',\n subtitle: 'ID, rating, order number',\n group: essentials,\n supportsPii: false,\n },\n {\n patternsType: 'BOOLEAN',\n label: 'Boolean',\n subtitle: 'Yes or no, true or false',\n group: essentials,\n supportsPii: false,\n },\n {\n patternsType: 'DATE',\n label: 'Date',\n subtitle: 'Date of event, date added',\n group: timeAndLocation,\n supportsPii: false,\n },\n ]);\n });\n\n it('builds an offset source keyed by the collectionId', () => {\n const source = defineSchemaSource(\n cmsSchemaSourceInput({\n collectionId: 'Pokemon',\n httpClient,\n }),\n );\n\n expect(source.collectionId).toBe('Pokemon');\n expect(source.paginationMode).toBe('offset');\n });\n\n it('carries consumer-defined field types through to the source', () => {\n const rating = defineFieldType<number>({\n type: 'app.rating',\n display: {\n label: 'Rating',\n icons: { Small: () => null, Medium: () => null },\n },\n filter: { filterable: false },\n });\n const source = defineSchemaSource(\n cmsSchemaSourceInput({\n collectionId: 'Pokemon',\n httpClient,\n fieldTypes: [rating],\n }),\n );\n\n expect(source.fieldTypes).toEqual([rating]);\n });\n\n it('auto-builds a reference source per reference field once the schema loads', async () => {\n const source = defineSchemaSource(\n cmsSchemaSourceInput({ collectionId: 'Products', httpClient }),\n );\n\n // Nothing is wired until the schema (and its reference fields) is known.\n expect(source.references).toEqual({});\n\n await source.loadSchema();\n\n expect(source.references.Camels).toBeDefined();\n expect(source.references.Camels.collectionId).toBe('Camels');\n });\n\n it('keeps a seeded reference source instead of auto-building it', async () => {\n const seeded = defineSchemaSource(\n cmsSchemaSourceInput({ collectionId: 'Camels', httpClient }),\n );\n const source = defineSchemaSource(\n cmsSchemaSourceInput({\n collectionId: 'Products',\n httpClient,\n references: { Camels: seeded },\n }),\n );\n\n await source.loadSchema();\n\n expect(source.references.Camels).toBe(seeded);\n });\n});\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":["_patterns","require","_schema","_data","_useCmsSchemaSource","_fetchUserPermissions","_fetchExternalDbConnections","jest","mock","errorHandler","withErrorHandler","fn","actual","requireActual","collections","getDataCollection","fetchUserPermissions","fetchExternalDbConnections","fetchUserPermissionsMock","fetchExternalDbConnectionsMock","httpClient","collectionWithReference","_id","collectionType","displayField","capabilities","dataOperations","permissions","read","insert","update","remove","plugins","fields","key","type","Type","TEXT","systemField","encrypted","displayName","queryOperators","sortable","REFERENCE","typeMetadata","reference","referencedCollectionId","describe","beforeEach","clearAllMocks","mockResolvedValue","it","source","defineSchemaSource","cmsSchemaSourceInput","collectionId","essentials","timeAndLocation","display","fieldModal","types","map","patternsType","label","subtitle","group","supportsPii","expect","toEqual","sections","t","settingsSection","every","section","toBe","toBeDefined","withWarning","filter","piiWarning","paginationMode","rating","defineFieldType","icons","Small","Medium","filterable","fieldTypes","references","loadSchema","Camels","seeded"],"sources":["../../../../src/adapter/__tests__/useCmsSchemaSource.spec.ts"],"sourcesContent":["import { defineFieldType } from '@wix/patterns';\nimport { defineSchemaSource } from '@wix/patterns/schema';\nimport { collections } from '@wix/data';\nimport { cmsSchemaSourceInput } from '../useCmsSchemaSource';\nimport { fetchUserPermissions } from '../fetchUserPermissions';\nimport { fetchExternalDbConnections } from '../fetchExternalDbConnections';\n\n// loadCmsSchema imports errorHandler at evaluation time; stub it so importing\n// the source builder is side-effect free.\njest.mock('@wix/essentials', () => ({\n errorHandler: {\n withErrorHandler: (fn: () => unknown) => fn(),\n },\n}));\n\n// Keep @wix/data real (cmsFieldTypeMap reads `collections.Type` at evaluation\n// time) and stub only the collection fetch, so loadSchema runs the real\n// loader + transform against a fixed collection.\njest.mock('@wix/data', () => {\n const actual = jest.requireActual('@wix/data');\n return {\n ...actual,\n collections: {\n ...actual.collections,\n getDataCollection: jest.fn(),\n },\n };\n});\njest.mock('../fetchUserPermissions', () => ({\n fetchUserPermissions: jest.fn(),\n}));\njest.mock('../fetchExternalDbConnections', () => ({\n fetchExternalDbConnections: jest.fn(),\n}));\n\nconst getDataCollection = collections.getDataCollection as unknown as jest.Mock;\nconst fetchUserPermissionsMock = fetchUserPermissions as unknown as jest.Mock;\nconst fetchExternalDbConnectionsMock =\n fetchExternalDbConnections as unknown as jest.Mock;\n\nconst httpClient = {} as unknown as Parameters<\n typeof cmsSchemaSourceInput\n>[0]['httpClient'];\n\n// A collection with one reference field pointing at \"Camels\".\nconst collectionWithReference = (): collections.DataCollection => ({\n _id: 'Products',\n collectionType: 'NATIVE',\n displayField: 'title',\n capabilities: { dataOperations: ['SAVE', 'UPDATE', 'REMOVE'] },\n permissions: {\n read: 'ANYONE',\n insert: 'SITE_MEMBER',\n update: 'SITE_MEMBER',\n remove: 'SITE_MEMBER',\n },\n plugins: [],\n fields: [\n {\n key: 'title',\n type: collections.Type.TEXT,\n systemField: false,\n encrypted: false,\n plugins: [],\n displayName: 'Title',\n capabilities: { queryOperators: [], sortable: true },\n },\n {\n key: 'supplier',\n type: collections.Type.REFERENCE,\n systemField: false,\n encrypted: false,\n plugins: [],\n displayName: 'Supplier',\n capabilities: { queryOperators: [], sortable: false },\n typeMetadata: { reference: { referencedCollectionId: 'Camels' } },\n },\n ],\n});\n\ndescribe('useCmsSchemaSource', () => {\n beforeEach(() => {\n jest.clearAllMocks();\n getDataCollection.mockResolvedValue(collectionWithReference());\n fetchUserPermissionsMock.mockResolvedValue([]);\n fetchExternalDbConnectionsMock.mockResolvedValue([]);\n });\n\n it('declares the field type options in display order, with CMS labels, subtitles and groups', () => {\n const source = defineSchemaSource(\n cmsSchemaSourceInput({\n collectionId: 'Pokemon',\n httpClient,\n }),\n );\n\n const essentials = 'Essentials';\n const timeAndLocation = 'Time and location';\n // Only the copy each type shows in the picker; the settings section and the\n // PII warning they also carry have their own tests.\n const display = source.fieldModal.types.map(\n ({ patternsType, label, subtitle, group, supportsPii }) => ({\n patternsType,\n label,\n subtitle,\n group,\n supportsPii,\n }),\n );\n expect(display).toEqual([\n {\n patternsType: 'SHORT_TEXT',\n label: 'Text',\n subtitle: 'Titles, paragraph',\n group: essentials,\n },\n {\n patternsType: 'NUMBER',\n label: 'Number',\n subtitle: 'ID, rating, order number',\n group: essentials,\n supportsPii: false,\n },\n {\n patternsType: 'BOOLEAN',\n label: 'Boolean',\n subtitle: 'Yes or no, true or false',\n group: essentials,\n supportsPii: false,\n },\n {\n patternsType: 'DATE',\n label: 'Date',\n subtitle: 'Date of event, date added',\n group: timeAndLocation,\n supportsPii: false,\n },\n ]);\n });\n\n it('gives every type the same settings section, so the modal keeps one set of inputs', () => {\n const source = defineSchemaSource(\n cmsSchemaSourceInput({ collectionId: 'Pokemon', httpClient }),\n );\n\n const sections = source.fieldModal.types.map((t) => t.settingsSection);\n expect(sections.every((section) => section === sections[0])).toBe(true);\n expect(sections[0]).toBeDefined();\n });\n\n it('warns about PII only on the type that can be marked PII', () => {\n const source = defineSchemaSource(\n cmsSchemaSourceInput({ collectionId: 'Pokemon', httpClient }),\n );\n\n const withWarning = source.fieldModal.types\n .filter((t) => t.piiWarning)\n .map((t) => t.patternsType);\n expect(withWarning).toEqual(['SHORT_TEXT']);\n });\n\n it('builds an offset source keyed by the collectionId', () => {\n const source = defineSchemaSource(\n cmsSchemaSourceInput({\n collectionId: 'Pokemon',\n httpClient,\n }),\n );\n\n expect(source.collectionId).toBe('Pokemon');\n expect(source.paginationMode).toBe('offset');\n });\n\n it('carries consumer-defined field types through to the source', () => {\n const rating = defineFieldType<number>({\n type: 'app.rating',\n display: {\n label: 'Rating',\n icons: { Small: () => null, Medium: () => null },\n },\n filter: { filterable: false },\n });\n const source = defineSchemaSource(\n cmsSchemaSourceInput({\n collectionId: 'Pokemon',\n httpClient,\n fieldTypes: [rating],\n }),\n );\n\n expect(source.fieldTypes).toEqual([rating]);\n });\n\n it('auto-builds a reference source per reference field once the schema loads', async () => {\n const source = defineSchemaSource(\n cmsSchemaSourceInput({ collectionId: 'Products', httpClient }),\n );\n\n // Nothing is wired until the schema (and its reference fields) is known.\n expect(source.references).toEqual({});\n\n await source.loadSchema();\n\n expect(source.references.Camels).toBeDefined();\n expect(source.references.Camels.collectionId).toBe('Camels');\n });\n\n it('keeps a seeded reference source instead of auto-building it', async () => {\n const seeded = defineSchemaSource(\n cmsSchemaSourceInput({ collectionId: 'Camels', httpClient }),\n );\n const source = defineSchemaSource(\n cmsSchemaSourceInput({\n collectionId: 'Products',\n httpClient,\n references: { Camels: seeded },\n }),\n );\n\n await source.loadSchema();\n\n expect(source.references.Camels).toBe(seeded);\n });\n});\n"],"mappings":";;AAAA,IAAAA,SAAA,GAAAC,OAAA;AACA,IAAAC,OAAA,GAAAD,OAAA;AACA,IAAAE,KAAA,GAAAF,OAAA;AACA,IAAAG,mBAAA,GAAAH,OAAA;AACA,IAAAI,qBAAA,GAAAJ,OAAA;AACA,IAAAK,2BAAA,GAAAL,OAAA;AAEA;AACA;AACAM,IAAI,CAACC,IAAI,CAAC,iBAAiB,EAAE,OAAO;EAClCC,YAAY,EAAE;IACZC,gBAAgB,EAAGC,EAAiB,IAAKA,EAAE,CAAC;EAC9C;AACF,CAAC,CAAC,CAAC;;AAEH;AACA;AACA;AACAJ,IAAI,CAACC,IAAI,CAAC,WAAW,EAAE,MAAM;EAC3B,MAAMI,MAAM,GAAGL,IAAI,CAACM,aAAa,CAAC,WAAW,CAAC;EAC9C,OAAO;IACL,GAAGD,MAAM;IACTE,WAAW,EAAE;MACX,GAAGF,MAAM,CAACE,WAAW;MACrBC,iBAAiB,EAAER,IAAI,CAACI,EAAE,CAAC;IAC7B;EACF,CAAC;AACH,CAAC,CAAC;AACFJ,IAAI,CAACC,IAAI,CAAC,yBAAyB,EAAE,OAAO;EAC1CQ,oBAAoB,EAAET,IAAI,CAACI,EAAE,CAAC;AAChC,CAAC,CAAC,CAAC;AACHJ,IAAI,CAACC,IAAI,CAAC,+BAA+B,EAAE,OAAO;EAChDS,0BAA0B,EAAEV,IAAI,CAACI,EAAE,CAAC;AACtC,CAAC,CAAC,CAAC;AAEH,MAAMI,iBAAiB,GAAGD,iBAAW,CAACC,iBAAyC;AAC/E,MAAMG,wBAAwB,GAAGF,0CAA4C;AAC7E,MAAMG,8BAA8B,GAClCF,sDAAkD;AAEpD,MAAMG,UAAU,GAAG,CAAC,CAEF;;AAElB;AACA,MAAMC,uBAAuB,GAAGA,CAAA,MAAmC;EACjEC,GAAG,EAAE,UAAU;EACfC,cAAc,EAAE,QAAQ;EACxBC,YAAY,EAAE,OAAO;EACrBC,YAAY,EAAE;IAAEC,cAAc,EAAE,CAAC,MAAM,EAAE,QAAQ,EAAE,QAAQ;EAAE,CAAC;EAC9DC,WAAW,EAAE;IACXC,IAAI,EAAE,QAAQ;IACdC,MAAM,EAAE,aAAa;IACrBC,MAAM,EAAE,aAAa;IACrBC,MAAM,EAAE;EACV,CAAC;EACDC,OAAO,EAAE,EAAE;EACXC,MAAM,EAAE,CACN;IACEC,GAAG,EAAE,OAAO;IACZC,IAAI,EAAErB,iBAAW,CAACsB,IAAI,CAACC,IAAI;IAC3BC,WAAW,EAAE,KAAK;IAClBC,SAAS,EAAE,KAAK;IAChBP,OAAO,EAAE,EAAE;IACXQ,WAAW,EAAE,OAAO;IACpBf,YAAY,EAAE;MAAEgB,cAAc,EAAE,EAAE;MAAEC,QAAQ,EAAE;IAAK;EACrD,CAAC,EACD;IACER,GAAG,EAAE,UAAU;IACfC,IAAI,EAAErB,iBAAW,CAACsB,IAAI,CAACO,SAAS;IAChCL,WAAW,EAAE,KAAK;IAClBC,SAAS,EAAE,KAAK;IAChBP,OAAO,EAAE,EAAE;IACXQ,WAAW,EAAE,UAAU;IACvBf,YAAY,EAAE;MAAEgB,cAAc,EAAE,EAAE;MAAEC,QAAQ,EAAE;IAAM,CAAC;IACrDE,YAAY,EAAE;MAAEC,SAAS,EAAE;QAAEC,sBAAsB,EAAE;MAAS;IAAE;EAClE,CAAC;AAEL,CAAC,CAAC;AAEFC,QAAQ,CAAC,oBAAoB,EAAE,MAAM;EACnCC,UAAU,CAAC,MAAM;IACfzC,IAAI,CAAC0C,aAAa,CAAC,CAAC;IACpBlC,iBAAiB,CAACmC,iBAAiB,CAAC7B,uBAAuB,CAAC,CAAC,CAAC;IAC9DH,wBAAwB,CAACgC,iBAAiB,CAAC,EAAE,CAAC;IAC9C/B,8BAA8B,CAAC+B,iBAAiB,CAAC,EAAE,CAAC;EACtD,CAAC,CAAC;EAEFC,EAAE,CAAC,yFAAyF,EAAE,MAAM;IAClG,MAAMC,MAAM,GAAG,IAAAC,0BAAkB,EAC/B,IAAAC,wCAAoB,EAAC;MACnBC,YAAY,EAAE,SAAS;MACvBnC;IACF,CAAC,CACH,CAAC;IAED,MAAMoC,UAAU,GAAG,YAAY;IAC/B,MAAMC,eAAe,GAAG,mBAAmB;IAC3C;IACA;IACA,MAAMC,OAAO,GAAGN,MAAM,CAACO,UAAU,CAACC,KAAK,CAACC,GAAG,CACzC,CAAC;MAAEC,YAAY;MAAEC,KAAK;MAAEC,QAAQ;MAAEC,KAAK;MAAEC;IAAY,CAAC,MAAM;MAC1DJ,YAAY;MACZC,KAAK;MACLC,QAAQ;MACRC,KAAK;MACLC;IACF,CAAC,CACH,CAAC;IACDC,MAAM,CAACT,OAAO,CAAC,CAACU,OAAO,CAAC,CACtB;MACEN,YAAY,EAAE,YAAY;MAC1BC,KAAK,EAAE,MAAM;MACbC,QAAQ,EAAE,mBAAmB;MAC7BC,KAAK,EAAET;IACT,CAAC,EACD;MACEM,YAAY,EAAE,QAAQ;MACtBC,KAAK,EAAE,QAAQ;MACfC,QAAQ,EAAE,0BAA0B;MACpCC,KAAK,EAAET,UAAU;MACjBU,WAAW,EAAE;IACf,CAAC,EACD;MACEJ,YAAY,EAAE,SAAS;MACvBC,KAAK,EAAE,SAAS;MAChBC,QAAQ,EAAE,0BAA0B;MACpCC,KAAK,EAAET,UAAU;MACjBU,WAAW,EAAE;IACf,CAAC,EACD;MACEJ,YAAY,EAAE,MAAM;MACpBC,KAAK,EAAE,MAAM;MACbC,QAAQ,EAAE,2BAA2B;MACrCC,KAAK,EAAER,eAAe;MACtBS,WAAW,EAAE;IACf,CAAC,CACF,CAAC;EACJ,CAAC,CAAC;EAEFf,EAAE,CAAC,kFAAkF,EAAE,MAAM;IAC3F,MAAMC,MAAM,GAAG,IAAAC,0BAAkB,EAC/B,IAAAC,wCAAoB,EAAC;MAAEC,YAAY,EAAE,SAAS;MAAEnC;IAAW,CAAC,CAC9D,CAAC;IAED,MAAMiD,QAAQ,GAAGjB,MAAM,CAACO,UAAU,CAACC,KAAK,CAACC,GAAG,CAAES,CAAC,IAAKA,CAAC,CAACC,eAAe,CAAC;IACtEJ,MAAM,CAACE,QAAQ,CAACG,KAAK,CAAEC,OAAO,IAAKA,OAAO,KAAKJ,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAACK,IAAI,CAAC,IAAI,CAAC;IACvEP,MAAM,CAACE,QAAQ,CAAC,CAAC,CAAC,CAAC,CAACM,WAAW,CAAC,CAAC;EACnC,CAAC,CAAC;EAEFxB,EAAE,CAAC,yDAAyD,EAAE,MAAM;IAClE,MAAMC,MAAM,GAAG,IAAAC,0BAAkB,EAC/B,IAAAC,wCAAoB,EAAC;MAAEC,YAAY,EAAE,SAAS;MAAEnC;IAAW,CAAC,CAC9D,CAAC;IAED,MAAMwD,WAAW,GAAGxB,MAAM,CAACO,UAAU,CAACC,KAAK,CACxCiB,MAAM,CAAEP,CAAC,IAAKA,CAAC,CAACQ,UAAU,CAAC,CAC3BjB,GAAG,CAAES,CAAC,IAAKA,CAAC,CAACR,YAAY,CAAC;IAC7BK,MAAM,CAACS,WAAW,CAAC,CAACR,OAAO,CAAC,CAAC,YAAY,CAAC,CAAC;EAC7C,CAAC,CAAC;EAEFjB,EAAE,CAAC,mDAAmD,EAAE,MAAM;IAC5D,MAAMC,MAAM,GAAG,IAAAC,0BAAkB,EAC/B,IAAAC,wCAAoB,EAAC;MACnBC,YAAY,EAAE,SAAS;MACvBnC;IACF,CAAC,CACH,CAAC;IAED+C,MAAM,CAACf,MAAM,CAACG,YAAY,CAAC,CAACmB,IAAI,CAAC,SAAS,CAAC;IAC3CP,MAAM,CAACf,MAAM,CAAC2B,cAAc,CAAC,CAACL,IAAI,CAAC,QAAQ,CAAC;EAC9C,CAAC,CAAC;EAEFvB,EAAE,CAAC,4DAA4D,EAAE,MAAM;IACrE,MAAM6B,MAAM,GAAG,IAAAC,yBAAe,EAAS;MACrC9C,IAAI,EAAE,YAAY;MAClBuB,OAAO,EAAE;QACPK,KAAK,EAAE,QAAQ;QACfmB,KAAK,EAAE;UAAEC,KAAK,EAAEA,CAAA,KAAM,IAAI;UAAEC,MAAM,EAAEA,CAAA,KAAM;QAAK;MACjD,CAAC;MACDP,MAAM,EAAE;QAAEQ,UAAU,EAAE;MAAM;IAC9B,CAAC,CAAC;IACF,MAAMjC,MAAM,GAAG,IAAAC,0BAAkB,EAC/B,IAAAC,wCAAoB,EAAC;MACnBC,YAAY,EAAE,SAAS;MACvBnC,UAAU;MACVkE,UAAU,EAAE,CAACN,MAAM;IACrB,CAAC,CACH,CAAC;IAEDb,MAAM,CAACf,MAAM,CAACkC,UAAU,CAAC,CAAClB,OAAO,CAAC,CAACY,MAAM,CAAC,CAAC;EAC7C,CAAC,CAAC;EAEF7B,EAAE,CAAC,0EAA0E,EAAE,YAAY;IACzF,MAAMC,MAAM,GAAG,IAAAC,0BAAkB,EAC/B,IAAAC,wCAAoB,EAAC;MAAEC,YAAY,EAAE,UAAU;MAAEnC;IAAW,CAAC,CAC/D,CAAC;;IAED;IACA+C,MAAM,CAACf,MAAM,CAACmC,UAAU,CAAC,CAACnB,OAAO,CAAC,CAAC,CAAC,CAAC;IAErC,MAAMhB,MAAM,CAACoC,UAAU,CAAC,CAAC;IAEzBrB,MAAM,CAACf,MAAM,CAACmC,UAAU,CAACE,MAAM,CAAC,CAACd,WAAW,CAAC,CAAC;IAC9CR,MAAM,CAACf,MAAM,CAACmC,UAAU,CAACE,MAAM,CAAClC,YAAY,CAAC,CAACmB,IAAI,CAAC,QAAQ,CAAC;EAC9D,CAAC,CAAC;EAEFvB,EAAE,CAAC,6DAA6D,EAAE,YAAY;IAC5E,MAAMuC,MAAM,GAAG,IAAArC,0BAAkB,EAC/B,IAAAC,wCAAoB,EAAC;MAAEC,YAAY,EAAE,QAAQ;MAAEnC;IAAW,CAAC,CAC7D,CAAC;IACD,MAAMgC,MAAM,GAAG,IAAAC,0BAAkB,EAC/B,IAAAC,wCAAoB,EAAC;MACnBC,YAAY,EAAE,UAAU;MACxBnC,UAAU;MACVmE,UAAU,EAAE;QAAEE,MAAM,EAAEC;MAAO;IAC/B,CAAC,CACH,CAAC;IAED,MAAMtC,MAAM,CAACoC,UAAU,CAAC,CAAC;IAEzBrB,MAAM,CAACf,MAAM,CAACmC,UAAU,CAACE,MAAM,CAAC,CAACf,IAAI,CAACgB,MAAM,CAAC;EAC/C,CAAC,CAAC;AACJ,CAAC,CAAC","ignoreList":[]}
|
|
@@ -32,6 +32,15 @@ const waitForCopyTask = async taskId => {
|
|
|
32
32
|
throw err;
|
|
33
33
|
}
|
|
34
34
|
};
|
|
35
|
+
const applyCmsFieldSettings = (cmsField, settings) => {
|
|
36
|
+
if (!settings) {
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
cmsField.description = settings.helpText || undefined;
|
|
40
|
+
cmsField.required = settings.required;
|
|
41
|
+
cmsField.stringLengthRange = settings.characters;
|
|
42
|
+
cmsField.numberRange = settings.values;
|
|
43
|
+
};
|
|
35
44
|
|
|
36
45
|
/**
|
|
37
46
|
* Builds the `FieldActions` for a CMS collection over `@wix/data`. `getCollection`
|
|
@@ -107,6 +116,15 @@ function createCmsFieldActions(collectionId, getCollection) {
|
|
|
107
116
|
}
|
|
108
117
|
return patch;
|
|
109
118
|
};
|
|
119
|
+
const writableFieldProps = source => {
|
|
120
|
+
const {
|
|
121
|
+
systemField,
|
|
122
|
+
capabilities,
|
|
123
|
+
condition,
|
|
124
|
+
...writable
|
|
125
|
+
} = source;
|
|
126
|
+
return writable;
|
|
127
|
+
};
|
|
110
128
|
|
|
111
129
|
/**
|
|
112
130
|
* Clones a CMS field for duplication: drops `systemField`/`capabilities` and clears
|
|
@@ -136,8 +154,9 @@ function createCmsFieldActions(collectionId, getCollection) {
|
|
|
136
154
|
return cloned;
|
|
137
155
|
};
|
|
138
156
|
return {
|
|
139
|
-
addField: async field => {
|
|
157
|
+
addField: async (field, settings) => {
|
|
140
158
|
const cmsField = toCmsField(field, (0, _getFieldKey.getFieldKey)(existingFieldKeys(), field.displayName));
|
|
159
|
+
applyCmsFieldSettings(cmsField, settings);
|
|
141
160
|
const {
|
|
142
161
|
dataCollection
|
|
143
162
|
} = await _data.collections.createDataCollectionField(collectionId, {
|
|
@@ -165,10 +184,23 @@ function createCmsFieldActions(collectionId, getCollection) {
|
|
|
165
184
|
});
|
|
166
185
|
return fieldsAfterMutation(dataCollection);
|
|
167
186
|
},
|
|
168
|
-
editField: async (fieldId, updates) => {
|
|
187
|
+
editField: async (fieldId, updates, settings) => {
|
|
188
|
+
const existingField = findCmsField(fieldId);
|
|
189
|
+
if (!(existingField != null && existingField.type)) {
|
|
190
|
+
throw new Error(`Field ${fieldId} not found`);
|
|
191
|
+
}
|
|
192
|
+
const field = {
|
|
193
|
+
...writableFieldProps(existingField),
|
|
194
|
+
...buildFieldPatch(fieldId, updates),
|
|
195
|
+
key: fieldId,
|
|
196
|
+
type: existingField.type
|
|
197
|
+
};
|
|
198
|
+
applyCmsFieldSettings(field, settings);
|
|
169
199
|
const {
|
|
170
200
|
dataCollection
|
|
171
|
-
} = await _data.collections.
|
|
201
|
+
} = await _data.collections.updateDataCollectionField(collectionId, {
|
|
202
|
+
field
|
|
203
|
+
});
|
|
172
204
|
return fieldsAfterMutation(dataCollection);
|
|
173
205
|
},
|
|
174
206
|
deleteField: async fieldId => {
|