@wix/patterns-cms 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (163) hide show
  1. package/dist/cjs/adapter/__tests__/cmsFieldActions.spec.js +436 -0
  2. package/dist/cjs/adapter/__tests__/cmsFieldActions.spec.js.map +1 -0
  3. package/dist/cjs/adapter/__tests__/cmsPermissions.spec.js +175 -0
  4. package/dist/cjs/adapter/__tests__/cmsPermissions.spec.js.map +1 -0
  5. package/dist/cjs/adapter/__tests__/createCmsBackend.spec.js +440 -0
  6. package/dist/cjs/adapter/__tests__/createCmsBackend.spec.js.map +1 -0
  7. package/dist/cjs/adapter/__tests__/filterUtils.spec.js +426 -0
  8. package/dist/cjs/adapter/__tests__/filterUtils.spec.js.map +1 -0
  9. package/dist/cjs/adapter/__tests__/getFieldKey.spec.js +24 -0
  10. package/dist/cjs/adapter/__tests__/getFieldKey.spec.js.map +1 -0
  11. package/dist/cjs/adapter/__tests__/loadCmsSchema.spec.js +166 -0
  12. package/dist/cjs/adapter/__tests__/loadCmsSchema.spec.js.map +1 -0
  13. package/dist/cjs/adapter/__tests__/searchUtils.spec.js +116 -0
  14. package/dist/cjs/adapter/__tests__/searchUtils.spec.js.map +1 -0
  15. package/dist/cjs/adapter/__tests__/sortUtils.spec.js +118 -0
  16. package/dist/cjs/adapter/__tests__/sortUtils.spec.js.map +1 -0
  17. package/dist/cjs/adapter/__tests__/transformCmsSchema.spec.js +210 -0
  18. package/dist/cjs/adapter/__tests__/transformCmsSchema.spec.js.map +1 -0
  19. package/dist/cjs/adapter/__tests__/wixDataQueryRecorder.js +54 -0
  20. package/dist/cjs/adapter/__tests__/wixDataQueryRecorder.js.map +1 -0
  21. package/dist/cjs/adapter/cmsBackup.js +52 -0
  22. package/dist/cjs/adapter/cmsBackup.js.map +1 -0
  23. package/dist/cjs/adapter/cmsFieldTypeMap.js +43 -0
  24. package/dist/cjs/adapter/cmsFieldTypeMap.js.map +1 -0
  25. package/dist/cjs/adapter/cmsPermissions.js +94 -0
  26. package/dist/cjs/adapter/cmsPermissions.js.map +1 -0
  27. package/dist/cjs/adapter/constants.js +20 -0
  28. package/dist/cjs/adapter/constants.js.map +1 -0
  29. package/dist/cjs/adapter/createCmsBackend.js +131 -0
  30. package/dist/cjs/adapter/createCmsBackend.js.map +1 -0
  31. package/dist/cjs/adapter/createCmsFieldActions.js +182 -0
  32. package/dist/cjs/adapter/createCmsFieldActions.js.map +1 -0
  33. package/dist/cjs/adapter/fetchExternalDbConnections.js +24 -0
  34. package/dist/cjs/adapter/fetchExternalDbConnections.js.map +1 -0
  35. package/dist/cjs/adapter/fetchUserPermissions.js +24 -0
  36. package/dist/cjs/adapter/fetchUserPermissions.js.map +1 -0
  37. package/dist/cjs/adapter/filterUtils.js +128 -0
  38. package/dist/cjs/adapter/filterUtils.js.map +1 -0
  39. package/dist/cjs/adapter/getFieldKey.js +19 -0
  40. package/dist/cjs/adapter/getFieldKey.js.map +1 -0
  41. package/dist/cjs/adapter/index.js +36 -0
  42. package/dist/cjs/adapter/index.js.map +1 -0
  43. package/dist/cjs/adapter/loadCmsSchema.js +51 -0
  44. package/dist/cjs/adapter/loadCmsSchema.js.map +1 -0
  45. package/dist/cjs/adapter/pollUntilReady.js +30 -0
  46. package/dist/cjs/adapter/pollUntilReady.js.map +1 -0
  47. package/dist/cjs/adapter/searchUtils.js +32 -0
  48. package/dist/cjs/adapter/searchUtils.js.map +1 -0
  49. package/dist/cjs/adapter/sortUtils.js +34 -0
  50. package/dist/cjs/adapter/sortUtils.js.map +1 -0
  51. package/dist/cjs/adapter/transformCmsSchema.js +75 -0
  52. package/dist/cjs/adapter/transformCmsSchema.js.map +1 -0
  53. package/dist/cjs/index.js +10 -0
  54. package/dist/cjs/index.js.map +1 -0
  55. package/dist/esm/adapter/__tests__/cmsFieldActions.spec.js +335 -0
  56. package/dist/esm/adapter/__tests__/cmsFieldActions.spec.js.map +1 -0
  57. package/dist/esm/adapter/__tests__/cmsPermissions.spec.js +173 -0
  58. package/dist/esm/adapter/__tests__/cmsPermissions.spec.js.map +1 -0
  59. package/dist/esm/adapter/__tests__/createCmsBackend.spec.js +307 -0
  60. package/dist/esm/adapter/__tests__/createCmsBackend.spec.js.map +1 -0
  61. package/dist/esm/adapter/__tests__/filterUtils.spec.js +298 -0
  62. package/dist/esm/adapter/__tests__/filterUtils.spec.js.map +1 -0
  63. package/dist/esm/adapter/__tests__/getFieldKey.spec.js +22 -0
  64. package/dist/esm/adapter/__tests__/getFieldKey.spec.js.map +1 -0
  65. package/dist/esm/adapter/__tests__/loadCmsSchema.spec.js +147 -0
  66. package/dist/esm/adapter/__tests__/loadCmsSchema.spec.js.map +1 -0
  67. package/dist/esm/adapter/__tests__/searchUtils.spec.js +109 -0
  68. package/dist/esm/adapter/__tests__/searchUtils.spec.js.map +1 -0
  69. package/dist/esm/adapter/__tests__/sortUtils.spec.js +85 -0
  70. package/dist/esm/adapter/__tests__/sortUtils.spec.js.map +1 -0
  71. package/dist/esm/adapter/__tests__/transformCmsSchema.spec.js +201 -0
  72. package/dist/esm/adapter/__tests__/transformCmsSchema.spec.js.map +1 -0
  73. package/dist/esm/adapter/__tests__/wixDataQueryRecorder.js +42 -0
  74. package/dist/esm/adapter/__tests__/wixDataQueryRecorder.js.map +1 -0
  75. package/dist/esm/adapter/cmsBackup.js +34 -0
  76. package/dist/esm/adapter/cmsBackup.js.map +1 -0
  77. package/dist/esm/adapter/cmsFieldTypeMap.js +37 -0
  78. package/dist/esm/adapter/cmsFieldTypeMap.js.map +1 -0
  79. package/dist/esm/adapter/cmsPermissions.js +91 -0
  80. package/dist/esm/adapter/cmsPermissions.js.map +1 -0
  81. package/dist/esm/adapter/constants.js +25 -0
  82. package/dist/esm/adapter/constants.js.map +1 -0
  83. package/dist/esm/adapter/createCmsBackend.js +113 -0
  84. package/dist/esm/adapter/createCmsBackend.js.map +1 -0
  85. package/dist/esm/adapter/createCmsFieldActions.js +159 -0
  86. package/dist/esm/adapter/createCmsFieldActions.js.map +1 -0
  87. package/dist/esm/adapter/fetchExternalDbConnections.js +17 -0
  88. package/dist/esm/adapter/fetchExternalDbConnections.js.map +1 -0
  89. package/dist/esm/adapter/fetchUserPermissions.js +15 -0
  90. package/dist/esm/adapter/fetchUserPermissions.js.map +1 -0
  91. package/dist/esm/adapter/filterUtils.js +126 -0
  92. package/dist/esm/adapter/filterUtils.js.map +1 -0
  93. package/dist/esm/adapter/getFieldKey.js +13 -0
  94. package/dist/esm/adapter/getFieldKey.js.map +1 -0
  95. package/dist/esm/adapter/index.js +15 -0
  96. package/dist/esm/adapter/index.js.map +1 -0
  97. package/dist/esm/adapter/loadCmsSchema.js +48 -0
  98. package/dist/esm/adapter/loadCmsSchema.js.map +1 -0
  99. package/dist/esm/adapter/pollUntilReady.js +24 -0
  100. package/dist/esm/adapter/pollUntilReady.js.map +1 -0
  101. package/dist/esm/adapter/searchUtils.js +24 -0
  102. package/dist/esm/adapter/searchUtils.js.map +1 -0
  103. package/dist/esm/adapter/sortUtils.js +21 -0
  104. package/dist/esm/adapter/sortUtils.js.map +1 -0
  105. package/dist/esm/adapter/transformCmsSchema.js +70 -0
  106. package/dist/esm/adapter/transformCmsSchema.js.map +1 -0
  107. package/dist/esm/index.js +2 -0
  108. package/dist/esm/index.js.map +1 -0
  109. package/dist/types/adapter/__tests__/cmsFieldActions.spec.d.ts +2 -0
  110. package/dist/types/adapter/__tests__/cmsFieldActions.spec.d.ts.map +1 -0
  111. package/dist/types/adapter/__tests__/cmsPermissions.spec.d.ts +2 -0
  112. package/dist/types/adapter/__tests__/cmsPermissions.spec.d.ts.map +1 -0
  113. package/dist/types/adapter/__tests__/createCmsBackend.spec.d.ts +2 -0
  114. package/dist/types/adapter/__tests__/createCmsBackend.spec.d.ts.map +1 -0
  115. package/dist/types/adapter/__tests__/filterUtils.spec.d.ts +2 -0
  116. package/dist/types/adapter/__tests__/filterUtils.spec.d.ts.map +1 -0
  117. package/dist/types/adapter/__tests__/getFieldKey.spec.d.ts +2 -0
  118. package/dist/types/adapter/__tests__/getFieldKey.spec.d.ts.map +1 -0
  119. package/dist/types/adapter/__tests__/loadCmsSchema.spec.d.ts +2 -0
  120. package/dist/types/adapter/__tests__/loadCmsSchema.spec.d.ts.map +1 -0
  121. package/dist/types/adapter/__tests__/searchUtils.spec.d.ts +2 -0
  122. package/dist/types/adapter/__tests__/searchUtils.spec.d.ts.map +1 -0
  123. package/dist/types/adapter/__tests__/sortUtils.spec.d.ts +2 -0
  124. package/dist/types/adapter/__tests__/sortUtils.spec.d.ts.map +1 -0
  125. package/dist/types/adapter/__tests__/transformCmsSchema.spec.d.ts +2 -0
  126. package/dist/types/adapter/__tests__/transformCmsSchema.spec.d.ts.map +1 -0
  127. package/dist/types/adapter/__tests__/wixDataQueryRecorder.d.ts +40 -0
  128. package/dist/types/adapter/__tests__/wixDataQueryRecorder.d.ts.map +1 -0
  129. package/dist/types/adapter/cmsBackup.d.ts +7 -0
  130. package/dist/types/adapter/cmsBackup.d.ts.map +1 -0
  131. package/dist/types/adapter/cmsFieldTypeMap.d.ts +8 -0
  132. package/dist/types/adapter/cmsFieldTypeMap.d.ts.map +1 -0
  133. package/dist/types/adapter/cmsPermissions.d.ts +21 -0
  134. package/dist/types/adapter/cmsPermissions.d.ts.map +1 -0
  135. package/dist/types/adapter/constants.d.ts +14 -0
  136. package/dist/types/adapter/constants.d.ts.map +1 -0
  137. package/dist/types/adapter/createCmsBackend.d.ts +9 -0
  138. package/dist/types/adapter/createCmsBackend.d.ts.map +1 -0
  139. package/dist/types/adapter/createCmsFieldActions.d.ts +8 -0
  140. package/dist/types/adapter/createCmsFieldActions.d.ts.map +1 -0
  141. package/dist/types/adapter/fetchExternalDbConnections.d.ts +11 -0
  142. package/dist/types/adapter/fetchExternalDbConnections.d.ts.map +1 -0
  143. package/dist/types/adapter/fetchUserPermissions.d.ts +7 -0
  144. package/dist/types/adapter/fetchUserPermissions.d.ts.map +1 -0
  145. package/dist/types/adapter/filterUtils.d.ts +14 -0
  146. package/dist/types/adapter/filterUtils.d.ts.map +1 -0
  147. package/dist/types/adapter/getFieldKey.d.ts +3 -0
  148. package/dist/types/adapter/getFieldKey.d.ts.map +1 -0
  149. package/dist/types/adapter/index.d.ts +15 -0
  150. package/dist/types/adapter/index.d.ts.map +1 -0
  151. package/dist/types/adapter/loadCmsSchema.d.ts +29 -0
  152. package/dist/types/adapter/loadCmsSchema.d.ts.map +1 -0
  153. package/dist/types/adapter/pollUntilReady.d.ts +11 -0
  154. package/dist/types/adapter/pollUntilReady.d.ts.map +1 -0
  155. package/dist/types/adapter/searchUtils.d.ts +12 -0
  156. package/dist/types/adapter/searchUtils.d.ts.map +1 -0
  157. package/dist/types/adapter/sortUtils.d.ts +11 -0
  158. package/dist/types/adapter/sortUtils.d.ts.map +1 -0
  159. package/dist/types/adapter/transformCmsSchema.d.ts +12 -0
  160. package/dist/types/adapter/transformCmsSchema.d.ts.map +1 -0
  161. package/dist/types/index.d.ts +2 -0
  162. package/dist/types/index.d.ts.map +1 -0
  163. package/package.json +123 -0
