@wix/wix-data-items-common 1.0.52

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 (228) hide show
  1. package/README.md +8 -0
  2. package/dist/cjs/api/ApiClient.js +186 -0
  3. package/dist/cjs/api/ApiClient.js.map +1 -0
  4. package/dist/cjs/api/QueryBase.js +200 -0
  5. package/dist/cjs/api/QueryBase.js.map +1 -0
  6. package/dist/cjs/api/QueryValidator.js +36 -0
  7. package/dist/cjs/api/QueryValidator.js.map +1 -0
  8. package/dist/cjs/api/WixDataAggregate.js +4 -0
  9. package/dist/cjs/api/WixDataAggregate.js.map +1 -0
  10. package/dist/cjs/api/WixDataApi.js +800 -0
  11. package/dist/cjs/api/WixDataApi.js.map +1 -0
  12. package/dist/cjs/api/WixDataFilter.js +2 -0
  13. package/dist/cjs/api/WixDataFilter.js.map +1 -0
  14. package/dist/cjs/api/WixDataPatch.js +139 -0
  15. package/dist/cjs/api/WixDataPatch.js.map +1 -0
  16. package/dist/cjs/api/WixDataQuery.js +4 -0
  17. package/dist/cjs/api/WixDataQuery.js.map +1 -0
  18. package/dist/cjs/api/WixDataResult.js +4 -0
  19. package/dist/cjs/api/WixDataResult.js.map +1 -0
  20. package/dist/cjs/api/common.js +14 -0
  21. package/dist/cjs/api/common.js.map +1 -0
  22. package/dist/cjs/api/errors.js +67 -0
  23. package/dist/cjs/api/errors.js.map +1 -0
  24. package/dist/cjs/api/impl/WixDataAggregateImpl.js +193 -0
  25. package/dist/cjs/api/impl/WixDataAggregateImpl.js.map +1 -0
  26. package/dist/cjs/api/impl/WixDataQueryImpl.js +116 -0
  27. package/dist/cjs/api/impl/WixDataQueryImpl.js.map +1 -0
  28. package/dist/cjs/api/impl/WixDataResultImpl.js +111 -0
  29. package/dist/cjs/api/impl/WixDataResultImpl.js.map +1 -0
  30. package/dist/cjs/api/index.js +32 -0
  31. package/dist/cjs/api/index.js.map +1 -0
  32. package/dist/cjs/api/types.js +2 -0
  33. package/dist/cjs/api/types.js.map +1 -0
  34. package/dist/cjs/errors/base-validator.js +92 -0
  35. package/dist/cjs/errors/base-validator.js.map +1 -0
  36. package/dist/cjs/errors/errors.js +155 -0
  37. package/dist/cjs/errors/errors.js.map +1 -0
  38. package/dist/cjs/errors/index.js +15 -0
  39. package/dist/cjs/errors/index.js.map +1 -0
  40. package/dist/cjs/errors/validations.js +91 -0
  41. package/dist/cjs/errors/validations.js.map +1 -0
  42. package/dist/cjs/external-types.d.js +2 -0
  43. package/dist/cjs/external-types.d.js.map +1 -0
  44. package/dist/cjs/filter/FilterTree.js +154 -0
  45. package/dist/cjs/filter/FilterTree.js.map +1 -0
  46. package/dist/cjs/filter/WithFilter.js +2 -0
  47. package/dist/cjs/filter/WithFilter.js.map +1 -0
  48. package/dist/cjs/filter/filterBuilder.js +53 -0
  49. package/dist/cjs/filter/filterBuilder.js.map +1 -0
  50. package/dist/cjs/filter/filterMixin.js +144 -0
  51. package/dist/cjs/filter/filterMixin.js.map +1 -0
  52. package/dist/cjs/filter/index.js +16 -0
  53. package/dist/cjs/filter/index.js.map +1 -0
  54. package/dist/cjs/index.js +120 -0
  55. package/dist/cjs/index.js.map +1 -0
  56. package/dist/cjs/sort/sortMixin.js +79 -0
  57. package/dist/cjs/sort/sortMixin.js.map +1 -0
  58. package/dist/cjs/test-types.d.js +2 -0
  59. package/dist/cjs/test-types.d.js.map +1 -0
  60. package/dist/cjs/types/api.js +4 -0
  61. package/dist/cjs/types/api.js.map +1 -0
  62. package/dist/cjs/types/data-item-types.js +46 -0
  63. package/dist/cjs/types/data-item-types.js.map +1 -0
  64. package/dist/cjs/types/error.js +2 -0
  65. package/dist/cjs/types/error.js.map +1 -0
  66. package/dist/cjs/types/index.js +16 -0
  67. package/dist/cjs/types/index.js.map +1 -0
  68. package/dist/cjs/utils/base64url.js +51 -0
  69. package/dist/cjs/utils/base64url.js.map +1 -0
  70. package/dist/cjs/utils/clone.js +21 -0
  71. package/dist/cjs/utils/clone.js.map +1 -0
  72. package/dist/cjs/utils/codec.js +64 -0
  73. package/dist/cjs/utils/codec.js.map +1 -0
  74. package/dist/cjs/utils/field-key-utils.js +18 -0
  75. package/dist/cjs/utils/field-key-utils.js.map +1 -0
  76. package/dist/cjs/utils/index.js +25 -0
  77. package/dist/cjs/utils/index.js.map +1 -0
  78. package/dist/cjs/utils/type-utils.js +54 -0
  79. package/dist/cjs/utils/type-utils.js.map +1 -0
  80. package/dist/esm/api/ApiClient.js +174 -0
  81. package/dist/esm/api/ApiClient.js.map +1 -0
  82. package/dist/esm/api/QueryBase.js +117 -0
  83. package/dist/esm/api/QueryBase.js.map +1 -0
  84. package/dist/esm/api/QueryValidator.js +32 -0
  85. package/dist/esm/api/QueryValidator.js.map +1 -0
  86. package/dist/esm/api/WixDataAggregate.js +2 -0
  87. package/dist/esm/api/WixDataAggregate.js.map +1 -0
  88. package/dist/esm/api/WixDataApi.js +829 -0
  89. package/dist/esm/api/WixDataApi.js.map +1 -0
  90. package/dist/esm/api/WixDataFilter.js +2 -0
  91. package/dist/esm/api/WixDataFilter.js.map +1 -0
  92. package/dist/esm/api/WixDataPatch.js +134 -0
  93. package/dist/esm/api/WixDataPatch.js.map +1 -0
  94. package/dist/esm/api/WixDataQuery.js +2 -0
  95. package/dist/esm/api/WixDataQuery.js.map +1 -0
  96. package/dist/esm/api/WixDataResult.js +2 -0
  97. package/dist/esm/api/WixDataResult.js.map +1 -0
  98. package/dist/esm/api/common.js +10 -0
  99. package/dist/esm/api/common.js.map +1 -0
  100. package/dist/esm/api/errors.js +52 -0
  101. package/dist/esm/api/errors.js.map +1 -0
  102. package/dist/esm/api/impl/WixDataAggregateImpl.js +214 -0
  103. package/dist/esm/api/impl/WixDataAggregateImpl.js.map +1 -0
  104. package/dist/esm/api/impl/WixDataQueryImpl.js +119 -0
  105. package/dist/esm/api/impl/WixDataQueryImpl.js.map +1 -0
  106. package/dist/esm/api/impl/WixDataResultImpl.js +100 -0
  107. package/dist/esm/api/impl/WixDataResultImpl.js.map +1 -0
  108. package/dist/esm/api/index.js +5 -0
  109. package/dist/esm/api/index.js.map +1 -0
  110. package/dist/esm/api/types.js +2 -0
  111. package/dist/esm/api/types.js.map +1 -0
  112. package/dist/esm/errors/base-validator.js +71 -0
  113. package/dist/esm/errors/base-validator.js.map +1 -0
  114. package/dist/esm/errors/errors.js +147 -0
  115. package/dist/esm/errors/errors.js.map +1 -0
  116. package/dist/esm/errors/index.js +5 -0
  117. package/dist/esm/errors/index.js.map +1 -0
  118. package/dist/esm/errors/validations.js +114 -0
  119. package/dist/esm/errors/validations.js.map +1 -0
  120. package/dist/esm/filter/FilterTree.js +148 -0
  121. package/dist/esm/filter/FilterTree.js.map +1 -0
  122. package/dist/esm/filter/WithFilter.js +2 -0
  123. package/dist/esm/filter/WithFilter.js.map +1 -0
  124. package/dist/esm/filter/filterBuilder.js +43 -0
  125. package/dist/esm/filter/filterBuilder.js.map +1 -0
  126. package/dist/esm/filter/filterMixin.js +137 -0
  127. package/dist/esm/filter/filterMixin.js.map +1 -0
  128. package/dist/esm/filter/index.js +5 -0
  129. package/dist/esm/filter/index.js.map +1 -0
  130. package/dist/esm/index.js +9 -0
  131. package/dist/esm/index.js.map +1 -0
  132. package/dist/esm/sort/sortMixin.js +74 -0
  133. package/dist/esm/sort/sortMixin.js.map +1 -0
  134. package/dist/esm/types/api.js +2 -0
  135. package/dist/esm/types/api.js.map +1 -0
  136. package/dist/esm/types/data-item-types.js +35 -0
  137. package/dist/esm/types/data-item-types.js.map +1 -0
  138. package/dist/esm/types/error.js +2 -0
  139. package/dist/esm/types/error.js.map +1 -0
  140. package/dist/esm/types/index.js +3 -0
  141. package/dist/esm/types/index.js.map +1 -0
  142. package/dist/esm/utils/base64url.js +57 -0
  143. package/dist/esm/utils/base64url.js.map +1 -0
  144. package/dist/esm/utils/clone.js +18 -0
  145. package/dist/esm/utils/clone.js.map +1 -0
  146. package/dist/esm/utils/codec.js +60 -0
  147. package/dist/esm/utils/codec.js.map +1 -0
  148. package/dist/esm/utils/field-key-utils.js +14 -0
  149. package/dist/esm/utils/field-key-utils.js.map +1 -0
  150. package/dist/esm/utils/index.js +7 -0
  151. package/dist/esm/utils/index.js.map +1 -0
  152. package/dist/esm/utils/type-utils.js +40 -0
  153. package/dist/esm/utils/type-utils.js.map +1 -0
  154. package/dist/types/api/ApiClient.d.ts +30 -0
  155. package/dist/types/api/ApiClient.d.ts.map +1 -0
  156. package/dist/types/api/QueryBase.d.ts +111 -0
  157. package/dist/types/api/QueryBase.d.ts.map +1 -0
  158. package/dist/types/api/QueryValidator.d.ts +12 -0
  159. package/dist/types/api/QueryValidator.d.ts.map +1 -0
  160. package/dist/types/api/WixDataAggregate.d.ts +320 -0
  161. package/dist/types/api/WixDataAggregate.d.ts.map +1 -0
  162. package/dist/types/api/WixDataApi.d.ts +52 -0
  163. package/dist/types/api/WixDataApi.d.ts.map +1 -0
  164. package/dist/types/api/WixDataFilter.d.ts +424 -0
  165. package/dist/types/api/WixDataFilter.d.ts.map +1 -0
  166. package/dist/types/api/WixDataPatch.d.ts +80 -0
  167. package/dist/types/api/WixDataPatch.d.ts.map +1 -0
  168. package/dist/types/api/WixDataQuery.d.ts +702 -0
  169. package/dist/types/api/WixDataQuery.d.ts.map +1 -0
  170. package/dist/types/api/WixDataResult.d.ts +144 -0
  171. package/dist/types/api/WixDataResult.d.ts.map +1 -0
  172. package/dist/types/api/common.d.ts +3 -0
  173. package/dist/types/api/common.d.ts.map +1 -0
  174. package/dist/types/api/errors.d.ts +12 -0
  175. package/dist/types/api/errors.d.ts.map +1 -0
  176. package/dist/types/api/impl/WixDataAggregateImpl.d.ts +76 -0
  177. package/dist/types/api/impl/WixDataAggregateImpl.d.ts.map +1 -0
  178. package/dist/types/api/impl/WixDataQueryImpl.d.ts +72 -0
  179. package/dist/types/api/impl/WixDataQueryImpl.d.ts.map +1 -0
  180. package/dist/types/api/impl/WixDataResultImpl.d.ts +34 -0
  181. package/dist/types/api/impl/WixDataResultImpl.d.ts.map +1 -0
  182. package/dist/types/api/index.d.ts +11 -0
  183. package/dist/types/api/index.d.ts.map +1 -0
  184. package/dist/types/api/types.d.ts +163 -0
  185. package/dist/types/api/types.d.ts.map +1 -0
  186. package/dist/types/errors/base-validator.d.ts +28 -0
  187. package/dist/types/errors/base-validator.d.ts.map +1 -0
  188. package/dist/types/errors/errors.d.ts +108 -0
  189. package/dist/types/errors/errors.d.ts.map +1 -0
  190. package/dist/types/errors/index.d.ts +5 -0
  191. package/dist/types/errors/index.d.ts.map +1 -0
  192. package/dist/types/errors/validations.d.ts +25 -0
  193. package/dist/types/errors/validations.d.ts.map +1 -0
  194. package/dist/types/filter/FilterTree.d.ts +56 -0
  195. package/dist/types/filter/FilterTree.d.ts.map +1 -0
  196. package/dist/types/filter/WithFilter.d.ts +470 -0
  197. package/dist/types/filter/WithFilter.d.ts.map +1 -0
  198. package/dist/types/filter/filterBuilder.d.ts +105 -0
  199. package/dist/types/filter/filterBuilder.d.ts.map +1 -0
  200. package/dist/types/filter/filterMixin.d.ts +61 -0
  201. package/dist/types/filter/filterMixin.d.ts.map +1 -0
  202. package/dist/types/filter/index.d.ts +8 -0
  203. package/dist/types/filter/index.d.ts.map +1 -0
  204. package/dist/types/index.d.ts +13 -0
  205. package/dist/types/index.d.ts.map +1 -0
  206. package/dist/types/sort/sortMixin.d.ts +46 -0
  207. package/dist/types/sort/sortMixin.d.ts.map +1 -0
  208. package/dist/types/types/api.d.ts +36 -0
  209. package/dist/types/types/api.d.ts.map +1 -0
  210. package/dist/types/types/data-item-types.d.ts +1448 -0
  211. package/dist/types/types/data-item-types.d.ts.map +1 -0
  212. package/dist/types/types/error.d.ts +23 -0
  213. package/dist/types/types/error.d.ts.map +1 -0
  214. package/dist/types/types/index.d.ts +4 -0
  215. package/dist/types/types/index.d.ts.map +1 -0
  216. package/dist/types/utils/base64url.d.ts +2 -0
  217. package/dist/types/utils/base64url.d.ts.map +1 -0
  218. package/dist/types/utils/clone.d.ts +2 -0
  219. package/dist/types/utils/clone.d.ts.map +1 -0
  220. package/dist/types/utils/codec.d.ts +3 -0
  221. package/dist/types/utils/codec.d.ts.map +1 -0
  222. package/dist/types/utils/field-key-utils.d.ts +2 -0
  223. package/dist/types/utils/field-key-utils.d.ts.map +1 -0
  224. package/dist/types/utils/index.d.ts +7 -0
  225. package/dist/types/utils/index.d.ts.map +1 -0
  226. package/dist/types/utils/type-utils.d.ts +11 -0
  227. package/dist/types/utils/type-utils.d.ts.map +1 -0
  228. package/package.json +89 -0
