@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,22 @@
1
+ import { getFieldKey } from '../getFieldKey';
2
+ describe('getFieldKey', () => {
3
+ it('camelCases a multi-word display name', () => {
4
+ expect(getFieldKey([], 'My New Field')).toBe('myNewField');
5
+ });
6
+ it('snake_cases a display name that already contains an underscore', () => {
7
+ expect(getFieldKey([], 'my_field name')).toBe('my_field_name');
8
+ });
9
+ it('strips non-ASCII-alphanumeric characters from the display name', () => {
10
+ expect(getFieldKey([], 'Price ($)')).toBe('price');
11
+ });
12
+ it('returns the base suggestion when there is no collision', () => {
13
+ expect(getFieldKey(['otherField'], 'New Field')).toBe('newField');
14
+ });
15
+ it('appends a numeric suffix when the base key collides', () => {
16
+ expect(getFieldKey(['newField'], 'New Field')).toBe('newField1');
17
+ });
18
+ it('increments the suffix until a free key is found', () => {
19
+ expect(getFieldKey(['newField', 'newField1', 'newField2'], 'New Field')).toBe('newField3');
20
+ });
21
+ });
22
+ //# sourceMappingURL=getFieldKey.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getFieldKey.spec.js","sourceRoot":"","sources":["../../../../src/adapter/__tests__/getFieldKey.spec.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAE7C,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE;IAC3B,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;QAC9C,MAAM,CAAC,WAAW,CAAC,EAAE,EAAE,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IAC7D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gEAAgE,EAAE,GAAG,EAAE;QACxE,MAAM,CAAC,WAAW,CAAC,EAAE,EAAE,eAAe,CAAC,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;IACjE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gEAAgE,EAAE,GAAG,EAAE;QACxE,MAAM,CAAC,WAAW,CAAC,EAAE,EAAE,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACrD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wDAAwD,EAAE,GAAG,EAAE;QAChE,MAAM,CAAC,WAAW,CAAC,CAAC,YAAY,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACpE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qDAAqD,EAAE,GAAG,EAAE;QAC7D,MAAM,CAAC,WAAW,CAAC,CAAC,UAAU,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IACnE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;QACzD,MAAM,CACJ,WAAW,CAAC,CAAC,UAAU,EAAE,WAAW,EAAE,WAAW,CAAC,EAAE,WAAW,CAAC,CACjE,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IACtB,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,147 @@
1
+ import { collections } from '@wix/data';
2
+ import { createCmsSchemaLoader, } from '../loadCmsSchema';
3
+ import { fetchUserPermissions } from '../fetchUserPermissions';
4
+ import { fetchExternalDbConnections } from '../fetchExternalDbConnections';
5
+ jest.mock('@wix/essentials', () => ({
6
+ errorHandler: {
7
+ withErrorHandler: (fn) => fn(),
8
+ },
9
+ }));
10
+ // Keep the real module (cmsFieldTypeMap reads `collections.Type` at evaluation
11
+ // time) and stub only the collection fetch.
12
+ jest.mock('@wix/data', () => {
13
+ const actual = jest.requireActual('@wix/data');
14
+ return {
15
+ ...actual,
16
+ collections: {
17
+ ...actual.collections,
18
+ getDataCollection: jest.fn(),
19
+ },
20
+ };
21
+ });
22
+ jest.mock('../fetchUserPermissions', () => ({
23
+ fetchUserPermissions: jest.fn(),
24
+ }));
25
+ jest.mock('../fetchExternalDbConnections', () => ({
26
+ fetchExternalDbConnections: jest.fn(),
27
+ }));
28
+ const getDataCollection = collections.getDataCollection;
29
+ const fetchUserPermissionsMock = fetchUserPermissions;
30
+ const fetchExternalDbConnectionsMock = fetchExternalDbConnections;
31
+ const COLLECTION_ID = 'collection-1';
32
+ const METASITE_ID = 'msid-1';
33
+ const FIELD_MANAGEMENT_PERMISSIONS = [
34
+ 'WIX_DATA.CREATE_COLLECTION_FIELD',
35
+ 'WIX_DATA.UPDATE_COLLECTION_FIELD',
36
+ 'WIX_DATA.DELETE_COLLECTION_FIELD',
37
+ ];
38
+ const makeCollection = () => ({
39
+ _id: COLLECTION_ID,
40
+ collectionType: 'NATIVE',
41
+ displayField: 'title',
42
+ capabilities: { dataOperations: ['SAVE', 'UPDATE', 'REMOVE'] },
43
+ permissions: {
44
+ read: 'ANYONE',
45
+ insert: 'SITE_MEMBER',
46
+ update: 'SITE_MEMBER',
47
+ remove: 'SITE_MEMBER',
48
+ },
49
+ plugins: [],
50
+ fields: [
51
+ {
52
+ key: 'title',
53
+ type: collections.Type.TEXT,
54
+ systemField: false,
55
+ encrypted: false,
56
+ plugins: [],
57
+ displayName: 'Title',
58
+ capabilities: { queryOperators: [], sortable: true },
59
+ },
60
+ ],
61
+ });
62
+ const httpClient = {};
63
+ describe('createCmsSchemaLoader', () => {
64
+ beforeEach(() => {
65
+ jest.clearAllMocks();
66
+ getDataCollection.mockResolvedValue(makeCollection());
67
+ fetchUserPermissionsMock.mockResolvedValue([]);
68
+ fetchExternalDbConnectionsMock.mockResolvedValue([]);
69
+ });
70
+ it('fetches the collection and returns schema, backend and fieldActions', async () => {
71
+ const loader = createCmsSchemaLoader({ httpClient });
72
+ const { schema, backend, fieldActions } = await loader(COLLECTION_ID);
73
+ expect(getDataCollection).toHaveBeenCalledWith(COLLECTION_ID, {
74
+ includeAllowedDataPermissions: true,
75
+ });
76
+ expect(schema.id).toBe(COLLECTION_ID);
77
+ expect(schema.displayField).toBe('title');
78
+ expect(schema.fields.title?.type).toBe('SHORT_TEXT');
79
+ expect(typeof backend.find).toBe('function');
80
+ expect(typeof backend.get).toBe('function');
81
+ expect(typeof fieldActions?.addField).toBe('function');
82
+ });
83
+ it('denies field management by default (no ABAC fetch)', async () => {
84
+ const loader = createCmsSchemaLoader({ httpClient });
85
+ const { schema } = await loader(COLLECTION_ID);
86
+ expect(fetchUserPermissionsMock).not.toHaveBeenCalled();
87
+ expect(schema.schemaPermissions).toEqual({
88
+ createField: false,
89
+ updateField: false,
90
+ deleteField: false,
91
+ });
92
+ });
93
+ it('fetches ABAC permissions with the host metasiteId and grants field management', async () => {
94
+ fetchUserPermissionsMock.mockResolvedValue(FIELD_MANAGEMENT_PERMISSIONS);
95
+ const loader = createCmsSchemaLoader({
96
+ httpClient,
97
+ includeUserPermissions: true,
98
+ metasiteId: METASITE_ID,
99
+ });
100
+ const { schema } = await loader(COLLECTION_ID);
101
+ expect(fetchUserPermissionsMock).toHaveBeenCalledWith(METASITE_ID);
102
+ expect(schema.schemaPermissions).toEqual({
103
+ createField: true,
104
+ updateField: true,
105
+ deleteField: true,
106
+ });
107
+ });
108
+ it('skips the ABAC fetch when no metasiteId is supplied', async () => {
109
+ const loader = createCmsSchemaLoader({
110
+ httpClient,
111
+ includeUserPermissions: true,
112
+ });
113
+ await loader(COLLECTION_ID);
114
+ expect(fetchUserPermissionsMock).not.toHaveBeenCalled();
115
+ });
116
+ it('uses pre-resolved userPermissions without fetching', async () => {
117
+ const loader = createCmsSchemaLoader({
118
+ httpClient,
119
+ userPermissions: FIELD_MANAGEMENT_PERMISSIONS,
120
+ });
121
+ const { schema } = await loader(COLLECTION_ID);
122
+ expect(fetchUserPermissionsMock).not.toHaveBeenCalled();
123
+ expect(schema.schemaPermissions).toEqual({
124
+ createField: true,
125
+ updateField: true,
126
+ deleteField: true,
127
+ });
128
+ });
129
+ it('still loads the schema when permission/connection fetches fail', async () => {
130
+ fetchUserPermissionsMock.mockRejectedValue(new Error('perms down'));
131
+ fetchExternalDbConnectionsMock.mockRejectedValue(new Error('connections down'));
132
+ const loader = createCmsSchemaLoader({
133
+ httpClient,
134
+ includeUserPermissions: true,
135
+ metasiteId: METASITE_ID,
136
+ });
137
+ const { schema } = await loader(COLLECTION_ID);
138
+ expect(schema.id).toBe(COLLECTION_ID);
139
+ // Failed ABAC fetch degrades to no permissions → field management denied.
140
+ expect(schema.schemaPermissions).toEqual({
141
+ createField: false,
142
+ updateField: false,
143
+ deleteField: false,
144
+ });
145
+ });
146
+ });
147
+ //# sourceMappingURL=loadCmsSchema.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loadCmsSchema.spec.js","sourceRoot":"","sources":["../../../../src/adapter/__tests__/loadCmsSchema.spec.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,109 @@
1
+ import { items } from '@wix/data';
2
+ import { addSearchToDataQuery } from '../searchUtils';
3
+ import { firstCallArgs, wasCalled, } from './wixDataQueryRecorder';
4
+ jest.mock('@wix/data', () => {
5
+ const recorder = require('./wixDataQueryRecorder');
6
+ return {
7
+ items: {
8
+ query: jest.fn(() => recorder.createQueryRecorder()),
9
+ filter: jest.fn(() => recorder.createQueryRecorder()),
10
+ },
11
+ };
12
+ });
13
+ const makeQuery = (search) => ({ search });
14
+ const textField = (id) => ({
15
+ id,
16
+ type: 'SHORT_TEXT',
17
+ displayName: id,
18
+ capabilities: { supportedQueryOperators: [], sortable: true },
19
+ });
20
+ const numberField = (id) => ({
21
+ id,
22
+ type: 'NUMBER',
23
+ displayName: id,
24
+ capabilities: { supportedQueryOperators: [], sortable: true },
25
+ });
26
+ /** Recursively collect every `contains` arg pair across a recorder and any nested filter recorders. */
27
+ const collectContains = (recorder) => {
28
+ const direct = recorder.calls
29
+ .filter((c) => c.method === 'contains')
30
+ .map((c) => c.args);
31
+ const nested = recorder.calls
32
+ .filter((c) => c.method === 'or' || c.method === 'and')
33
+ .flatMap((c) => c.args
34
+ .filter((a) => !!a && Array.isArray(a.calls))
35
+ .flatMap(collectContains));
36
+ return [...direct, ...nested];
37
+ };
38
+ describe('addSearchToDataQuery', () => {
39
+ beforeEach(() => {
40
+ jest.clearAllMocks();
41
+ });
42
+ it('applies a contains filter over a searchable text field', () => {
43
+ const dataQuery = items.query('collectionId');
44
+ addSearchToDataQuery({
45
+ dataQuery: dataQuery,
46
+ query: makeQuery('test'),
47
+ fields: {
48
+ shortTextField: textField('shortTextField'),
49
+ nonShortTextField: numberField('nonShortTextField'),
50
+ },
51
+ searchableFieldIds: ['shortTextField', 'nonShortTextField'],
52
+ });
53
+ // The search filter is attached to the data query via .and(...).
54
+ const andArgs = firstCallArgs(dataQuery, 'and');
55
+ expect(andArgs).toBeDefined();
56
+ const searchFilter = andArgs[0];
57
+ const containsPairs = collectContains(searchFilter);
58
+ // Only the text field is searched — the NUMBER field is ignored.
59
+ expect(containsPairs).toEqual([['shortTextField', 'test']]);
60
+ });
61
+ it('ignores non-text fields even when listed in searchableFieldIds', () => {
62
+ const dataQuery = items.query('collectionId');
63
+ addSearchToDataQuery({
64
+ dataQuery: dataQuery,
65
+ query: makeQuery('test'),
66
+ fields: {
67
+ shortTextField: textField('shortTextField'),
68
+ nonShortTextField: numberField('nonShortTextField'),
69
+ },
70
+ searchableFieldIds: ['nonShortTextField'],
71
+ });
72
+ // No text field is searchable → no .and() filter is attached.
73
+ expect(wasCalled(dataQuery, 'and')).toBe(false);
74
+ });
75
+ it('ORs a contains filter for each searchable text field', () => {
76
+ const dataQuery = items.query('collectionId');
77
+ addSearchToDataQuery({
78
+ dataQuery: dataQuery,
79
+ query: makeQuery('test'),
80
+ fields: {
81
+ ShortTextField1: textField('ShortTextField1'),
82
+ ShortTextField2: textField('ShortTextField2'),
83
+ },
84
+ searchableFieldIds: ['ShortTextField1', 'ShortTextField2'],
85
+ });
86
+ const andArgs = firstCallArgs(dataQuery, 'and');
87
+ expect(andArgs).toBeDefined();
88
+ const searchFilter = andArgs[0];
89
+ // The two field filters are combined with .or(...).
90
+ expect(wasCalled(searchFilter, 'or')).toBe(true);
91
+ const containsPairs = collectContains(searchFilter);
92
+ expect(containsPairs).toEqual(expect.arrayContaining([
93
+ ['ShortTextField1', 'test'],
94
+ ['ShortTextField2', 'test'],
95
+ ]));
96
+ expect(containsPairs).toHaveLength(2);
97
+ });
98
+ it('does nothing for an empty search term', () => {
99
+ const dataQuery = items.query('collectionId');
100
+ addSearchToDataQuery({
101
+ dataQuery: dataQuery,
102
+ query: makeQuery(''),
103
+ fields: { shortTextField: textField('shortTextField') },
104
+ searchableFieldIds: ['shortTextField'],
105
+ });
106
+ expect(dataQuery.calls).toHaveLength(0);
107
+ });
108
+ });
109
+ //# sourceMappingURL=searchUtils.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"searchUtils.spec.js","sourceRoot":"","sources":["../../../../src/adapter/__tests__/searchUtils.spec.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,85 @@
1
+ import { items } from '@wix/data';
2
+ import { addSortToDataQuery } from '../sortUtils';
3
+ import { calledMethods, firstCallArgs, wasCalled, } from './wixDataQueryRecorder';
4
+ jest.mock('@wix/data', () => {
5
+ const recorder = require('./wixDataQueryRecorder');
6
+ return {
7
+ items: {
8
+ query: jest.fn(() => recorder.createQueryRecorder()),
9
+ filter: jest.fn(() => recorder.createQueryRecorder()),
10
+ },
11
+ };
12
+ });
13
+ const makeQuery = (sort) => ({ sort });
14
+ const sortableField = (id, sortable = true) => ({
15
+ id,
16
+ type: 'NUMBER',
17
+ displayName: id,
18
+ capabilities: { supportedQueryOperators: [], sortable },
19
+ });
20
+ describe('addSortToDataQuery', () => {
21
+ beforeEach(() => {
22
+ jest.clearAllMocks();
23
+ });
24
+ it('applies .ascending for an asc sort on a sortable field', () => {
25
+ const dataQuery = items.query('collectionId');
26
+ addSortToDataQuery({
27
+ dataQuery: dataQuery,
28
+ query: makeQuery([{ fieldName: 'numberField', order: 'asc' }]),
29
+ fields: { numberField: sortableField('numberField') },
30
+ });
31
+ expect(firstCallArgs(dataQuery, 'ascending')).toEqual(['numberField']);
32
+ expect(wasCalled(dataQuery, 'descending')).toBe(false);
33
+ });
34
+ it('applies .descending for a desc sort on a sortable field', () => {
35
+ const dataQuery = items.query('collectionId');
36
+ addSortToDataQuery({
37
+ dataQuery: dataQuery,
38
+ query: makeQuery([{ fieldName: 'numberField', order: 'desc' }]),
39
+ fields: { numberField: sortableField('numberField') },
40
+ });
41
+ expect(firstCallArgs(dataQuery, 'descending')).toEqual(['numberField']);
42
+ expect(wasCalled(dataQuery, 'ascending')).toBe(false);
43
+ });
44
+ it('ignores sorts on non-sortable fields', () => {
45
+ const dataQuery = items.query('collectionId');
46
+ addSortToDataQuery({
47
+ dataQuery: dataQuery,
48
+ query: makeQuery([{ fieldName: 'numberField', order: 'asc' }]),
49
+ fields: { numberField: sortableField('numberField', false) },
50
+ });
51
+ expect(dataQuery.calls).toHaveLength(0);
52
+ });
53
+ it('applies multiple sort fields in order', () => {
54
+ const dataQuery = items.query('collectionId');
55
+ addSortToDataQuery({
56
+ dataQuery: dataQuery,
57
+ query: makeQuery([
58
+ { fieldName: 'numberField', order: 'asc' },
59
+ { fieldName: 'shortTextField', order: 'desc' },
60
+ ]),
61
+ fields: {
62
+ numberField: sortableField('numberField'),
63
+ shortTextField: {
64
+ id: 'shortTextField',
65
+ type: 'SHORT_TEXT',
66
+ displayName: 'shortTextField',
67
+ capabilities: { supportedQueryOperators: [], sortable: true },
68
+ },
69
+ },
70
+ });
71
+ expect(calledMethods(dataQuery)).toEqual(['ascending', 'descending']);
72
+ expect(firstCallArgs(dataQuery, 'ascending')).toEqual(['numberField']);
73
+ expect(firstCallArgs(dataQuery, 'descending')).toEqual(['shortTextField']);
74
+ });
75
+ it('ignores a sort whose field is not in the schema', () => {
76
+ const dataQuery = items.query('collectionId');
77
+ addSortToDataQuery({
78
+ dataQuery: dataQuery,
79
+ query: makeQuery([{ fieldName: 'unknownField', order: 'asc' }]),
80
+ fields: { numberField: sortableField('numberField') },
81
+ });
82
+ expect(dataQuery.calls).toHaveLength(0);
83
+ });
84
+ });
85
+ //# sourceMappingURL=sortUtils.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sortUtils.spec.js","sourceRoot":"","sources":["../../../../src/adapter/__tests__/sortUtils.spec.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,201 @@
1
+ import { collections } from '@wix/data';
2
+ import { transformCmsSchema } from '../transformCmsSchema';
3
+ /** Reads referenceMetadata off a (possibly non-reference) Field for assertions. */
4
+ const refMeta = (field) => field
5
+ ?.referenceMetadata;
6
+ const COLLECTION_ID = 'collection-1';
7
+ const makeField = (overrides = {}) => ({
8
+ key: 'field',
9
+ type: collections.Type.TEXT,
10
+ systemField: false,
11
+ encrypted: false,
12
+ plugins: [],
13
+ displayName: 'Field',
14
+ capabilities: { queryOperators: [], sortable: false },
15
+ ...overrides,
16
+ });
17
+ const makeCollection = (fields, overrides = {}) => ({
18
+ _id: COLLECTION_ID,
19
+ collectionType: 'NATIVE',
20
+ capabilities: { dataOperations: ['SAVE', 'UPDATE', 'REMOVE'] },
21
+ permissions: {
22
+ read: 'ANYONE',
23
+ insert: 'SITE_MEMBER',
24
+ update: 'SITE_MEMBER',
25
+ remove: 'SITE_MEMBER',
26
+ },
27
+ plugins: [],
28
+ fields,
29
+ ...overrides,
30
+ });
31
+ describe('transformCmsSchema', () => {
32
+ it('maps CMS fields to the source-neutral Schema and drops keyless fields', () => {
33
+ const collection = makeCollection([
34
+ makeField({
35
+ key: 'field1',
36
+ type: collections.Type.TEXT,
37
+ displayName: 'Field 1',
38
+ capabilities: {
39
+ queryOperators: [collections.QueryOperator.EQ],
40
+ sortable: true,
41
+ },
42
+ }),
43
+ makeField({
44
+ key: 'field2',
45
+ type: collections.Type.NUMBER,
46
+ displayName: 'Field 2',
47
+ capabilities: {
48
+ queryOperators: [
49
+ collections.QueryOperator.GTE,
50
+ collections.QueryOperator.LTE,
51
+ ],
52
+ sortable: true,
53
+ },
54
+ }),
55
+ makeField({
56
+ key: '',
57
+ type: collections.Type.BOOLEAN,
58
+ displayName: 'Empty Key Field',
59
+ capabilities: { queryOperators: [], sortable: false },
60
+ }),
61
+ ]);
62
+ const schema = transformCmsSchema(collection);
63
+ expect(schema.fields).toBeDefined();
64
+ expect(Object.keys(schema.fields).length).toBe(2);
65
+ expect(schema.fields).toHaveProperty('field1');
66
+ expect(schema.fields).toHaveProperty('field2');
67
+ expect(schema.fields).not.toHaveProperty('');
68
+ expect(schema.fields.field1?.type).toBe('SHORT_TEXT');
69
+ expect(schema.fields.field1?.displayName).toBe('Field 1');
70
+ expect(schema.fields.field1?.capabilities?.sortable).toBe(true);
71
+ expect(schema.fields.field1?.capabilities?.supportedQueryOperators).toEqual([collections.QueryOperator.EQ]);
72
+ expect(schema.fields.field2?.type).toBe('NUMBER');
73
+ expect(schema.fields.field2?.displayName).toBe('Field 2');
74
+ expect(schema.fields.field2?.capabilities?.sortable).toBe(true);
75
+ expect(schema.fields.field2?.capabilities?.supportedQueryOperators).toEqual([collections.QueryOperator.GTE, collections.QueryOperator.LTE]);
76
+ });
77
+ it('sets id, idField and displayField from the collection', () => {
78
+ const schema = transformCmsSchema(makeCollection([makeField({ key: 'title' }), makeField({ key: 'other' })], { displayField: 'title' }));
79
+ expect(schema.id).toBe(COLLECTION_ID);
80
+ expect(schema.idField).toBe('_id');
81
+ expect(schema.displayField).toBe('title');
82
+ expect(schema.fields.title?.isPrimary).toBe(true);
83
+ expect(schema.fields.other?.isPrimary).toBe(false);
84
+ });
85
+ it('defaults displayField to "_id" when the collection has none', () => {
86
+ const schema = transformCmsSchema(makeCollection([makeField()]));
87
+ expect(schema.displayField).toBe('_id');
88
+ });
89
+ it('maps encrypted → isPii, description → helpText and systemField → isSystem', () => {
90
+ const schema = transformCmsSchema(makeCollection([
91
+ makeField({
92
+ key: 'secret',
93
+ encrypted: true,
94
+ description: 'A hint',
95
+ systemField: true,
96
+ }),
97
+ ]));
98
+ expect(schema.fields.secret?.isPii).toBe(true);
99
+ expect(schema.fields.secret?.helpText).toBe('A hint');
100
+ expect(schema.fields.secret?.isSystem).toBe(true);
101
+ });
102
+ it('maps validation ranges and required', () => {
103
+ const schema = transformCmsSchema(makeCollection([
104
+ makeField({
105
+ key: 'num',
106
+ type: collections.Type.NUMBER,
107
+ required: true,
108
+ numberRange: { min: 0, max: 10 },
109
+ }),
110
+ makeField({
111
+ key: 'text',
112
+ type: collections.Type.TEXT,
113
+ stringLengthRange: { minLength: 1, maxLength: 5 },
114
+ }),
115
+ ]));
116
+ expect(schema.fields.num?.validation?.required).toBe(true);
117
+ expect(schema.fields.num?.validation?.numberRange).toEqual({
118
+ min: 0,
119
+ max: 10,
120
+ });
121
+ expect(schema.fields.text?.validation?.stringLengthRange).toEqual({
122
+ minLength: 1,
123
+ maxLength: 5,
124
+ });
125
+ });
126
+ it('resolves an unmapped CMS field type to UNKNOWN', () => {
127
+ const schema = transformCmsSchema(makeCollection([
128
+ makeField({
129
+ key: 'weird',
130
+ type: 'SOME_FUTURE_TYPE',
131
+ }),
132
+ ]));
133
+ expect(schema.fields.weird?.type).toBe('UNKNOWN');
134
+ });
135
+ it('attaches referenceMetadata for a REFERENCE field with a target collection', () => {
136
+ const schema = transformCmsSchema(makeCollection([
137
+ makeField({
138
+ key: 'ref',
139
+ type: collections.Type.REFERENCE,
140
+ typeMetadata: {
141
+ reference: { referencedCollectionId: 'other-collection' },
142
+ },
143
+ }),
144
+ ]));
145
+ expect(schema.fields.ref?.type).toBe('REFERENCE');
146
+ expect(refMeta(schema.fields.ref)?.referencedCollectionId).toBe('other-collection');
147
+ });
148
+ it('attaches referenceMetadata for a MULTI_REFERENCE field with a target collection', () => {
149
+ const schema = transformCmsSchema(makeCollection([
150
+ makeField({
151
+ key: 'multiRef',
152
+ type: collections.Type.MULTI_REFERENCE,
153
+ typeMetadata: {
154
+ multiReference: { referencedCollectionId: 'other-collection' },
155
+ },
156
+ }),
157
+ ]));
158
+ expect(schema.fields.multiRef?.type).toBe('MULTI_REFERENCE');
159
+ expect(refMeta(schema.fields.multiRef)?.referencedCollectionId).toBe('other-collection');
160
+ });
161
+ it('degrades a reference field without a target collection to UNKNOWN', () => {
162
+ const schema = transformCmsSchema(makeCollection([
163
+ makeField({ key: 'danglingRef', type: collections.Type.REFERENCE }),
164
+ ]));
165
+ expect(schema.fields.danglingRef?.type).toBe('UNKNOWN');
166
+ expect(refMeta(schema.fields.danglingRef)).toBeUndefined();
167
+ });
168
+ it('projects permissions from the collection and user permissions', () => {
169
+ const schema = transformCmsSchema(makeCollection([makeField()]), {
170
+ userPermissions: [
171
+ 'WIX_DATA.CREATE_COLLECTION_FIELD',
172
+ 'WIX_DATA.UPDATE_COLLECTION_FIELD',
173
+ 'WIX_DATA.DELETE_COLLECTION_FIELD',
174
+ 'WIX_DATA.INSERT',
175
+ 'WIX_DATA.UPDATE',
176
+ 'WIX_DATA.REMOVE',
177
+ ],
178
+ });
179
+ expect(schema.schemaPermissions).toEqual({
180
+ createField: true,
181
+ updateField: true,
182
+ deleteField: true,
183
+ });
184
+ expect(schema.itemPermissions).toEqual({
185
+ createItem: true,
186
+ updateItem: true,
187
+ deleteItem: true,
188
+ });
189
+ });
190
+ it('leaves schemaPermissions undefined for a shared (non-editable) collection', () => {
191
+ const schema = transformCmsSchema(makeCollection([makeField()], { plugins: [{ type: 'SHARED' }] }), {
192
+ userPermissions: [
193
+ 'WIX_DATA.CREATE_COLLECTION_FIELD',
194
+ 'WIX_DATA.UPDATE_COLLECTION_FIELD',
195
+ 'WIX_DATA.DELETE_COLLECTION_FIELD',
196
+ ],
197
+ });
198
+ expect(schema.schemaPermissions).toBeUndefined();
199
+ });
200
+ });
201
+ //# sourceMappingURL=transformCmsSchema.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transformCmsSchema.spec.js","sourceRoot":"","sources":["../../../../src/adapter/__tests__/transformCmsSchema.spec.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,42 @@
1
+ const CHAINABLE_METHODS = [
2
+ 'eq',
3
+ 'ne',
4
+ 'contains',
5
+ 'hasSome',
6
+ 'ge',
7
+ 'le',
8
+ 'gt',
9
+ 'lt',
10
+ 'isEmpty',
11
+ 'isNotEmpty',
12
+ 'ascending',
13
+ 'descending',
14
+ 'include',
15
+ 'skip',
16
+ 'limit',
17
+ 'and',
18
+ 'or',
19
+ 'not',
20
+ ];
21
+ export const createQueryRecorder = () => {
22
+ const recorder = { calls: [] };
23
+ CHAINABLE_METHODS.forEach((method) => {
24
+ recorder[method] = (...args) => {
25
+ recorder.calls.push({ method, args });
26
+ return recorder;
27
+ };
28
+ });
29
+ // `find` is only used by the backend's `find`; util specs never call it.
30
+ recorder.find = (...args) => {
31
+ recorder.calls.push({ method: 'find', args });
32
+ return recorder;
33
+ };
34
+ return recorder;
35
+ };
36
+ /** Returns the args of the first recorded call to `method`, or undefined. */
37
+ export const firstCallArgs = (recorder, method) => recorder.calls.find((c) => c.method === method)?.args;
38
+ /** Returns the recorded methods (in call order). */
39
+ export const calledMethods = (recorder) => recorder.calls.map((c) => c.method);
40
+ /** Whether `method` was recorded at least once. */
41
+ export const wasCalled = (recorder, method) => recorder.calls.some((c) => c.method === method);
42
+ //# sourceMappingURL=wixDataQueryRecorder.js.map