@@ -0,0 +1,307 @@
1
+ import { items } from '@wix/data';
2
+ import { createCmsBackend } from '../createCmsBackend';
3
+ // `bulkInsert`/`backup` wrap calls in errorHandler.withErrorHandler, which needs an
4
+ // initialized Wix SDK context. In a pure-function unit test there is none, so we
5
+ // stub the wrapper to just invoke its callback (the mapping logic is what we assert).
6
+ jest.mock('@wix/essentials', () => ({
7
+ errorHandler: {
8
+ withErrorHandler: (fn) => fn(),
9
+ },
10
+ }));
11
+ // A chainable query stub whose terminal `.find()` resolves to a configurable
12
+ // result. `mockFindResult` is reassigned per-test before the backend call.
13
+ // `mock`-prefixed names are the only out-of-scope refs jest.mock() factories allow.
14
+ let mockFindResult = {
15
+ items: [],
16
+ totalCount: 0,
17
+ };
18
+ jest.mock('@wix/data', () => {
19
+ const queryChain = {};
20
+ [
21
+ 'eq',
22
+ 'include',
23
+ 'skip',
24
+ 'limit',
25
+ 'and',
26
+ 'ge',
27
+ 'le',
28
+ 'ascending',
29
+ 'descending',
30
+ ].forEach((m) => {
31
+ queryChain[m] = jest.fn(() => queryChain);
32
+ });
33
+ queryChain.find = jest.fn(() => Promise.resolve(mockFindResult));
34
+ const filterChain = {};
35
+ ['eq', 'contains', 'or', 'and', 'not'].forEach((m) => {
36
+ filterChain[m] = jest.fn(() => filterChain);
37
+ });
38
+ return {
39
+ __chains: { queryChain, filterChain },
40
+ items: {
41
+ query: jest.fn(() => queryChain),
42
+ filter: jest.fn(() => filterChain),
43
+ insert: jest.fn(),
44
+ update: jest.fn(),
45
+ remove: jest.fn(),
46
+ bulkRemove: jest.fn(),
47
+ bulkInsert: jest.fn(),
48
+ replaceReferences: jest.fn(),
49
+ },
50
+ backups: {},
51
+ };
52
+ });
53
+ // eslint-disable-next-line @typescript-eslint/no-var-requires
54
+ const { queryChain, filterChain } = require('@wix/data').__chains;
55
+ const queryMock = items.query;
56
+ const insert = items.insert;
57
+ const update = items.update;
58
+ const remove = items.remove;
59
+ const bulkRemove = items.bulkRemove;
60
+ const bulkInsert = items.bulkInsert;
61
+ const replaceReferences = items.replaceReferences;
62
+ const COLLECTION_ID = 'collection-1';
63
+ const fieldsWithRefs = {
64
+ title: {
65
+ id: 'title',
66
+ type: 'SHORT_TEXT',
67
+ displayName: 'Title',
68
+ capabilities: { supportedQueryOperators: [], sortable: true },
69
+ },
70
+ author: {
71
+ id: 'author',
72
+ type: 'REFERENCE',
73
+ displayName: 'Author',
74
+ referenceMetadata: { referencedCollectionId: 'authors' },
75
+ capabilities: { supportedQueryOperators: [], sortable: false },
76
+ },
77
+ tags: {
78
+ id: 'tags',
79
+ type: 'MULTI_REFERENCE',
80
+ displayName: 'Tags',
81
+ referenceMetadata: { referencedCollectionId: 'tags-collection' },
82
+ capabilities: { supportedQueryOperators: [], sortable: false },
83
+ },
84
+ };
85
+ /** Calls `backend.find` with the per-call options arg (absent from the erased interface). */
86
+ const findWithOptions = (find, query, options) => find(query, options);
87
+ describe('createCmsBackend', () => {
88
+ beforeEach(() => {
89
+ jest.clearAllMocks();
90
+ mockFindResult = { items: [], totalCount: 0 };
91
+ });
92
+ describe('get', () => {
93
+ it('queries by _id and returns the single matching entity', async () => {
94
+ mockFindResult = { items: [{ _id: 'e1', title: 'Hello' }] };
95
+ const backend = createCmsBackend(COLLECTION_ID, {
96
+ title: fieldsWithRefs.title,
97
+ });
98
+ const entity = await backend.get('e1');
99
+ expect(queryMock).toHaveBeenCalledWith(COLLECTION_ID);
100
+ expect(queryChain.eq).toHaveBeenCalledWith('_id', 'e1');
101
+ expect(entity).toEqual({ _id: 'e1', title: 'Hello' });
102
+ });
103
+ it('includes reference fields when the schema has them', async () => {
104
+ mockFindResult = { items: [{ _id: 'e1' }] };
105
+ const backend = createCmsBackend(COLLECTION_ID, fieldsWithRefs);
106
+ await backend.get('e1');
107
+ expect(queryChain.include).toHaveBeenCalledWith('author', 'tags');
108
+ });
109
+ it('throws when no entity is found', async () => {
110
+ mockFindResult = { items: [] };
111
+ const backend = createCmsBackend(COLLECTION_ID, {
112
+ title: fieldsWithRefs.title,
113
+ });
114
+ await expect(backend.get('missing')).rejects.toThrow('Entity not found: missing');
115
+ });
116
+ });
117
+ describe('create', () => {
118
+ it('inserts the entity and returns it with the created _id', async () => {
119
+ insert.mockResolvedValue({ _id: 'new-1' });
120
+ const backend = createCmsBackend(COLLECTION_ID, {
121
+ title: fieldsWithRefs.title,
122
+ });
123
+ const result = await backend.create({ title: 'Hi' });
124
+ expect(insert).toHaveBeenCalledWith(COLLECTION_ID, { title: 'Hi' });
125
+ expect(result).toEqual({ title: 'Hi', _id: 'new-1' });
126
+ });
127
+ it('syncs multi-reference fields via replaceReferences', async () => {
128
+ insert.mockResolvedValue({ _id: 'new-1' });
129
+ const backend = createCmsBackend(COLLECTION_ID, fieldsWithRefs);
130
+ await backend.create({
131
+ title: 'Hi',
132
+ tags: [{ _id: 't1' }, { _id: 't2' }],
133
+ });
134
+ expect(replaceReferences).toHaveBeenCalledWith(COLLECTION_ID, 'tags', 'new-1', ['t1', 't2']);
135
+ });
136
+ });
137
+ describe('update', () => {
138
+ it('updates the entity and returns it', async () => {
139
+ update.mockResolvedValue(undefined);
140
+ const backend = createCmsBackend(COLLECTION_ID, {
141
+ title: fieldsWithRefs.title,
142
+ });
143
+ const entity = { _id: 'e1', title: 'Edited' };
144
+ const result = await backend.update(entity);
145
+ expect(update).toHaveBeenCalledWith(COLLECTION_ID, entity);
146
+ expect(result).toBe(entity);
147
+ });
148
+ });
149
+ describe('delete / bulkDelete', () => {
150
+ it('removes a single entity by id', async () => {
151
+ remove.mockResolvedValue(undefined);
152
+ const backend = createCmsBackend(COLLECTION_ID, {});
153
+ await backend.delete('e1');
154
+ expect(remove).toHaveBeenCalledWith(COLLECTION_ID, 'e1');
155
+ });
156
+ it('bulk-removes entities by ids', async () => {
157
+ bulkRemove.mockResolvedValue(undefined);
158
+ const backend = createCmsBackend(COLLECTION_ID, {});
159
+ await backend.bulkDelete(['e1', 'e2']);
160
+ expect(bulkRemove).toHaveBeenCalledWith(COLLECTION_ID, ['e1', 'e2']);
161
+ });
162
+ });
163
+ describe('find', () => {
164
+ it('applies skip/limit and computes total and hasNext', async () => {
165
+ mockFindResult = {
166
+ items: [{ _id: 'a' }, { _id: 'b' }],
167
+ totalCount: 5,
168
+ };
169
+ const backend = createCmsBackend(COLLECTION_ID, {
170
+ title: fieldsWithRefs.title,
171
+ });
172
+ const result = await backend.find({
173
+ offset: 0,
174
+ limit: 2,
175
+ });
176
+ expect(queryChain.skip).toHaveBeenCalledWith(0);
177
+ expect(queryChain.limit).toHaveBeenCalledWith(2);
178
+ expect(queryChain.find).toHaveBeenCalledWith({ returnTotalCount: true });
179
+ expect(result.items).toEqual([{ _id: 'a' }, { _id: 'b' }]);
180
+ expect(result.total).toBe(5);
181
+ // 0 + 2 < 5 → there is a next page.
182
+ expect(result.hasNext).toBe(true);
183
+ });
184
+ it('reports hasNext false on the last page', async () => {
185
+ mockFindResult = {
186
+ items: [{ _id: 'e' }],
187
+ totalCount: 3,
188
+ };
189
+ const backend = createCmsBackend(COLLECTION_ID, {
190
+ title: fieldsWithRefs.title,
191
+ });
192
+ const result = await backend.find({ offset: 2, limit: 2 });
193
+ // 2 + 1 === 3 → no next page.
194
+ expect(result.hasNext).toBe(false);
195
+ });
196
+ it('includes only reference fields that are also searchable', async () => {
197
+ mockFindResult = { items: [], totalCount: 0 };
198
+ const backend = createCmsBackend(COLLECTION_ID, fieldsWithRefs);
199
+ // The per-call `options` arg is part of the concrete `createCmsBackend.find`
200
+ // but not the erased `CollectionBackend.find` contract — cast to reach it.
201
+ await findWithOptions(backend.find, { offset: 0, limit: 10 }, {
202
+ searchableFieldIds: ['title', 'author'],
203
+ });
204
+ // 'author' is a reference and searchable → included; 'tags' is not searchable.
205
+ expect(queryChain.include).toHaveBeenCalledWith('author');
206
+ });
207
+ it('does not call include when no reference field is searchable', async () => {
208
+ mockFindResult = { items: [], totalCount: 0 };
209
+ const backend = createCmsBackend(COLLECTION_ID, fieldsWithRefs);
210
+ await findWithOptions(backend.find, { offset: 0, limit: 10 }, {
211
+ searchableFieldIds: ['title'],
212
+ });
213
+ expect(queryChain.include).not.toHaveBeenCalled();
214
+ });
215
+ it('includes no reference fields when called with no options (inert default)', async () => {
216
+ mockFindResult = { items: [], totalCount: 0 };
217
+ const backend = createCmsBackend(COLLECTION_ID, fieldsWithRefs);
218
+ // No options → default searchableFieldIds = [] → no refs included, no search.
219
+ await backend.find({ offset: 0, limit: 10 });
220
+ expect(queryChain.include).not.toHaveBeenCalled();
221
+ });
222
+ // The cases below mirror auto-patterns' end-to-end coverage: the fetch path
223
+ // must actually apply the query's filters/sort/search, not just skip/limit.
224
+ const filterableFields = {
225
+ title: fieldsWithRefs.title,
226
+ price: {
227
+ id: 'price',
228
+ type: 'NUMBER',
229
+ displayName: 'Price',
230
+ capabilities: {
231
+ supportedQueryOperators: ['GTE', 'LTE'],
232
+ sortable: true,
233
+ },
234
+ },
235
+ done: {
236
+ id: 'done',
237
+ type: 'BOOLEAN',
238
+ displayName: 'Done',
239
+ capabilities: { supportedQueryOperators: [], sortable: false },
240
+ },
241
+ };
242
+ it('applies a number range filter from the query', async () => {
243
+ const backend = createCmsBackend(COLLECTION_ID, filterableFields);
244
+ await findWithOptions(backend.find, {
245
+ offset: 0,
246
+ limit: 10,
247
+ filters: { price: { from: 10, to: 100 } },
248
+ }, { filterFieldMapping: { price: { fieldId: 'price' } } });
249
+ expect(queryChain.ge).toHaveBeenCalledWith('price', 10);
250
+ expect(queryChain.le).toHaveBeenCalledWith('price', 100);
251
+ });
252
+ it('applies a checked boolean filter from the query', async () => {
253
+ const backend = createCmsBackend(COLLECTION_ID, filterableFields);
254
+ await findWithOptions(backend.find, {
255
+ offset: 0,
256
+ limit: 10,
257
+ filters: { done: [{ id: 'checked' }] },
258
+ }, { filterFieldMapping: { done: { fieldId: 'done' } } });
259
+ expect(queryChain.eq).toHaveBeenCalledWith('done', true);
260
+ });
261
+ it('applies ascending sort from the query', async () => {
262
+ const backend = createCmsBackend(COLLECTION_ID, filterableFields);
263
+ await backend.find({
264
+ offset: 0,
265
+ limit: 10,
266
+ sort: [{ fieldName: 'title', order: 'asc' }],
267
+ });
268
+ expect(queryChain.ascending).toHaveBeenCalledWith('title');
269
+ });
270
+ it('applies descending sort from the query', async () => {
271
+ const backend = createCmsBackend(COLLECTION_ID, filterableFields);
272
+ await backend.find({
273
+ offset: 0,
274
+ limit: 10,
275
+ sort: [{ fieldName: 'title', order: 'desc' }],
276
+ });
277
+ expect(queryChain.descending).toHaveBeenCalledWith('title');
278
+ });
279
+ it('applies the search term as a contains filter on searchable text fields', async () => {
280
+ const backend = createCmsBackend(COLLECTION_ID, filterableFields);
281
+ await findWithOptions(backend.find, { offset: 0, limit: 10, search: 'hello' }, { searchableFieldIds: ['title'] });
282
+ expect(filterChain.contains).toHaveBeenCalledWith('title', 'hello');
283
+ expect(queryChain.and).toHaveBeenCalledWith(filterChain);
284
+ });
285
+ });
286
+ describe('bulkInsert', () => {
287
+ it('maps inserted/updated to succeeded, errors to failed, and surfaces error rows', async () => {
288
+ bulkInsert.mockResolvedValue({
289
+ inserted: 2,
290
+ updated: 1,
291
+ errors: [{ originalIndex: 4, message: 'bad row', code: 'INVALID' }],
292
+ });
293
+ const backend = createCmsBackend(COLLECTION_ID, {});
294
+ const result = await backend.bulkInsert([{ a: 1 }, { a: 2 }]);
295
+ expect(bulkInsert).toHaveBeenCalledWith(COLLECTION_ID, [
296
+ { a: 1 },
297
+ { a: 2 },
298
+ ]);
299
+ expect(result.succeeded).toBe(3);
300
+ expect(result.failed).toBe(1);
301
+ expect(result.errors).toEqual([
302
+ { rowIndex: 4, message: 'bad row', code: 'INVALID' },
303
+ ]);
304
+ });
305
+ });
306
+ });
307
+ //# sourceMappingURL=createCmsBackend.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createCmsBackend.spec.js","sourceRoot":"","sources":["../../../../src/adapter/__tests__/createCmsBackend.spec.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,298 @@
1
+ import { items } from '@wix/data';
2
+ import { FilterOperator } from '@wix/bex-core';
3
+ import { addFiltersToDataQuery } from '../filterUtils';
4
+ import { BooleanFilters, HasValueFilters } from '../constants';
5
+ import { firstCallArgs, wasCalled, } from './wixDataQueryRecorder';
6
+ // Replace the `@wix/data` `items` builders with chainable recorders so we can
7
+ // assert which WQL operator methods the util produced.
8
+ jest.mock('@wix/data', () => {
9
+ const recorder = require('./wixDataQueryRecorder');
10
+ return {
11
+ items: {
12
+ query: jest.fn(() => recorder.createQueryRecorder()),
13
+ filter: jest.fn(() => recorder.createQueryRecorder()),
14
+ },
15
+ };
16
+ });
17
+ const makeQuery = (filters) => ({ filters });
18
+ describe('addFiltersToDataQuery', () => {
19
+ beforeEach(() => {
20
+ jest.clearAllMocks();
21
+ });
22
+ const numberFields = {
23
+ numberField: {
24
+ id: 'numberField',
25
+ type: 'NUMBER',
26
+ displayName: 'Number Field',
27
+ capabilities: { supportedQueryOperators: ['GTE', 'LTE'], sortable: true },
28
+ },
29
+ };
30
+ it('applies a number range filter as ge (from) and le (to)', () => {
31
+ const dataQuery = items.query('collectionId');
32
+ addFiltersToDataQuery({
33
+ dataQuery: dataQuery,
34
+ query: makeQuery({ numberField: { from: 5, to: 10 } }),
35
+ fields: numberFields,
36
+ filterFieldMapping: { numberField: { fieldId: 'numberField' } },
37
+ });
38
+ expect(firstCallArgs(dataQuery, 'ge')).toEqual(['numberField', 5]);
39
+ expect(firstCallArgs(dataQuery, 'le')).toEqual(['numberField', 10]);
40
+ });
41
+ it('ignores range props whose operator is not supported by the field', () => {
42
+ const dataQuery = items.query('collectionId');
43
+ addFiltersToDataQuery({
44
+ dataQuery: dataQuery,
45
+ query: makeQuery({ numberField: { from: 5, to: 10 } }),
46
+ fields: {
47
+ numberField: {
48
+ id: 'numberField',
49
+ type: 'NUMBER',
50
+ displayName: 'Number Field',
51
+ // Only EQ supported → GTE/LTE range props are dropped.
52
+ capabilities: { supportedQueryOperators: ['EQ'], sortable: true },
53
+ },
54
+ },
55
+ filterFieldMapping: { numberField: { fieldId: 'numberField' } },
56
+ });
57
+ expect(wasCalled(dataQuery, 'ge')).toBe(false);
58
+ expect(wasCalled(dataQuery, 'le')).toBe(false);
59
+ });
60
+ it('returns the query untouched when filterFieldMapping is absent', () => {
61
+ const dataQuery = items.query('collectionId');
62
+ addFiltersToDataQuery({
63
+ dataQuery: dataQuery,
64
+ query: makeQuery({ numberField: { from: 5, to: 10 } }),
65
+ fields: numberFields,
66
+ });
67
+ expect(dataQuery.calls).toHaveLength(0);
68
+ });
69
+ describe('BOOLEAN array filter', () => {
70
+ const booleanFields = {
71
+ booleanField: {
72
+ id: 'booleanField',
73
+ type: 'BOOLEAN',
74
+ displayName: 'Boolean Field',
75
+ capabilities: { supportedQueryOperators: ['EQ'], sortable: true },
76
+ },
77
+ };
78
+ it('applies eq(field, true) when "checked" is selected', () => {
79
+ const dataQuery = items.query('collectionId');
80
+ addFiltersToDataQuery({
81
+ dataQuery: dataQuery,
82
+ query: makeQuery({ booleanField: [{ id: BooleanFilters.checked }] }),
83
+ fields: booleanFields,
84
+ filterFieldMapping: { booleanField: { fieldId: 'booleanField' } },
85
+ });
86
+ expect(firstCallArgs(dataQuery, 'eq')).toEqual(['booleanField', true]);
87
+ });
88
+ it('applies and(eq false OR eq undefined) when "checked" is not selected', () => {
89
+ const dataQuery = items.query('collectionId');
90
+ addFiltersToDataQuery({
91
+ dataQuery: dataQuery,
92
+ query: makeQuery({ booleanField: [{ id: BooleanFilters.unchecked }] }),
93
+ fields: booleanFields,
94
+ filterFieldMapping: { booleanField: { fieldId: 'booleanField' } },
95
+ });
96
+ // No direct eq(true) on the data query — the false-or-undefined branch wraps in .and().
97
+ expect(wasCalled(dataQuery, 'eq')).toBe(false);
98
+ const andArgs = firstCallArgs(dataQuery, 'and');
99
+ expect(andArgs).toBeDefined();
100
+ // The argument is the `falseFilter.or(undefinedFilter)` recorder.
101
+ const falseFilter = andArgs[0];
102
+ const eqValues = falseFilter.calls
103
+ .filter((c) => c.method === 'eq')
104
+ .map((c) => c.args[1]);
105
+ expect(eqValues).toContain(false);
106
+ expect(wasCalled(falseFilter, 'or')).toBe(true);
107
+ });
108
+ });
109
+ describe('HAS_VALUE array filter', () => {
110
+ const richContentFields = {
111
+ richField: {
112
+ id: 'richField',
113
+ type: 'RICH_CONTENT',
114
+ displayName: 'Rich Field',
115
+ capabilities: { supportedQueryOperators: [], sortable: false },
116
+ },
117
+ };
118
+ it('applies isNotEmpty when only "hasValue" is selected', () => {
119
+ const dataQuery = items.query('collectionId');
120
+ addFiltersToDataQuery({
121
+ dataQuery: dataQuery,
122
+ query: makeQuery({ richField: [{ id: HasValueFilters.hasValue }] }),
123
+ fields: richContentFields,
124
+ filterFieldMapping: { richField: { fieldId: 'richField' } },
125
+ });
126
+ expect(firstCallArgs(dataQuery, 'isNotEmpty')).toEqual(['richField']);
127
+ expect(wasCalled(dataQuery, 'isEmpty')).toBe(false);
128
+ });
129
+ it('applies isEmpty when only "noValue" is selected', () => {
130
+ const dataQuery = items.query('collectionId');
131
+ addFiltersToDataQuery({
132
+ dataQuery: dataQuery,
133
+ query: makeQuery({ richField: [{ id: HasValueFilters.noValue }] }),
134
+ fields: richContentFields,
135
+ filterFieldMapping: { richField: { fieldId: 'richField' } },
136
+ });
137
+ expect(firstCallArgs(dataQuery, 'isEmpty')).toEqual(['richField']);
138
+ expect(wasCalled(dataQuery, 'isNotEmpty')).toBe(false);
139
+ });
140
+ it('applies neither when both hasValue and noValue are selected', () => {
141
+ const dataQuery = items.query('collectionId');
142
+ addFiltersToDataQuery({
143
+ dataQuery: dataQuery,
144
+ query: makeQuery({
145
+ richField: [
146
+ { id: HasValueFilters.hasValue },
147
+ { id: HasValueFilters.noValue },
148
+ ],
149
+ }),
150
+ fields: richContentFields,
151
+ filterFieldMapping: { richField: { fieldId: 'richField' } },
152
+ });
153
+ expect(wasCalled(dataQuery, 'isEmpty')).toBe(false);
154
+ expect(wasCalled(dataQuery, 'isNotEmpty')).toBe(false);
155
+ });
156
+ });
157
+ it('applies hasSome for a generic (non-boolean, non-has-value) array filter', () => {
158
+ const dataQuery = items.query('collectionId');
159
+ addFiltersToDataQuery({
160
+ dataQuery: dataQuery,
161
+ query: makeQuery({
162
+ tagsField: [{ id: 'a' }, { id: 'b' }],
163
+ }),
164
+ fields: {
165
+ tagsField: {
166
+ id: 'tagsField',
167
+ type: 'SHORT_TEXT',
168
+ displayName: 'Tags Field',
169
+ capabilities: { supportedQueryOperators: [], sortable: false },
170
+ },
171
+ },
172
+ filterFieldMapping: { tagsField: { fieldId: 'tagsField' } },
173
+ });
174
+ expect(firstCallArgs(dataQuery, 'hasSome')).toEqual([
175
+ 'tagsField',
176
+ ['a', 'b'],
177
+ ]);
178
+ });
179
+ describe('operator object filter', () => {
180
+ const textFields = {
181
+ textField: {
182
+ id: 'textField',
183
+ type: 'SHORT_TEXT',
184
+ displayName: 'Text Field',
185
+ capabilities: { supportedQueryOperators: [], sortable: false },
186
+ },
187
+ };
188
+ it('maps CONTAINS to .contains', () => {
189
+ const dataQuery = items.query('collectionId');
190
+ addFiltersToDataQuery({
191
+ dataQuery: dataQuery,
192
+ query: makeQuery({
193
+ textField: { operator: FilterOperator.CONTAINS, value: 'foo' },
194
+ }),
195
+ fields: textFields,
196
+ filterFieldMapping: { textField: { fieldId: 'textField' } },
197
+ });
198
+ expect(firstCallArgs(dataQuery, 'contains')).toEqual([
199
+ 'textField',
200
+ 'foo',
201
+ ]);
202
+ });
203
+ it('maps IS_EMPTY to .isEmpty(field) (no value argument)', () => {
204
+ const dataQuery = items.query('collectionId');
205
+ addFiltersToDataQuery({
206
+ dataQuery: dataQuery,
207
+ query: makeQuery({
208
+ textField: { operator: FilterOperator.IS_EMPTY },
209
+ }),
210
+ fields: textFields,
211
+ filterFieldMapping: { textField: { fieldId: 'textField' } },
212
+ });
213
+ expect(firstCallArgs(dataQuery, 'isEmpty')).toEqual(['textField']);
214
+ });
215
+ it('maps EXISTS to .isNotEmpty(field)', () => {
216
+ const dataQuery = items.query('collectionId');
217
+ addFiltersToDataQuery({
218
+ dataQuery: dataQuery,
219
+ query: makeQuery({
220
+ textField: { operator: FilterOperator.EXISTS },
221
+ }),
222
+ fields: textFields,
223
+ filterFieldMapping: { textField: { fieldId: 'textField' } },
224
+ });
225
+ expect(firstCallArgs(dataQuery, 'isNotEmpty')).toEqual(['textField']);
226
+ });
227
+ it('maps NOT_CONTAINS to .not(filter().contains(...))', () => {
228
+ const dataQuery = items.query('collectionId');
229
+ addFiltersToDataQuery({
230
+ dataQuery: dataQuery,
231
+ query: makeQuery({
232
+ textField: { operator: FilterOperator.NOT_CONTAINS, value: 'bar' },
233
+ }),
234
+ fields: textFields,
235
+ filterFieldMapping: { textField: { fieldId: 'textField' } },
236
+ });
237
+ const notArgs = firstCallArgs(dataQuery, 'not');
238
+ expect(notArgs).toBeDefined();
239
+ const innerFilter = notArgs[0];
240
+ expect(firstCallArgs(innerFilter, 'contains')).toEqual([
241
+ 'textField',
242
+ 'bar',
243
+ ]);
244
+ });
245
+ it('queries the .formatted nested property for ADDRESS text operators', () => {
246
+ const dataQuery = items.query('collectionId');
247
+ addFiltersToDataQuery({
248
+ dataQuery: dataQuery,
249
+ query: makeQuery({
250
+ addressField: { operator: FilterOperator.CONTAINS, value: 'NYC' },
251
+ }),
252
+ fields: {
253
+ addressField: {
254
+ id: 'addressField',
255
+ type: 'ADDRESS',
256
+ displayName: 'Address Field',
257
+ capabilities: { supportedQueryOperators: [], sortable: false },
258
+ },
259
+ },
260
+ filterFieldMapping: { addressField: { fieldId: 'addressField' } },
261
+ });
262
+ expect(firstCallArgs(dataQuery, 'contains')).toEqual([
263
+ 'addressField.formatted',
264
+ 'NYC',
265
+ ]);
266
+ });
267
+ it('queries the ADDRESS field directly for existence operators (no .formatted)', () => {
268
+ const dataQuery = items.query('collectionId');
269
+ addFiltersToDataQuery({
270
+ dataQuery: dataQuery,
271
+ query: makeQuery({
272
+ addressField: { operator: FilterOperator.IS_EMPTY },
273
+ }),
274
+ fields: {
275
+ addressField: {
276
+ id: 'addressField',
277
+ type: 'ADDRESS',
278
+ displayName: 'Address Field',
279
+ capabilities: { supportedQueryOperators: [], sortable: false },
280
+ },
281
+ },
282
+ filterFieldMapping: { addressField: { fieldId: 'addressField' } },
283
+ });
284
+ expect(firstCallArgs(dataQuery, 'isEmpty')).toEqual(['addressField']);
285
+ });
286
+ });
287
+ it('skips filters for fields not present in filterFieldMapping', () => {
288
+ const dataQuery = items.query('collectionId');
289
+ addFiltersToDataQuery({
290
+ dataQuery: dataQuery,
291
+ query: makeQuery({ numberField: { from: 5, to: 10 } }),
292
+ fields: numberFields,
293
+ filterFieldMapping: {},
294
+ });
295
+ expect(dataQuery.calls).toHaveLength(0);
296
+ });
297
+ });
298
+ //# sourceMappingURL=filterUtils.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"filterUtils.spec.js","sourceRoot":"","sources":["../../../../src/adapter/__tests__/filterUtils.spec.ts"],"names":[],"mappings":"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"}