@@ -0,0 +1,829 @@
1
+ import { apiValidator, codes, validationError, messages, BulkError, } from '../errors';
2
+ import * as apiTypes from '../types/data-item-types';
3
+ import { hasField, isObject, isArray } from '../utils';
4
+ import { filterBuilder } from './common';
5
+ import { WixDataQueryImpl } from './impl/WixDataQueryImpl';
6
+ import { WixDataResultImpl } from './impl/WixDataResultImpl';
7
+ import { WixDataAggregateImpl } from './impl/WixDataAggregateImpl';
8
+ import { ApiClient } from './ApiClient';
9
+ import { toKnownCode } from './errors';
10
+ import { WixDataPatch, WixDataBulkPatch } from './WixDataPatch';
11
+ export class WixDataApi {
12
+ constructor(clientFactory, allowGet, environment, gridAppId, tracer) {
13
+ this.environment = environment;
14
+ this.gridAppId = gridAppId;
15
+ this.tracer = tracer;
16
+ // NOTE sort method for builder is not implemented
17
+ this.truncate = withArgs(async (args, collectionName, options) => {
18
+ await apiValidator()
19
+ .arity('truncate', args, 1, 2)
20
+ .collectionName(collectionName)
21
+ .options(options)
22
+ .validateAndReject();
23
+ return this.trace('truncate', { collectionName })(async (env) => {
24
+ await this.client.truncateDataItems({
25
+ ...env,
26
+ dataCollectionId: collectionName,
27
+ ...toOptions(options),
28
+ });
29
+ });
30
+ });
31
+ // --- single-item methods ---
32
+ this.get = withArgs(async (args, collectionName, itemId, options) => {
33
+ await apiValidator()
34
+ .arity('get', args, 2, 3)
35
+ .collectionName(collectionName)
36
+ .itemId(itemId)
37
+ .options(options)
38
+ .validateAndReject();
39
+ return this.trace('get', { collectionName, itemId })(async (env) => {
40
+ const { dataItem } = await this.client
41
+ .getDataItem({
42
+ ...env,
43
+ dataCollectionId: collectionName,
44
+ dataItemId: itemId,
45
+ ...toReadOptions(options),
46
+ fields: options?.fields,
47
+ })
48
+ .catch(recover(codes.ItemDoesNotExist, {}));
49
+ return dataItem ? toDataItem(dataItem) : null;
50
+ });
51
+ });
52
+ this.insert = withArgs(async (args, collectionName, item, options) => {
53
+ await apiValidator()
54
+ .arity('insert', args, 2, 3)
55
+ .collectionName(collectionName)
56
+ .item(item, collectionName, false)
57
+ .options(options)
58
+ .validateAndReject();
59
+ warnAboutBrokenFields(item);
60
+ return this.trace('insert', { collectionName })(async (env) => {
61
+ const { dataItem } = await this.client.insertDataItem({
62
+ ...env,
63
+ dataCollectionId: collectionName,
64
+ dataItem: {
65
+ id: item._id,
66
+ data: item,
67
+ },
68
+ includeReferencedItems: options?.includeReferences,
69
+ ...toOptions(options),
70
+ });
71
+ return toDataItem(dataItem);
72
+ });
73
+ });
74
+ this.save = withArgs(async (args, collectionName, item, options) => {
75
+ await apiValidator()
76
+ .arity('save', args, 2, 3)
77
+ .collectionName(collectionName)
78
+ .item(item, collectionName, false)
79
+ .options(options)
80
+ .validateAndReject();
81
+ return this.trace('save', { collectionName })(async (env) => {
82
+ const { dataItem } = await this.client.saveDataItem({
83
+ ...env,
84
+ dataCollectionId: collectionName,
85
+ dataItem: {
86
+ id: item._id,
87
+ data: item,
88
+ },
89
+ ...toOptions(options),
90
+ includeReferencedItems: options?.includeReferences,
91
+ });
92
+ return toDataItem(dataItem);
93
+ });
94
+ });
95
+ this.update = withArgs(async (args, collectionName, item, options) => {
96
+ await apiValidator()
97
+ .arity('update', args, 2, 3)
98
+ .collectionName(collectionName)
99
+ .item(item, collectionName, false)
100
+ .options(options)
101
+ .validateAndReject();
102
+ return this.trace('update', { collectionName })(async (env) => {
103
+ const { dataItem } = await this.client.updateDataItem({
104
+ ...env,
105
+ dataCollectionId: collectionName,
106
+ dataItem: {
107
+ id: item._id,
108
+ data: item,
109
+ },
110
+ ...toOptions(options),
111
+ includeReferencedItems: options?.includeReferences,
112
+ });
113
+ return toDataItem(dataItem);
114
+ });
115
+ });
116
+ this.remove = withArgs(async (args, collectionName, itemId, options) => {
117
+ await apiValidator()
118
+ .arity('remove', args, 2, 3)
119
+ .collectionName(collectionName)
120
+ .itemId(itemId)
121
+ .options(options)
122
+ .validateAndReject();
123
+ return this.trace('remove', { collectionName, itemId })(async (env) => {
124
+ const { dataItem } = await this.client
125
+ .removeDataItem({
126
+ ...env,
127
+ dataCollectionId: collectionName,
128
+ dataItemId: itemId,
129
+ ...toOptions(options),
130
+ })
131
+ .catch(recover(codes.ItemDoesNotExist, {}));
132
+ return dataItem ? toDataItem(dataItem) : null;
133
+ });
134
+ });
135
+ this.toFieldUpdateApi = (fieldUpdate) => {
136
+ switch (fieldUpdate.action) {
137
+ case 'SET_FIELD':
138
+ return {
139
+ action: apiTypes.ACTION.SET_FIELD,
140
+ fieldPath: fieldUpdate.fieldPath,
141
+ setField: {
142
+ value: fieldUpdate.actionOptions,
143
+ },
144
+ };
145
+ case 'REMOVE_FIELD':
146
+ return {
147
+ action: apiTypes.ACTION.REMOVE_FIELD,
148
+ fieldPath: fieldUpdate.fieldPath,
149
+ };
150
+ case 'INCREMENT_FIELD':
151
+ return {
152
+ action: apiTypes.ACTION.INCREMENT_FIELD,
153
+ fieldPath: fieldUpdate.fieldPath,
154
+ incrementField: {
155
+ value: fieldUpdate.actionOptions,
156
+ },
157
+ };
158
+ case 'APPEND_TO_ARRAY':
159
+ return {
160
+ action: apiTypes.ACTION.APPEND_TO_ARRAY,
161
+ fieldPath: fieldUpdate.fieldPath,
162
+ appendToArray: {
163
+ value: fieldUpdate.actionOptions,
164
+ },
165
+ };
166
+ case 'REMOVE_FROM_ARRAY':
167
+ return {
168
+ action: apiTypes.ACTION.REMOVE_FROM_ARRAY,
169
+ fieldPath: fieldUpdate.fieldPath,
170
+ removeFromArray: {
171
+ value: fieldUpdate.actionOptions,
172
+ },
173
+ };
174
+ default:
175
+ throw new Error('Invalid patch action');
176
+ }
177
+ };
178
+ this.patch = (collectionName, itemId) => {
179
+ return new WixDataPatch({
180
+ collectionName,
181
+ itemId,
182
+ onRun: async (_args, patchParams, options) => {
183
+ const fieldUpdates = patchParams.fieldUpdates.map(this.toFieldUpdateApi);
184
+ return this.trace('patch', { collectionName })(async (env) => {
185
+ const result = await this.client.patchDataItem({
186
+ ...env,
187
+ dataCollectionId: patchParams.collectionName,
188
+ patchSet: {
189
+ dataItemId: patchParams.itemId,
190
+ fieldUpdates,
191
+ },
192
+ ...toOptions(options),
193
+ });
194
+ return result.dataItem ? toDataItem(result.dataItem) : null;
195
+ });
196
+ },
197
+ });
198
+ };
199
+ this.bulkPatch = (collectionName, itemIds) => {
200
+ return new WixDataBulkPatch({
201
+ collectionName,
202
+ itemIds,
203
+ onRun: async (_args, patchParams, options) => {
204
+ const fieldUpdates = patchParams.fieldUpdates.map(this.toFieldUpdateApi);
205
+ return this.trace('bulkPatch', { collectionName })(async (env) => {
206
+ const { results } = await this.client.bulkPatchDataItems({
207
+ ...env,
208
+ dataCollectionId: patchParams.collectionName,
209
+ patchSets: patchParams.itemIds.map((itemId) => ({
210
+ dataItemId: itemId,
211
+ fieldUpdates,
212
+ })),
213
+ ...toOptions(options),
214
+ });
215
+ return toBulkResult(itemIds, results, ['WDE0073']);
216
+ });
217
+ },
218
+ });
219
+ };
220
+ // --- query, count, distinct ---
221
+ this.query = (collectionName) => {
222
+ const ensureValidQuery = (invalidArgs) => {
223
+ if (invalidArgs.length > 0) {
224
+ throw validationError(messages.queryValidations.queryInvalid(collectionName, invalidArgs));
225
+ }
226
+ };
227
+ return new WixDataQueryImpl({
228
+ collectionName,
229
+ onCount: async (args, params, options) => {
230
+ ensureValidQuery([
231
+ ...params.invalidArguments,
232
+ ...apiValidator()
233
+ .collectionName(collectionName)
234
+ .arity('count', args, 0, 1)
235
+ .options(options)
236
+ .validateAndReturn(),
237
+ ]);
238
+ return this.trace('count', { collectionName })(async (env) => {
239
+ const { totalCount } = await this.client.countDataItems({
240
+ ...env,
241
+ dataCollectionId: collectionName,
242
+ filter: params.filterTree,
243
+ ...toReadOptions(options),
244
+ });
245
+ return totalCount;
246
+ });
247
+ },
248
+ onDistinct: async (args, params, field, options) => {
249
+ ensureValidQuery([
250
+ ...params.invalidArguments,
251
+ ...apiValidator()
252
+ .collectionName(collectionName)
253
+ .arity('distinct', args, 1, 2)
254
+ .fieldName(field)
255
+ .options(options)
256
+ .validateAndReturn(),
257
+ ]);
258
+ const order = toSort(params.orderBy).find((o) => o.fieldName === field)?.order;
259
+ const fetch = (cursorOrOffset, returnTotalCount) => this.trace('distinct', { collectionName, field })(async (env) => {
260
+ const { distinctValues, pagingMetadata } = await this.client.queryDistinctValues({
261
+ ...env,
262
+ dataCollectionId: collectionName,
263
+ ...toReadOptions(options),
264
+ ...toPaging(params.limitNumber, cursorOrOffset),
265
+ ...(isOffset(cursorOrOffset)
266
+ ? {
267
+ fieldName: field,
268
+ filter: params.filterTree,
269
+ order,
270
+ returnTotalCount,
271
+ }
272
+ : {}),
273
+ });
274
+ return [distinctValues, pagingMetadata];
275
+ });
276
+ const [items, paging] = await fetch(params.skipNumber, options?.returnTotalCount);
277
+ return new WixDataResultImpl(items, paging, fetch, params);
278
+ },
279
+ onFind: async (args, params, options) => {
280
+ ensureValidQuery([
281
+ ...params.invalidArguments,
282
+ ...apiValidator()
283
+ .collectionName(collectionName)
284
+ .arity('find', args, 0, 1)
285
+ .options(options)
286
+ .validateAndReturn(),
287
+ ]);
288
+ const fetch = (cursorOrOffset, returnTotalCount) => this.trace('query', { collectionName })(async (env) => {
289
+ const { dataItems, pagingMetadata } = await this.client.queryDataItems({
290
+ ...env,
291
+ dataCollectionId: collectionName,
292
+ query: {
293
+ fields: params.projectedFields,
294
+ ...toPaging(params.limitNumber, cursorOrOffset),
295
+ ...(isOffset(cursorOrOffset)
296
+ ? {
297
+ filter: params.filterTree,
298
+ sort: toSort(params.orderBy),
299
+ }
300
+ : {}),
301
+ },
302
+ referencedItemOptions: params.included,
303
+ ...toReadOptions(options),
304
+ ...(isOffset(cursorOrOffset) ? { returnTotalCount } : {}),
305
+ });
306
+ return [dataItems.map(toDataItem), pagingMetadata];
307
+ });
308
+ const [items, paging] = await fetch(params.skipNumber, options?.returnTotalCount);
309
+ return new WixDataResultImpl(items, paging, fetch, params);
310
+ },
311
+ });
312
+ };
313
+ // NOTE find method is not implemented
314
+ this.fetch = withArgs(async (args, collectionName, cursor, limit, options) => {
315
+ await apiValidator()
316
+ .arity('fetch', args, 2, 4)
317
+ .collectionName(collectionName)
318
+ .isNonEmptyString(cursor, 'cursor')
319
+ .validateAndReject();
320
+ const fetch = (cursorOrOffset) => this.trace('query', { collectionName })(async (env) => {
321
+ const { dataItems, pagingMetadata } = await this.client.queryDataItems({
322
+ ...env,
323
+ dataCollectionId: collectionName,
324
+ query: {
325
+ ...toPaging(limit, cursorOrOffset),
326
+ },
327
+ ...toReadOptions(options),
328
+ });
329
+ return [dataItems.map(toDataItem), pagingMetadata];
330
+ });
331
+ const [items, paging] = await fetch(cursor);
332
+ return new WixDataResultImpl(items, paging, fetch, {
333
+ limitNumber: limit,
334
+ collectionName,
335
+ skipNumber: 0,
336
+ });
337
+ });
338
+ // --- aggregate ---
339
+ this.aggregate = (collectionName) => {
340
+ return new WixDataAggregateImpl({
341
+ collectionName,
342
+ onRun: async (args, params, options) => {
343
+ const validationErrors = [
344
+ ...params.invalidArguments,
345
+ ...apiValidator()
346
+ .arity('run', args, 0, 1)
347
+ .collectionName(collectionName)
348
+ .options(options)
349
+ .validateAndReturn(),
350
+ ];
351
+ if (validationErrors.length > 0) {
352
+ throw validationError(messages.aggregateValidations.aggregateInvalid(collectionName, validationErrors));
353
+ }
354
+ const fetch = (cursorOrOffset, returnTotalCount) => this.trace('aggregate', { collectionName })(async (env) => {
355
+ const toOperation = (field) => field ? { itemFieldName: field } : undefined;
356
+ const { results, pagingMetadata } = await this.client.aggregateDataItems({
357
+ ...env,
358
+ dataCollectionId: collectionName,
359
+ ...toPaging(params.limitNumber, cursorOrOffset),
360
+ ...toReadOptions(options),
361
+ ...(isOffset(cursorOrOffset)
362
+ ? {
363
+ initialFilter: params.filterTree,
364
+ aggregation: {
365
+ groupingFields: params.groupBy,
366
+ operations: params.aggregates.map((a) => ({
367
+ resultFieldName: a.name,
368
+ average: toOperation(a.avg),
369
+ min: toOperation(a.min),
370
+ max: toOperation(a.max),
371
+ sum: toOperation(a.sum),
372
+ itemCount: a.count ? {} : undefined,
373
+ })),
374
+ },
375
+ finalFilter: params.havingTree,
376
+ sort: toSort(params.orderBy),
377
+ returnTotalCount,
378
+ }
379
+ : {}),
380
+ });
381
+ return [unwrapAggregationId(results), pagingMetadata];
382
+ });
383
+ const [items, paging] = await fetch(params.skipNumber, true);
384
+ return new WixDataResultImpl(items, paging, fetch, params);
385
+ },
386
+ });
387
+ };
388
+ this.fetchAggregate = withArgs(async (args, collectionName, cursor, limit, options) => {
389
+ await apiValidator()
390
+ .arity('fetchAggregate', args, 2, 4)
391
+ .collectionName(collectionName)
392
+ .isNonEmptyString(cursor, 'cursor')
393
+ .validateAndReject();
394
+ const fetch = (cursorOrOffset) => this.trace('aggregate', { collectionName })(async (env) => {
395
+ const { results, pagingMetadata } = await this.client.aggregateDataItems({
396
+ ...env,
397
+ dataCollectionId: collectionName,
398
+ ...toPaging(limit, cursorOrOffset),
399
+ ...toReadOptions(options),
400
+ });
401
+ return [unwrapAggregationId(results), pagingMetadata];
402
+ });
403
+ const [items, paging] = await fetch(cursor, true);
404
+ return new WixDataResultImpl(items, paging, fetch, {
405
+ limitNumber: limit,
406
+ skipNumber: 0,
407
+ collectionName,
408
+ });
409
+ });
410
+ // --- bulk methods ---
411
+ this.bulkRemove = withArgs(async (args, collectionName, itemIds, options) => {
412
+ await apiValidator()
413
+ .arity('bulkRemove', args, 2, 3)
414
+ .collectionName(collectionName)
415
+ .itemIds(itemIds, collectionName)
416
+ .bulkRemoveOptions(options)
417
+ .validateAndReject();
418
+ return this.trace('bulkRemove', { collectionName })(async (env) => {
419
+ const { results } = await this.client.bulkRemoveDataItems({
420
+ ...env,
421
+ dataCollectionId: collectionName,
422
+ dataItemIds: itemIds,
423
+ ...toOptions(options),
424
+ });
425
+ // Non-existing items are skipped and not reported as errors.
426
+ return toBulkResult(itemIds, results, ['WDE0073']);
427
+ });
428
+ });
429
+ this.bulkInsert = withArgs(async (args, collectionName, items, options) => {
430
+ await apiValidator()
431
+ .arity('bulkInsert', args, 2, 3)
432
+ .items(items, collectionName)
433
+ .bulkInsertOptions(options)
434
+ .collectionName(collectionName)
435
+ .validateAndReject();
436
+ return this.trace('bulkInsert', { collectionName, options })(async (appId) => this.runBulkSave(appId, collectionName, items, options, options?.overrideExisting ?? false));
437
+ });
438
+ this.bulkSave = withArgs(async (args, collectionName, items, options) => {
439
+ await apiValidator()
440
+ .arity('bulkSave', args, 2, 3)
441
+ .bulkInsertOptions(options)
442
+ .collectionName(collectionName)
443
+ .items(items, collectionName)
444
+ .validateAndReject();
445
+ return this.trace('bulkSave', { collectionName })(async (env) => this.runBulkSave(env, collectionName, items, options));
446
+ });
447
+ this.bulkUpdate = withArgs(async (args, collectionName, items, options) => {
448
+ await apiValidator()
449
+ .arity('bulkUpdate', args, 2, 3)
450
+ .bulkUpdateOptions(options)
451
+ .collectionName(collectionName)
452
+ .items(items, collectionName)
453
+ .validateAndReject();
454
+ return this.trace('bulkUpdate', { collectionName })(async (env) => {
455
+ const { results } = await this.client.bulkUpdateDataItems({
456
+ ...env,
457
+ dataCollectionId: collectionName,
458
+ dataItems: items.map((data) => ({
459
+ id: data._id,
460
+ data,
461
+ })),
462
+ ...toOptions(options),
463
+ });
464
+ // Non-existing items are skipped and not reported as errors.
465
+ return toBulkResult(items, results, ['WDE0073']);
466
+ });
467
+ });
468
+ // --- references ---
469
+ this.fetchReferenced = withArgs(async (args, collectionName, cursor, limit, options) => {
470
+ await apiValidator()
471
+ .arity('fetchReferenced', args, 2, 4)
472
+ .isNonEmptyString(cursor, 'cursor')
473
+ .collectionName(collectionName)
474
+ .validateAndReject();
475
+ const fetch = (current) => this.trace('fetchReferenced', { collectionName })(async (env) => {
476
+ const { results, pagingMetadata } = await this.client.queryReferencedDataItems({
477
+ ...env,
478
+ ...toPaging(limit, current),
479
+ ...toReadOptions(options),
480
+ dataCollectionId: collectionName,
481
+ fields: options?.fields,
482
+ });
483
+ return [onlyReferencedItems(results), pagingMetadata];
484
+ });
485
+ const [items, paging] = await fetch(cursor);
486
+ return new WixDataResultImpl(items, paging, fetch, {
487
+ collectionName,
488
+ limitNumber: limit,
489
+ skipNumber: 0,
490
+ });
491
+ });
492
+ this.queryReferenced = withArgs(async (args, collectionName, holdingItem, relationshipAttribute, options) => {
493
+ await apiValidator()
494
+ .arity('queryReferenced', args, 3, 4)
495
+ .collectionName(collectionName)
496
+ .referenceParameter(holdingItem)
497
+ .isNonEmptyString(relationshipAttribute, 'relationshipAttribute')
498
+ .options(options)
499
+ .validateAndReject();
500
+ const id = itemId(holdingItem);
501
+ const fetch = (cursorOrOffset, returnTotalCount) => this.trace('queryReferenced', {
502
+ collectionName,
503
+ itemId: id,
504
+ options,
505
+ relationshipAttribute,
506
+ })(async (env) => {
507
+ const { results, pagingMetadata } = await this.client.queryReferencedDataItems({
508
+ ...env,
509
+ ...toPaging(options?.limit ?? 50, cursorOrOffset),
510
+ ...toReadOptions(options),
511
+ dataCollectionId: collectionName,
512
+ fields: options?.fields,
513
+ ...(isOffset(cursorOrOffset)
514
+ ? {
515
+ referringItemId: id,
516
+ referringItemFieldName: relationshipAttribute,
517
+ order: options?.order === 'asc'
518
+ ? apiTypes.SortOrder.ASC
519
+ : options?.order === 'desc'
520
+ ? apiTypes.SortOrder.DESC
521
+ : undefined,
522
+ returnTotalCount,
523
+ }
524
+ : {}),
525
+ });
526
+ return [onlyReferencedItems(results), pagingMetadata];
527
+ });
528
+ const [items, paging] = await fetch(options?.skip ?? 0, options?.returnTotalCount);
529
+ return new WixDataResultImpl(items, paging, fetch, {
530
+ collectionName,
531
+ limitNumber: options?.limit ?? 50,
532
+ skipNumber: options?.skip ?? 0,
533
+ });
534
+ });
535
+ this.insertReference = withArgs(async (args, collectionName, refsOrAttr, leftOrOpts, right, options) => {
536
+ let refs;
537
+ let opts;
538
+ let argc;
539
+ if (typeof refsOrAttr === 'string') {
540
+ const rights = asArray(right);
541
+ refs = rights.map((r) => ({
542
+ relationshipName: refsOrAttr,
543
+ left: leftOrOpts,
544
+ right: r,
545
+ }));
546
+ opts = options;
547
+ argc = [4, 5];
548
+ }
549
+ else {
550
+ refs = refsOrAttr;
551
+ opts = leftOrOpts;
552
+ argc = [2, 3];
553
+ }
554
+ await apiValidator()
555
+ .arity('insertReference', args, ...argc)
556
+ .collectionName(collectionName)
557
+ .references(refs)
558
+ .options(opts)
559
+ .validateAndReject();
560
+ await this.trace('insertReference', { collectionName })(async (env) => this.client.bulkInsertDataItemReferences({
561
+ ...env,
562
+ dataCollectionId: collectionName,
563
+ dataItemReferences: refs.map((r) => ({
564
+ referringItemFieldName: r.relationshipName,
565
+ referringItemId: itemId(r.left),
566
+ referencedItemId: itemId(r.right),
567
+ })),
568
+ ...toOptions(opts),
569
+ }));
570
+ });
571
+ this.replaceReferences = withArgs(async (args, collectionName, relationshipAttribute, left, right, options) => {
572
+ const rights = asArray(right);
573
+ await apiValidator()
574
+ .arity('replaceReferences', args, 4, 5)
575
+ .collectionName(collectionName)
576
+ .isNonEmptyString(relationshipAttribute, 'relationshipAttribute')
577
+ .referenceParameter(left)
578
+ .referenceParameters(rights)
579
+ .options(options)
580
+ .validateAndReject();
581
+ await this.trace('replaceReferences', {
582
+ collectionName,
583
+ relationshipAttribute,
584
+ })(async (env) => this.client.replaceDataItemReferences({
585
+ ...env,
586
+ dataCollectionId: collectionName,
587
+ referringItemFieldName: relationshipAttribute,
588
+ referringItemId: itemId(left),
589
+ newReferencedItemIds: rights.map(itemId),
590
+ ...toOptions(options),
591
+ }));
592
+ });
593
+ this.removeReference = withArgs(async (args, collectionName, relationshipAttribute, left, right, options) => {
594
+ const rights = asArray(right);
595
+ await apiValidator()
596
+ .arity('removeReference', args, 4, 5)
597
+ .collectionName(collectionName)
598
+ .referenceParameter(left)
599
+ .referenceRemoveParameters(rights)
600
+ .isNonEmptyString(relationshipAttribute, 'relationshipAttribute')
601
+ .options(options)
602
+ .validateAndReject();
603
+ await this.trace('removeReference', {
604
+ collectionName,
605
+ relationshipAttribute,
606
+ })(async (env) => this.client.bulkRemoveDataItemReferences({
607
+ ...env,
608
+ dataCollectionId: collectionName,
609
+ dataItemReferences: rights.map((r) => ({
610
+ referringItemFieldName: relationshipAttribute,
611
+ referringItemId: itemId(left),
612
+ referencedItemId: itemId(r),
613
+ })),
614
+ ...toOptions(options),
615
+ }));
616
+ });
617
+ this.isReferenced = withArgs(async (args, collectionName, relationshipAttribute, left, right, options) => {
618
+ await apiValidator()
619
+ .arity('isReferenced', args, 4, 5)
620
+ .collectionName(collectionName)
621
+ .referenceParameter(left)
622
+ .referenceParameter(right)
623
+ .options(options)
624
+ .validateAndReject();
625
+ return this.trace('isReferenced', {
626
+ collectionName,
627
+ relationshipAttribute,
628
+ })(async (env) => {
629
+ const { isReferenced } = await this.client.isReferencedDataItem({
630
+ ...env,
631
+ dataCollectionId: collectionName,
632
+ referringItemFieldName: relationshipAttribute,
633
+ referringItemId: itemId(left),
634
+ referencedItemId: itemId(right),
635
+ ...toOptions(options),
636
+ consistentRead: options?.consistentRead,
637
+ });
638
+ return isReferenced;
639
+ });
640
+ });
641
+ this.client = new ApiClient(clientFactory, allowGet);
642
+ }
643
+ get wixData() {
644
+ return this;
645
+ }
646
+ get filter() {
647
+ return filterBuilder();
648
+ }
649
+ async runBulkSave(env, collectionName, items, options, overrideExisting = true) {
650
+ const request = {
651
+ ...env,
652
+ dataCollectionId: collectionName,
653
+ dataItems: items.map((data) => ({
654
+ id: data._id,
655
+ data,
656
+ })),
657
+ ...toOptions(options),
658
+ };
659
+ const { results } = await (overrideExisting
660
+ ? this.client.bulkSaveDataItems(request)
661
+ : this.client.bulkInsertDataItems(request));
662
+ const ignoreCodes = overrideExisting ? [] : ['WDE0074'];
663
+ return toBulkResult(items, results, ignoreCodes);
664
+ }
665
+ trace(action, opts) {
666
+ return async (fn) => {
667
+ const gridAppId = await get(this.gridAppId);
668
+ const env = { appId: gridAppId, environment: this.environment };
669
+ if (this.tracer) {
670
+ return this.tracer(`WixDataApi.${action}`, {
671
+ ...opts,
672
+ gridAppId,
673
+ environment: this.environment,
674
+ })(() => fn(env));
675
+ }
676
+ return fn(env);
677
+ };
678
+ }
679
+ }
680
+ function withArgs(fn) {
681
+ return function (...args) {
682
+ return fn(arguments, ...args);
683
+ };
684
+ }
685
+ function toOptions(opts) {
686
+ if (!opts) {
687
+ return undefined;
688
+ }
689
+ const res = {
690
+ suppressHooks: opts.suppressHooks,
691
+ appOptions: opts.appOptions,
692
+ ...(opts.showDrafts !== undefined
693
+ ? { publishPluginOptions: { includeDraftItems: opts.showDrafts } }
694
+ : {}),
695
+ };
696
+ if (Object.entries(res).every((kv) => kv[1] === undefined)) {
697
+ return undefined;
698
+ }
699
+ return res;
700
+ }
701
+ function toReadOptions(options) {
702
+ return {
703
+ suppressHooks: options?.suppressHooks,
704
+ appOptions: options?.appOptions,
705
+ ...(options?.showDrafts !== undefined
706
+ ? { publishPluginOptions: { includeDraftItems: options?.showDrafts } }
707
+ : {}),
708
+ consistentRead: options?.consistentRead,
709
+ language: options?.language,
710
+ };
711
+ }
712
+ function toDataItem(item) {
713
+ return item.data;
714
+ }
715
+ function toPaging(limit, cursorOrOffset) {
716
+ return typeof cursorOrOffset === 'string'
717
+ ? {
718
+ cursorPaging: {
719
+ limit,
720
+ cursor: cursorOrOffset,
721
+ },
722
+ }
723
+ : limit !== undefined || cursorOrOffset > 0
724
+ ? {
725
+ paging: {
726
+ limit,
727
+ offset: cursorOrOffset,
728
+ },
729
+ }
730
+ : {};
731
+ }
732
+ function toSort(orderBy) {
733
+ return orderBy.map((fieldOrder) => {
734
+ const [[fieldName, sort]] = Object.entries(fieldOrder);
735
+ const order = sort === 'asc'
736
+ ? apiTypes.SortOrder.ASC
737
+ : sort === 'desc'
738
+ ? apiTypes.SortOrder.DESC
739
+ : undefined;
740
+ return { fieldName, order };
741
+ });
742
+ }
743
+ async function get(providerOrValue) {
744
+ if (typeof providerOrValue?.get === 'function') {
745
+ return providerOrValue.get();
746
+ }
747
+ return providerOrValue;
748
+ }
749
+ function recover(code, value) {
750
+ return (error) => {
751
+ if (error instanceof Error && error.code === code) {
752
+ return Promise.resolve(value);
753
+ }
754
+ return Promise.reject(error);
755
+ };
756
+ }
757
+ function warnAboutBrokenFields(item) {
758
+ const hasFieldWithDollar = hasField(item, (key) => key.startsWith('$'));
759
+ const hasFieldWithDot = hasField(item, (key) => key.includes('.'));
760
+ if (hasFieldWithDollar) {
761
+ console.error("Data inserted contains field name prefixed with symbol '$'. It is not recommended to use such field names as it will not work with some data operations.");
762
+ }
763
+ if (hasFieldWithDot) {
764
+ console.warn("Data inserted contains field name containing symbol '.'. It is not recommended to use such field names as it will not work with some data operations.");
765
+ }
766
+ }
767
+ function toBulkResult(request, results, ignoreCodes = []) {
768
+ const errors = results.flatMap((r) => {
769
+ if (r.itemMetadata?.success || !r.itemMetadata?.error) {
770
+ return [];
771
+ }
772
+ if (ignoreCodes.includes(r.itemMetadata.error.code ?? '')) {
773
+ return [];
774
+ }
775
+ return [
776
+ new BulkError(r.itemMetadata.error.description, toKnownCode(r.itemMetadata.error.code), request[r.itemMetadata.originalIndex], 'BulkError', r.itemMetadata.originalIndex),
777
+ ];
778
+ });
779
+ const success = results.filter((r) => r.itemMetadata?.success);
780
+ const inserted = success.filter((r) => r.action === apiTypes.BulkActionType.INSERT);
781
+ const updated = success.filter((r) => r.action === apiTypes.BulkActionType.UPDATE ||
782
+ r.action === apiTypes.BulkActionType.PATCH);
783
+ const removed = success.filter((r) => r.action === apiTypes.BulkActionType.DELETE);
784
+ return {
785
+ inserted: inserted.length,
786
+ updated: updated.length,
787
+ removed: removed.length,
788
+ skipped: request.length - errors.length - success.length,
789
+ errors,
790
+ insertedItemIds: inserted.map((r) => r.itemMetadata?.id),
791
+ updatedItemIds: updated.map((r) => r.itemMetadata?.id),
792
+ removedItemIds: removed.map((r) => r.itemMetadata?.id),
793
+ };
794
+ }
795
+ function unwrapAggregationId(items) {
796
+ // When grouping by one field WixDataService returns value on _id field directly, DataItemService wraps it in an object, i.e.
797
+ // grouping by surname returns {_id: 'Simpson'} in WixDataService vs {_id: {surname: 'Simpson'}} in DataItemService
798
+ // When grouping by more fields, values are kept wrapped.
799
+ return items.map((item) => {
800
+ const id = item._id;
801
+ if (isObject(id)) {
802
+ const [key, ...rest] = Object.keys(id);
803
+ if (rest.length === 0) {
804
+ item._id = id[key];
805
+ return item;
806
+ }
807
+ }
808
+ return item;
809
+ });
810
+ }
811
+ function onlyReferencedItems(results) {
812
+ return results
813
+ .map((result) => result.dataItem)
814
+ .filter(notEmpty)
815
+ .map(toDataItem);
816
+ }
817
+ function notEmpty(value) {
818
+ return value != null;
819
+ }
820
+ function itemId(item) {
821
+ return typeof item === 'string' ? item : item._id;
822
+ }
823
+ function asArray(xOrXs) {
824
+ return isArray(xOrXs) ? xOrXs : [xOrXs];
825
+ }
826
+ function isOffset(cursorOrOffset) {
827
+ return typeof cursorOrOffset === 'number';
828
+ }
829
+ //# sourceMappingURL=WixDataApi.js.map