@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,131 @@
1
+ "use strict";
2
+
3
+ exports.__esModule = true;
4
+ exports.createCmsBackend = createCmsBackend;
5
+ var _data = require("@wix/data");
6
+ var _essentials = require("@wix/essentials");
7
+ var _filterUtils = require("./filterUtils");
8
+ var _searchUtils = require("./searchUtils");
9
+ var _sortUtils = require("./sortUtils");
10
+ var _cmsBackup = require("./cmsBackup");
11
+ const getReferenceFields = fields => Object.values(fields).filter(f => (f == null ? void 0 : f.type) === 'REFERENCE' || (f == null ? void 0 : f.type) === 'MULTI_REFERENCE');
12
+ const getMultiReferenceFields = fields => Object.values(fields).filter(f => (f == null ? void 0 : f.type) === 'MULTI_REFERENCE');
13
+
14
+ /** MULTI_REFERENCE values aren't stored inline — sync them via the reference endpoint. */
15
+ const updateMultiReferences = async (collectionId, entityId, entity, multiReferenceFields) => {
16
+ await Promise.all(multiReferenceFields.map(async field => {
17
+ const rawValue = entity[field.id];
18
+ if (!Array.isArray(rawValue)) {
19
+ return;
20
+ }
21
+ const referenceIds = rawValue.map(value => value._id);
22
+ await _data.items.replaceReferences(collectionId, field.id, entityId, referenceIds);
23
+ }));
24
+ };
25
+
26
+ /**
27
+ * Builds the `CollectionBackend` for a CMS collection over `@wix/data`. Reference
28
+ * fields are expanded via `.include(...)` on `get`/`find`.
29
+ */
30
+ function createCmsBackend(collectionId, fields) {
31
+ const multiReferenceFields = getMultiReferenceFields(fields);
32
+ const allReferenceFieldIds = getReferenceFields(fields).map(f => f.id);
33
+ return {
34
+ get: async entityId => {
35
+ let dataQuery = _data.items.query(collectionId).eq('_id', entityId);
36
+ if (allReferenceFieldIds.length > 0) {
37
+ dataQuery = dataQuery.include(...allReferenceFieldIds);
38
+ }
39
+ const res = await dataQuery.find({
40
+ returnTotalCount: false
41
+ });
42
+ const entity = res.items[0];
43
+ if (!entity) {
44
+ throw new Error(`Entity not found: ${entityId}`);
45
+ }
46
+ return entity;
47
+ },
48
+ create: async entity => {
49
+ const created = await _data.items.insert(collectionId, entity);
50
+ const createdId = created._id;
51
+ if (createdId) {
52
+ await updateMultiReferences(collectionId, createdId, entity, multiReferenceFields);
53
+ }
54
+ return {
55
+ ...entity,
56
+ _id: createdId
57
+ };
58
+ },
59
+ update: async entity => {
60
+ await _data.items.update(collectionId, entity);
61
+ const entityId = entity._id;
62
+ if (entityId) {
63
+ await updateMultiReferences(collectionId, entityId, entity, multiReferenceFields);
64
+ }
65
+ return entity;
66
+ },
67
+ delete: async entityId => {
68
+ await _data.items.remove(collectionId, entityId);
69
+ },
70
+ bulkDelete: async entityIds => {
71
+ await _data.items.bulkRemove(collectionId, entityIds);
72
+ },
73
+ find: async (query, options = {}) => {
74
+ // Without options, search and reference-includes are skipped (matches
75
+ // auto-patterns). The options arg is not on the `CollectionBackend.find`
76
+ // contract type — how a consumer supplies it is still open.
77
+ const searchableFieldIds = options.searchableFieldIds ?? [];
78
+ const filterFieldMapping = options.filterFieldMapping ?? {};
79
+ let dataQuery = _data.items.query(collectionId);
80
+ dataQuery = (0, _searchUtils.addSearchToDataQuery)({
81
+ dataQuery,
82
+ query,
83
+ fields,
84
+ searchableFieldIds
85
+ });
86
+ dataQuery = (0, _filterUtils.addFiltersToDataQuery)({
87
+ dataQuery,
88
+ query,
89
+ fields,
90
+ filterFieldMapping
91
+ });
92
+ dataQuery = (0, _sortUtils.addSortToDataQuery)({
93
+ dataQuery,
94
+ query,
95
+ fields
96
+ });
97
+ const includeFieldIds = allReferenceFieldIds.filter(id => searchableFieldIds.includes(id));
98
+ if (includeFieldIds.length > 0) {
99
+ dataQuery = dataQuery.include(...includeFieldIds);
100
+ }
101
+ const offset = query.offset ?? 0;
102
+ const res = await dataQuery.skip(offset).limit(query.limit).find({
103
+ returnTotalCount: true
104
+ });
105
+ const total = res.totalCount ?? 0;
106
+ return {
107
+ items: res.items,
108
+ total,
109
+ hasNext: offset + res.items.length < total
110
+ };
111
+ },
112
+ bulkInsert: entities => _essentials.errorHandler.withErrorHandler(async () => {
113
+ const {
114
+ inserted,
115
+ updated,
116
+ errors
117
+ } = await _data.items.bulkInsert(collectionId, entities);
118
+ return {
119
+ succeeded: inserted + updated,
120
+ failed: errors.length,
121
+ errors: errors.map(e => ({
122
+ rowIndex: e.originalIndex,
123
+ message: e.message,
124
+ code: e.code
125
+ }))
126
+ };
127
+ }, {}),
128
+ backup: (0, _cmsBackup.createCmsBackupConfig)()
129
+ };
130
+ }
131
+ //# sourceMappingURL=createCmsBackend.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_data","require","_essentials","_filterUtils","_searchUtils","_sortUtils","_cmsBackup","getReferenceFields","fields","Object","values","filter","f","type","getMultiReferenceFields","updateMultiReferences","collectionId","entityId","entity","multiReferenceFields","Promise","all","map","field","rawValue","id","Array","isArray","referenceIds","value","_id","items","replaceReferences","createCmsBackend","allReferenceFieldIds","get","dataQuery","query","eq","length","include","res","find","returnTotalCount","Error","create","created","insert","createdId","update","delete","remove","bulkDelete","entityIds","bulkRemove","options","searchableFieldIds","filterFieldMapping","addSearchToDataQuery","addFiltersToDataQuery","addSortToDataQuery","includeFieldIds","includes","offset","skip","limit","total","totalCount","hasNext","bulkInsert","entities","errorHandler","withErrorHandler","inserted","updated","errors","succeeded","failed","e","rowIndex","originalIndex","message","code","backup","createCmsBackupConfig"],"sources":["../../../src/adapter/createCmsBackend.ts"],"sourcesContent":["import { items } from '@wix/data';\nimport { errorHandler } from '@wix/essentials';\nimport type {\n BulkInsertResult,\n CollectionBackend,\n Field,\n OffsetQuery,\n OffsetQueryResult,\n Schema,\n} from '@wix/bex-core';\nimport { addFiltersToDataQuery } from './filterUtils';\nimport { addSearchToDataQuery } from './searchUtils';\nimport { addSortToDataQuery } from './sortUtils';\nimport { createCmsBackupConfig } from './cmsBackup';\n\ntype SchemaFields = Schema['fields'];\n\nconst getReferenceFields = (fields: SchemaFields): Field[] =>\n Object.values(fields).filter(\n (f): f is Field => f?.type === 'REFERENCE' || f?.type === 'MULTI_REFERENCE',\n );\n\nconst getMultiReferenceFields = (fields: SchemaFields): Field[] =>\n Object.values(fields).filter(\n (f): f is Field => f?.type === 'MULTI_REFERENCE',\n );\n\n/** MULTI_REFERENCE values aren't stored inline — sync them via the reference endpoint. */\nconst updateMultiReferences = async (\n collectionId: string,\n entityId: string,\n entity: Record<string, unknown>,\n multiReferenceFields: Field[],\n) => {\n await Promise.all(\n multiReferenceFields.map(async (field) => {\n const rawValue = entity[field.id];\n if (!Array.isArray(rawValue)) {\n return;\n }\n const referenceIds = (rawValue as Record<string, unknown>[]).map(\n (value) => value._id as string,\n );\n\n await items.replaceReferences(\n collectionId,\n field.id,\n entityId,\n referenceIds,\n );\n }),\n );\n};\n\n/**\n * Builds the `CollectionBackend` for a CMS collection over `@wix/data`. Reference\n * fields are expanded via `.include(...)` on `get`/`find`.\n */\nexport function createCmsBackend<\n T extends Record<string, unknown> = Record<string, unknown>,\n>(collectionId: string, fields: SchemaFields): CollectionBackend<T> {\n const multiReferenceFields = getMultiReferenceFields(fields);\n const allReferenceFieldIds = getReferenceFields(fields).map((f) => f.id);\n\n return {\n get: async (entityId: string): Promise<T> => {\n let dataQuery = items.query(collectionId).eq('_id', entityId);\n if (allReferenceFieldIds.length > 0) {\n dataQuery = dataQuery.include(...allReferenceFieldIds);\n }\n const res = await dataQuery.find({ returnTotalCount: false });\n const entity = res.items[0];\n if (!entity) {\n throw new Error(`Entity not found: ${entityId}`);\n }\n return entity as unknown as T;\n },\n\n create: async (entity: Partial<T>): Promise<T> => {\n const created = (await items.insert(\n collectionId,\n entity as Record<string, unknown>,\n )) as Record<string, unknown>;\n const createdId = created._id as string;\n if (createdId) {\n await updateMultiReferences(\n collectionId,\n createdId,\n entity as Record<string, unknown>,\n multiReferenceFields,\n );\n }\n return { ...entity, _id: createdId } as unknown as T;\n },\n\n update: async (entity: T): Promise<T> => {\n await items.update(\n collectionId,\n entity as Record<string, unknown> & { _id: string },\n );\n const entityId = (entity as Record<string, unknown>)._id as string;\n if (entityId) {\n await updateMultiReferences(\n collectionId,\n entityId,\n entity as Record<string, unknown>,\n multiReferenceFields,\n );\n }\n return entity;\n },\n\n delete: async (entityId: string): Promise<void> => {\n await items.remove(collectionId, entityId);\n },\n\n bulkDelete: async (entityIds: string[]): Promise<void> => {\n await items.bulkRemove(collectionId, entityIds);\n },\n\n find: async (\n query: OffsetQuery,\n options: {\n searchableFieldIds?: string[];\n filterFieldMapping?: Record<string, { fieldId: string }>;\n } = {},\n ): Promise<OffsetQueryResult<T>> => {\n // Without options, search and reference-includes are skipped (matches\n // auto-patterns). The options arg is not on the `CollectionBackend.find`\n // contract type — how a consumer supplies it is still open.\n const searchableFieldIds: string[] = options.searchableFieldIds ?? [];\n const filterFieldMapping: Record<string, { fieldId: string }> =\n options.filterFieldMapping ?? {};\n\n let dataQuery = items.query(collectionId);\n dataQuery = addSearchToDataQuery({\n dataQuery,\n query,\n fields,\n searchableFieldIds,\n });\n dataQuery = addFiltersToDataQuery({\n dataQuery,\n query,\n fields,\n filterFieldMapping,\n });\n dataQuery = addSortToDataQuery({ dataQuery, query, fields });\n\n const includeFieldIds = allReferenceFieldIds.filter((id) =>\n searchableFieldIds.includes(id),\n );\n if (includeFieldIds.length > 0) {\n dataQuery = dataQuery.include(...includeFieldIds);\n }\n\n const offset = query.offset ?? 0;\n const res = await dataQuery\n .skip(offset)\n .limit(query.limit)\n .find({ returnTotalCount: true });\n\n const total = res.totalCount ?? 0;\n return {\n items: res.items as unknown as T[],\n total,\n hasNext: offset + res.items.length < total,\n };\n },\n\n bulkInsert: (entities: Partial<T>[]): Promise<BulkInsertResult> =>\n errorHandler.withErrorHandler(async () => {\n const { inserted, updated, errors } = await items.bulkInsert(\n collectionId,\n entities as Record<string, unknown>[],\n );\n return {\n succeeded: inserted + updated,\n failed: errors.length,\n errors: errors.map((e) => ({\n rowIndex: e.originalIndex,\n message: e.message,\n code: e.code,\n })),\n };\n }, {}),\n\n backup: createCmsBackupConfig(),\n };\n}\n"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,182 @@
1
+ "use strict";
2
+
3
+ exports.__esModule = true;
4
+ exports.createCmsFieldActions = createCmsFieldActions;
5
+ var _data = require("@wix/data");
6
+ var _cmsFieldTypeMap = require("./cmsFieldTypeMap");
7
+ var _getFieldKey = require("./getFieldKey");
8
+ var _pollUntilReady = require("./pollUntilReady");
9
+ const COPY_TASK_POLL_INTERVAL_MS = 1000;
10
+ const COPY_TASK_MAX_ATTEMPTS = 300;
11
+
12
+ /** Polls a COPY_FIELD_DATA task to completion, mapping the generic poll-timeout error. */
13
+ const waitForCopyTask = async taskId => {
14
+ try {
15
+ await (0, _pollUntilReady.pollUntilReady)(async () => {
16
+ const task = await _data.tasks.getTask(taskId);
17
+ if (task.status === 'FAILED') {
18
+ var _task$failures;
19
+ const failure = (_task$failures = task.failures) == null ? void 0 : _task$failures[0];
20
+ throw new Error([failure == null ? void 0 : failure.code, failure == null ? void 0 : failure.description].filter(Boolean).join(': ') || 'Copy field data task failed');
21
+ }
22
+ return task.status === 'COMPLETED';
23
+ }, {
24
+ interval: COPY_TASK_POLL_INTERVAL_MS,
25
+ maxAttempts: COPY_TASK_MAX_ATTEMPTS
26
+ });
27
+ } catch (err) {
28
+ if (err instanceof Error && err.message === 'Backup polling timed out') {
29
+ throw new Error('Copy field data task timed out');
30
+ }
31
+ throw err;
32
+ }
33
+ };
34
+
35
+ /**
36
+ * Builds the `FieldActions` for a CMS collection over `@wix/data`. `getCollection`
37
+ * returns the current raw collection snapshot (for existing keys + source field types).
38
+ */
39
+ function createCmsFieldActions(collectionId, getCollection) {
40
+ const existingFieldKeys = () => {
41
+ var _getCollection;
42
+ return ((_getCollection = getCollection()) == null || (_getCollection = _getCollection.fields) == null ? void 0 : _getCollection.flatMap(f => f.key ? [f.key] : [])) ?? [];
43
+ };
44
+ const findCmsField = fieldKey => {
45
+ var _getCollection2;
46
+ return (_getCollection2 = getCollection()) == null || (_getCollection2 = _getCollection2.fields) == null ? void 0 : _getCollection2.find(f => f.key === fieldKey);
47
+ };
48
+ const buildFieldPatch = (fieldId, updates) => {
49
+ var _findCmsField, _updates$validation, _updates$validation2, _updates$validation3;
50
+ const sourceCmsType = (_findCmsField = findCmsField(fieldId)) == null ? void 0 : _findCmsField.type;
51
+ const patch = {
52
+ key: fieldId
53
+ };
54
+ if (updates.displayName !== undefined) {
55
+ patch.displayName = updates.displayName;
56
+ }
57
+ if (updates.isPii !== undefined) {
58
+ patch.encrypted = updates.isPii;
59
+ }
60
+ if (updates.helpText !== undefined) {
61
+ patch.description = updates.helpText;
62
+ }
63
+ if (((_updates$validation = updates.validation) == null ? void 0 : _updates$validation.required) !== undefined) {
64
+ patch.required = updates.validation.required;
65
+ }
66
+ if ((_updates$validation2 = updates.validation) != null && _updates$validation2.numberRange && sourceCmsType === 'NUMBER') {
67
+ patch.numberRange = updates.validation.numberRange;
68
+ }
69
+ if ((_updates$validation3 = updates.validation) != null && _updates$validation3.stringLengthRange && sourceCmsType === 'TEXT') {
70
+ patch.stringLengthRange = updates.validation.stringLengthRange;
71
+ }
72
+ return patch;
73
+ };
74
+
75
+ /**
76
+ * Clones a CMS field for duplication: drops `systemField`/`capabilities` and clears
77
+ * `referencingFieldKey` so the duplicate gets its own backing reference field.
78
+ */
79
+ const cloneFieldDefinition = (source, newKey, newDisplayName) => {
80
+ var _cloned$typeMetadata;
81
+ const {
82
+ systemField,
83
+ capabilities,
84
+ ...rest
85
+ } = source;
86
+ const cloned = {
87
+ ...rest,
88
+ key: newKey,
89
+ displayName: newDisplayName
90
+ };
91
+ if ((_cloned$typeMetadata = cloned.typeMetadata) != null && (_cloned$typeMetadata = _cloned$typeMetadata.multiReference) != null && _cloned$typeMetadata.referencingFieldKey) {
92
+ cloned.typeMetadata = {
93
+ ...cloned.typeMetadata,
94
+ multiReference: {
95
+ ...cloned.typeMetadata.multiReference,
96
+ referencingFieldKey: undefined
97
+ }
98
+ };
99
+ }
100
+ return cloned;
101
+ };
102
+ return {
103
+ addField: async field => {
104
+ var _field$validation, _field$validation2, _field$validation3;
105
+ const cmsType = _cmsFieldTypeMap.PatternsFieldTypeToCmsFieldType[field.type];
106
+ if (!cmsType) {
107
+ throw new Error(`Field type ${field.type} not supported yet`);
108
+ }
109
+ const cmsField = {
110
+ key: (0, _getFieldKey.getFieldKey)(existingFieldKeys(), field.displayName),
111
+ displayName: field.displayName,
112
+ type: cmsType,
113
+ required: ((_field$validation = field.validation) == null ? void 0 : _field$validation.required) ?? false
114
+ };
115
+ if (field.isPii) {
116
+ cmsField.encrypted = true;
117
+ }
118
+ if (field.helpText) {
119
+ cmsField.description = field.helpText;
120
+ }
121
+ if (field.type === 'NUMBER' && (_field$validation2 = field.validation) != null && _field$validation2.numberRange) {
122
+ cmsField.numberRange = field.validation.numberRange;
123
+ }
124
+ if (field.type === 'SHORT_TEXT' && (_field$validation3 = field.validation) != null && _field$validation3.stringLengthRange) {
125
+ cmsField.stringLengthRange = field.validation.stringLengthRange;
126
+ }
127
+ await _data.collections.createDataCollectionField(collectionId, {
128
+ field: cmsField
129
+ });
130
+ },
131
+ editField: async (fieldId, updates) => {
132
+ await _data.collections.patchDataCollectionField(collectionId, buildFieldPatch(fieldId, updates));
133
+ },
134
+ deleteField: async fieldId => {
135
+ await _data.collections.deleteDataCollectionField(collectionId, {
136
+ fieldKey: fieldId
137
+ });
138
+ },
139
+ renameField: async (fieldId, newName) => {
140
+ await _data.collections.patchDataCollectionField(collectionId, buildFieldPatch(fieldId, {
141
+ displayName: newName
142
+ }));
143
+ },
144
+ makePrimary: async fieldId => {
145
+ await _data.collections.patchDataCollection(collectionId, {
146
+ displayField: fieldId
147
+ });
148
+ },
149
+ duplicateField: async fieldId => {
150
+ const sourceField = findCmsField(fieldId);
151
+ if (!sourceField || !sourceField.type) {
152
+ throw new Error(`Field ${fieldId} not found`);
153
+ }
154
+ const newDisplayName = `${sourceField.displayName ?? fieldId} (Copy)`;
155
+ const newKey = (0, _getFieldKey.getFieldKey)(existingFieldKeys(), newDisplayName);
156
+ await _data.collections.createDataCollectionField(collectionId, {
157
+ field: cloneFieldDefinition(sourceField, newKey, newDisplayName)
158
+ });
159
+ },
160
+ duplicateFieldWithContent: async fieldId => {
161
+ const sourceField = findCmsField(fieldId);
162
+ if (!sourceField || !sourceField.type) {
163
+ throw new Error(`Field ${fieldId} not found`);
164
+ }
165
+ const newDisplayName = `${sourceField.displayName ?? fieldId} (Copy)`;
166
+ const newKey = (0, _getFieldKey.getFieldKey)(existingFieldKeys(), newDisplayName);
167
+ await _data.collections.createDataCollectionField(collectionId, {
168
+ field: cloneFieldDefinition(sourceField, newKey, newDisplayName)
169
+ });
170
+ const createdTask = await _data.tasks.createTask({
171
+ type: 'COPY_FIELD_DATA',
172
+ copyFieldDataOptions: {
173
+ dataCollectionId: collectionId,
174
+ sourceFieldKey: fieldId,
175
+ targetFieldKey: newKey
176
+ }
177
+ });
178
+ await waitForCopyTask(createdTask._id);
179
+ }
180
+ };
181
+ }
182
+ //# sourceMappingURL=createCmsFieldActions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_data","require","_cmsFieldTypeMap","_getFieldKey","_pollUntilReady","COPY_TASK_POLL_INTERVAL_MS","COPY_TASK_MAX_ATTEMPTS","waitForCopyTask","taskId","pollUntilReady","task","tasks","getTask","status","_task$failures","failure","failures","Error","code","description","filter","Boolean","join","interval","maxAttempts","err","message","createCmsFieldActions","collectionId","getCollection","existingFieldKeys","_getCollection","fields","flatMap","f","key","findCmsField","fieldKey","_getCollection2","find","buildFieldPatch","fieldId","updates","_findCmsField","_updates$validation","_updates$validation2","_updates$validation3","sourceCmsType","type","patch","displayName","undefined","isPii","encrypted","helpText","validation","required","numberRange","stringLengthRange","cloneFieldDefinition","source","newKey","newDisplayName","_cloned$typeMetadata","systemField","capabilities","rest","cloned","typeMetadata","multiReference","referencingFieldKey","addField","field","_field$validation","_field$validation2","_field$validation3","cmsType","PatternsFieldTypeToCmsFieldType","cmsField","getFieldKey","collections","createDataCollectionField","editField","patchDataCollectionField","deleteField","deleteDataCollectionField","renameField","newName","makePrimary","patchDataCollection","displayField","duplicateField","sourceField","duplicateFieldWithContent","createdTask","createTask","copyFieldDataOptions","dataCollectionId","sourceFieldKey","targetFieldKey","_id"],"sources":["../../../src/adapter/createCmsFieldActions.ts"],"sourcesContent":["import { collections, tasks } from '@wix/data';\nimport type { Field, FieldActions } from '@wix/bex-core';\nimport { PatternsFieldTypeToCmsFieldType } from './cmsFieldTypeMap';\nimport { getFieldKey } from './getFieldKey';\nimport { pollUntilReady } from './pollUntilReady';\n\nconst COPY_TASK_POLL_INTERVAL_MS = 1000;\nconst COPY_TASK_MAX_ATTEMPTS = 300;\n\n/** Polls a COPY_FIELD_DATA task to completion, mapping the generic poll-timeout error. */\nconst waitForCopyTask = async (taskId: string): Promise<void> => {\n try {\n await pollUntilReady(\n async () => {\n const task = await tasks.getTask(taskId);\n if (task.status === 'FAILED') {\n const failure = task.failures?.[0];\n throw new Error(\n [failure?.code, failure?.description].filter(Boolean).join(': ') ||\n 'Copy field data task failed',\n );\n }\n return task.status === 'COMPLETED';\n },\n {\n interval: COPY_TASK_POLL_INTERVAL_MS,\n maxAttempts: COPY_TASK_MAX_ATTEMPTS,\n },\n );\n } catch (err) {\n if (err instanceof Error && err.message === 'Backup polling timed out') {\n throw new Error('Copy field data task timed out');\n }\n throw err;\n }\n};\n\n/**\n * Builds the `FieldActions` for a CMS collection over `@wix/data`. `getCollection`\n * returns the current raw collection snapshot (for existing keys + source field types).\n */\nexport function createCmsFieldActions(\n collectionId: string,\n getCollection: () => collections.DataCollection | null,\n): FieldActions {\n const existingFieldKeys = (): string[] =>\n getCollection()?.fields?.flatMap((f) => (f.key ? [f.key] : [])) ?? [];\n\n const findCmsField = (fieldKey: string): collections.Field | undefined =>\n getCollection()?.fields?.find((f) => f.key === fieldKey);\n\n const buildFieldPatch = (\n fieldId: string,\n updates: Partial<Field>,\n ): collections.Field => {\n const sourceCmsType = findCmsField(fieldId)?.type;\n const patch: collections.Field = { key: fieldId };\n if (updates.displayName !== undefined) {\n patch.displayName = updates.displayName;\n }\n if (updates.isPii !== undefined) {\n patch.encrypted = updates.isPii;\n }\n if (updates.helpText !== undefined) {\n patch.description = updates.helpText;\n }\n if (updates.validation?.required !== undefined) {\n patch.required = updates.validation.required;\n }\n if (updates.validation?.numberRange && sourceCmsType === 'NUMBER') {\n patch.numberRange = updates.validation.numberRange;\n }\n if (updates.validation?.stringLengthRange && sourceCmsType === 'TEXT') {\n patch.stringLengthRange = updates.validation.stringLengthRange;\n }\n return patch;\n };\n\n /**\n * Clones a CMS field for duplication: drops `systemField`/`capabilities` and clears\n * `referencingFieldKey` so the duplicate gets its own backing reference field.\n */\n const cloneFieldDefinition = (\n source: collections.Field,\n newKey: string,\n newDisplayName: string,\n ): collections.Field => {\n const { systemField, capabilities, ...rest } = source;\n const cloned: collections.Field = {\n ...rest,\n key: newKey,\n displayName: newDisplayName,\n };\n if (cloned.typeMetadata?.multiReference?.referencingFieldKey) {\n cloned.typeMetadata = {\n ...cloned.typeMetadata,\n multiReference: {\n ...cloned.typeMetadata.multiReference,\n referencingFieldKey: undefined,\n },\n };\n }\n return cloned;\n };\n\n return {\n addField: async (field: Field) => {\n const cmsType = PatternsFieldTypeToCmsFieldType[field.type];\n if (!cmsType) {\n throw new Error(`Field type ${field.type} not supported yet`);\n }\n\n const cmsField: collections.Field = {\n key: getFieldKey(existingFieldKeys(), field.displayName),\n displayName: field.displayName,\n type: cmsType,\n required: field.validation?.required ?? false,\n };\n\n if (field.isPii) {\n cmsField.encrypted = true;\n }\n if (field.helpText) {\n cmsField.description = field.helpText;\n }\n if (field.type === 'NUMBER' && field.validation?.numberRange) {\n cmsField.numberRange = field.validation.numberRange;\n }\n if (field.type === 'SHORT_TEXT' && field.validation?.stringLengthRange) {\n cmsField.stringLengthRange = field.validation.stringLengthRange;\n }\n\n await collections.createDataCollectionField(collectionId, {\n field: cmsField,\n });\n },\n\n editField: async (fieldId, updates) => {\n await collections.patchDataCollectionField(\n collectionId,\n buildFieldPatch(fieldId, updates),\n );\n },\n\n deleteField: async (fieldId) => {\n await collections.deleteDataCollectionField(collectionId, {\n fieldKey: fieldId,\n });\n },\n\n renameField: async (fieldId, newName) => {\n await collections.patchDataCollectionField(\n collectionId,\n buildFieldPatch(fieldId, { displayName: newName }),\n );\n },\n\n makePrimary: async (fieldId) => {\n await collections.patchDataCollection(collectionId, {\n displayField: fieldId,\n });\n },\n\n duplicateField: async (fieldId) => {\n const sourceField = findCmsField(fieldId);\n if (!sourceField || !sourceField.type) {\n throw new Error(`Field ${fieldId} not found`);\n }\n const newDisplayName = `${sourceField.displayName ?? fieldId} (Copy)`;\n const newKey = getFieldKey(existingFieldKeys(), newDisplayName);\n await collections.createDataCollectionField(collectionId, {\n field: cloneFieldDefinition(sourceField, newKey, newDisplayName),\n });\n },\n\n duplicateFieldWithContent: async (fieldId) => {\n const sourceField = findCmsField(fieldId);\n if (!sourceField || !sourceField.type) {\n throw new Error(`Field ${fieldId} not found`);\n }\n const newDisplayName = `${sourceField.displayName ?? fieldId} (Copy)`;\n const newKey = getFieldKey(existingFieldKeys(), newDisplayName);\n await collections.createDataCollectionField(collectionId, {\n field: cloneFieldDefinition(sourceField, newKey, newDisplayName),\n });\n const createdTask = await tasks.createTask({\n type: 'COPY_FIELD_DATA',\n copyFieldDataOptions: {\n dataCollectionId: collectionId,\n sourceFieldKey: fieldId,\n targetFieldKey: newKey,\n },\n });\n await waitForCopyTask(createdTask._id!);\n },\n };\n}\n"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+
3
+ exports.__esModule = true;
4
+ exports.fetchExternalDbConnections = void 0;
5
+ var _http = require("@wix/bex-utils/@wix/ambassador-data-v1-external-database-connection/http");
6
+ /**
7
+ * Lists the site's external-database connections in the source-neutral
8
+ * `ExternalDbConnection` shape. Ambassador client from the `@wix/bex-utils` bundle via
9
+ * `/http` (not `/builders` — `Error.captureStackTrace` crashes Firefox/Safari).
10
+ */
11
+ const fetchExternalDbConnections = async httpClient => {
12
+ const {
13
+ data
14
+ } = await httpClient.request((0, _http.listExternalDatabaseConnections)({}));
15
+ return (data.externalDatabaseConnections ?? []).map(conn => ({
16
+ namespace: conn.name ?? '',
17
+ capabilities: conn.capabilities && {
18
+ collectionModificationsSupported: conn.capabilities.collectionModificationsSupported,
19
+ fieldTypes: conn.capabilities.fieldTypes
20
+ }
21
+ }));
22
+ };
23
+ exports.fetchExternalDbConnections = fetchExternalDbConnections;
24
+ //# sourceMappingURL=fetchExternalDbConnections.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_http","require","fetchExternalDbConnections","httpClient","data","request","listExternalDatabaseConnections","externalDatabaseConnections","map","conn","namespace","name","capabilities","collectionModificationsSupported","fieldTypes","exports"],"sources":["../../../src/adapter/fetchExternalDbConnections.ts"],"sourcesContent":["import { listExternalDatabaseConnections } from '@wix/bex-utils/@wix/ambassador-data-v1-external-database-connection/http';\nimport type { WixPatternsContainerParams } from '@wix/bex-core';\nimport type { ExternalDbConnection } from './cmsPermissions';\n\nexport type { ExternalDbConnection } from './cmsPermissions';\n\ntype HttpClient = WixPatternsContainerParams['httpClient'];\n\n/**\n * Lists the site's external-database connections in the source-neutral\n * `ExternalDbConnection` shape. Ambassador client from the `@wix/bex-utils` bundle via\n * `/http` (not `/builders` — `Error.captureStackTrace` crashes Firefox/Safari).\n */\nexport const fetchExternalDbConnections = async (\n httpClient: HttpClient,\n): Promise<ExternalDbConnection[]> => {\n const { data } = await httpClient.request(\n listExternalDatabaseConnections({}),\n );\n\n return (data.externalDatabaseConnections ?? []).map((conn) => ({\n namespace: conn.name ?? '',\n capabilities: conn.capabilities && {\n collectionModificationsSupported:\n conn.capabilities.collectionModificationsSupported,\n fieldTypes: conn.capabilities.fieldTypes as string[] | undefined,\n },\n }));\n};\n"],"mappings":";;;;AAAA,IAAAA,KAAA,GAAAC,OAAA;AAQA;AACA;AACA;AACA;AACA;AACO,MAAMC,0BAA0B,GAAG,MACxCC,UAAsB,IACc;EACpC,MAAM;IAAEC;EAAK,CAAC,GAAG,MAAMD,UAAU,CAACE,OAAO,CACvC,IAAAC,qCAA+B,EAAC,CAAC,CAAC,CACpC,CAAC;EAED,OAAO,CAACF,IAAI,CAACG,2BAA2B,IAAI,EAAE,EAAEC,GAAG,CAAEC,IAAI,KAAM;IAC7DC,SAAS,EAAED,IAAI,CAACE,IAAI,IAAI,EAAE;IAC1BC,YAAY,EAAEH,IAAI,CAACG,YAAY,IAAI;MACjCC,gCAAgC,EAC9BJ,IAAI,CAACG,YAAY,CAACC,gCAAgC;MACpDC,UAAU,EAAEL,IAAI,CAACG,YAAY,CAACE;IAChC;EACF,CAAC,CAAC,CAAC;AACL,CAAC;AAACC,OAAA,CAAAb,0BAAA,GAAAA,0BAAA","ignoreList":[]}
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+
3
+ exports.__esModule = true;
4
+ exports.fetchUserPermissions = void 0;
5
+ var _http = require("@wix/bex-utils/@wix/ambassador-authorization-server/http");
6
+ /**
7
+ * The current user's ABAC permission strings for a metasite. The ABAC client comes from
8
+ * the `@wix/bex-utils` bundle via `/http` (not `/builders` — `Error.captureStackTrace`
9
+ * crashes Firefox/Safari).
10
+ */
11
+ const fetchUserPermissions = async metasiteId => {
12
+ const {
13
+ permissions = []
14
+ } = await (0, _http.AuthorizationServer)('/_api/authorization-server').AbacQueryService()().getCurrentSubjectPermissionsOnResource({
15
+ context: {
16
+ siteContext: {
17
+ metasiteId
18
+ }
19
+ }
20
+ });
21
+ return permissions;
22
+ };
23
+ exports.fetchUserPermissions = fetchUserPermissions;
24
+ //# sourceMappingURL=fetchUserPermissions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_http","require","fetchUserPermissions","metasiteId","permissions","AuthorizationServer","AbacQueryService","getCurrentSubjectPermissionsOnResource","context","siteContext","exports"],"sources":["../../../src/adapter/fetchUserPermissions.ts"],"sourcesContent":["import { AuthorizationServer } from '@wix/bex-utils/@wix/ambassador-authorization-server/http';\n\n/**\n * The current user's ABAC permission strings for a metasite. The ABAC client comes from\n * the `@wix/bex-utils` bundle via `/http` (not `/builders` — `Error.captureStackTrace`\n * crashes Firefox/Safari).\n */\nexport const fetchUserPermissions = async (\n metasiteId: string,\n): Promise<string[]> => {\n const { permissions = [] } = await AuthorizationServer(\n '/_api/authorization-server',\n )\n .AbacQueryService()()\n .getCurrentSubjectPermissionsOnResource({\n context: { siteContext: { metasiteId } },\n });\n\n return permissions as unknown as string[];\n};\n"],"mappings":";;;;AAAA,IAAAA,KAAA,GAAAC,OAAA;AAEA;AACA;AACA;AACA;AACA;AACO,MAAMC,oBAAoB,GAAG,MAClCC,UAAkB,IACI;EACtB,MAAM;IAAEC,WAAW,GAAG;EAAG,CAAC,GAAG,MAAM,IAAAC,yBAAmB,EACpD,4BACF,CAAC,CACEC,gBAAgB,CAAC,CAAC,CAAC,CAAC,CACpBC,sCAAsC,CAAC;IACtCC,OAAO,EAAE;MAAEC,WAAW,EAAE;QAAEN;MAAW;IAAE;EACzC,CAAC,CAAC;EAEJ,OAAOC,WAAW;AACpB,CAAC;AAACM,OAAA,CAAAR,oBAAA,GAAAA,oBAAA","ignoreList":[]}
@@ -0,0 +1,128 @@
1
+ "use strict";
2
+
3
+ exports.__esModule = true;
4
+ exports.addFiltersToDataQuery = addFiltersToDataQuery;
5
+ var _data = require("@wix/data");
6
+ var _bexCore = require("@wix/bex-core");
7
+ var _constants = require("./constants");
8
+ // FilterOperator is a real runtime enum exported from @wix/bex-core (not cairo).
9
+
10
+ const FilterPropToMethod = {
11
+ from: 'ge',
12
+ to: 'le',
13
+ [_bexCore.FilterOperator.CONTAINS]: 'contains',
14
+ [_bexCore.FilterOperator.IS_EMPTY]: 'isEmpty',
15
+ [_bexCore.FilterOperator.EXISTS]: 'isNotEmpty'
16
+ };
17
+ function isValidFilterProp(prop) {
18
+ return prop in FilterPropToMethod;
19
+ }
20
+ function getOperatorForFilter(prop) {
21
+ if (isValidFilterProp(prop)) {
22
+ return FilterPropToMethod[prop];
23
+ }
24
+ return undefined;
25
+ }
26
+ const isSupportedOperator = (fields, filterProp, filterKey) => {
27
+ var _field$capabilities;
28
+ const field = fields[filterKey];
29
+ if (!field) {
30
+ return false;
31
+ }
32
+ if (!isValidFilterProp(filterProp)) {
33
+ return false;
34
+ }
35
+ const operator = _constants.FilterPropToOperator[filterProp];
36
+ const supportedOperators = (_field$capabilities = field.capabilities) == null ? void 0 : _field$capabilities.supportedQueryOperators;
37
+ return supportedOperators == null ? void 0 : supportedOperators.includes(operator);
38
+ };
39
+
40
+ /**
41
+ * ADDRESS text operators query the `.formatted` nested property; existence operators
42
+ * (IS_EMPTY/EXISTS) query the field directly.
43
+ */
44
+ const getQueryFieldId = (fieldId, fieldType, operator) => {
45
+ const isAddressField = fieldType === 'ADDRESS';
46
+ const isExistenceOperator = operator === _bexCore.FilterOperator.IS_EMPTY || operator === _bexCore.FilterOperator.EXISTS;
47
+ return isAddressField && !isExistenceOperator ? `${fieldId}.formatted` : fieldId;
48
+ };
49
+ function addFiltersToDataQuery({
50
+ dataQuery,
51
+ query,
52
+ fields,
53
+ filterFieldMapping
54
+ }) {
55
+ if (!filterFieldMapping) {
56
+ return dataQuery;
57
+ }
58
+ let dataQueryWithFilters = dataQuery;
59
+ const {
60
+ filters
61
+ } = query;
62
+ for (const fieldKey in filters) {
63
+ const mapping = filterFieldMapping[fieldKey];
64
+ if (!mapping) {
65
+ continue;
66
+ }
67
+ const fieldId = mapping.fieldId;
68
+ const filter = filters[fieldKey];
69
+ if (!filter) {
70
+ continue;
71
+ }
72
+ if (Array.isArray(filter)) {
73
+ var _fields$fieldId, _fields$fieldId2;
74
+ const filterArray = filter;
75
+ if (((_fields$fieldId = fields[fieldId]) == null ? void 0 : _fields$fieldId.type) === 'BOOLEAN') {
76
+ if (filterArray.some(item => item.id === _constants.BooleanFilters.checked)) {
77
+ dataQueryWithFilters = dataQueryWithFilters.eq(fieldId, true);
78
+ } else {
79
+ const falseFilter = _data.items.filter().eq(fieldId, false);
80
+ const undefinedFilter = _data.items.filter().eq(fieldId, undefined);
81
+ dataQueryWithFilters = dataQueryWithFilters.and(falseFilter.or(undefinedFilter));
82
+ }
83
+ } else if ((_fields$fieldId2 = fields[fieldId]) != null && _fields$fieldId2.type && _constants.HAS_VALUE_FILTER_TYPES.includes(fields[fieldId].type)) {
84
+ const wantsHasValue = filterArray.some(item => item.id === _constants.HasValueFilters.hasValue);
85
+ const wantsNoValue = filterArray.some(item => item.id === _constants.HasValueFilters.noValue);
86
+ // Apply only when exactly one option is selected.
87
+ if (wantsHasValue && !wantsNoValue) {
88
+ dataQueryWithFilters = dataQueryWithFilters.isNotEmpty(fieldId);
89
+ } else if (wantsNoValue && !wantsHasValue) {
90
+ dataQueryWithFilters = dataQueryWithFilters.isEmpty(fieldId);
91
+ }
92
+ } else {
93
+ dataQueryWithFilters = dataQueryWithFilters.hasSome(fieldId, filterArray.map(item => item.id));
94
+ }
95
+ } else if (typeof filter === 'object') {
96
+ const operatorFilter = filter;
97
+ if (operatorFilter.operator) {
98
+ var _fields$fieldId3;
99
+ const queryFieldId = getQueryFieldId(fieldId, (_fields$fieldId3 = fields[fieldId]) == null ? void 0 : _fields$fieldId3.type, operatorFilter.operator);
100
+ if (operatorFilter.operator === _bexCore.FilterOperator.NOT_CONTAINS) {
101
+ const containsFilter = _data.items.filter().contains(queryFieldId, operatorFilter.value);
102
+ dataQueryWithFilters = dataQueryWithFilters.not(containsFilter);
103
+ } else {
104
+ const operator = getOperatorForFilter(operatorFilter.operator);
105
+ if (operator) {
106
+ if (operator === 'isEmpty' || operator === 'isNotEmpty') {
107
+ dataQueryWithFilters = dataQueryWithFilters[operator](fieldId);
108
+ } else {
109
+ dataQueryWithFilters = dataQueryWithFilters[operator](queryFieldId, operatorFilter.value);
110
+ }
111
+ }
112
+ }
113
+ }
114
+ const filterObj = filter;
115
+ for (const filterProp in filterObj) {
116
+ const operator = getOperatorForFilter(filterProp);
117
+ if (operator && typeof dataQuery[operator] === 'function' && isSupportedOperator(fields, filterProp, fieldId)) {
118
+ const value = filterObj[filterProp];
119
+ if (value !== undefined && value !== null) {
120
+ dataQueryWithFilters = dataQueryWithFilters[operator](fieldId, value);
121
+ }
122
+ }
123
+ }
124
+ }
125
+ }
126
+ return dataQueryWithFilters;
127
+ }
128
+ //# sourceMappingURL=filterUtils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_data","require","_bexCore","_constants","FilterPropToMethod","from","to","FilterOperator","CONTAINS","IS_EMPTY","EXISTS","isValidFilterProp","prop","getOperatorForFilter","undefined","isSupportedOperator","fields","filterProp","filterKey","_field$capabilities","field","operator","FilterPropToOperator","supportedOperators","capabilities","supportedQueryOperators","includes","getQueryFieldId","fieldId","fieldType","isAddressField","isExistenceOperator","addFiltersToDataQuery","dataQuery","query","filterFieldMapping","dataQueryWithFilters","filters","fieldKey","mapping","filter","Array","isArray","_fields$fieldId","_fields$fieldId2","filterArray","type","some","item","id","BooleanFilters","checked","eq","falseFilter","items","undefinedFilter","and","or","HAS_VALUE_FILTER_TYPES","wantsHasValue","HasValueFilters","hasValue","wantsNoValue","noValue","isNotEmpty","isEmpty","hasSome","map","operatorFilter","_fields$fieldId3","queryFieldId","NOT_CONTAINS","containsFilter","contains","value","not","filterObj"],"sources":["../../../src/adapter/filterUtils.ts"],"sourcesContent":["import { items } from '@wix/data';\n// FilterOperator is a real runtime enum exported from @wix/bex-core (not cairo).\nimport { FilterOperator } from '@wix/bex-core';\nimport type { OffsetQuery, Schema } from '@wix/bex-core';\nimport {\n BooleanFilters,\n FilterProp,\n FilterPropToOperator,\n HasValueFilters,\n HAS_VALUE_FILTER_TYPES,\n} from './constants';\n\ntype SchemaFields = Schema['fields'];\n\nexport type CmsOperatorMethod =\n | 'ge'\n | 'le'\n | 'contains'\n | 'isEmpty'\n | 'isNotEmpty';\n\nconst FilterPropToMethod: Partial<\n Record<FilterProp | FilterOperator, CmsOperatorMethod>\n> = {\n from: 'ge',\n to: 'le',\n [FilterOperator.CONTAINS]: 'contains',\n [FilterOperator.IS_EMPTY]: 'isEmpty',\n [FilterOperator.EXISTS]: 'isNotEmpty',\n};\n\nfunction isValidFilterProp(prop: string): prop is FilterProp {\n return prop in FilterPropToMethod;\n}\n\nfunction getOperatorForFilter(prop: string): CmsOperatorMethod | undefined {\n if (isValidFilterProp(prop)) {\n return FilterPropToMethod[prop];\n }\n return undefined;\n}\n\nconst isSupportedOperator = (\n fields: SchemaFields,\n filterProp: string,\n filterKey: string,\n) => {\n const field = fields[filterKey];\n if (!field) {\n return false;\n }\n\n if (!isValidFilterProp(filterProp)) {\n return false;\n }\n\n const operator = FilterPropToOperator[filterProp];\n const supportedOperators = field.capabilities?.supportedQueryOperators;\n return supportedOperators?.includes(operator);\n};\n\n/**\n * ADDRESS text operators query the `.formatted` nested property; existence operators\n * (IS_EMPTY/EXISTS) query the field directly.\n */\nconst getQueryFieldId = (\n fieldId: string,\n fieldType: string | undefined,\n operator: FilterOperator,\n): string => {\n const isAddressField = fieldType === 'ADDRESS';\n const isExistenceOperator =\n operator === FilterOperator.IS_EMPTY || operator === FilterOperator.EXISTS;\n\n return isAddressField && !isExistenceOperator\n ? `${fieldId}.formatted`\n : fieldId;\n};\n\nexport function addFiltersToDataQuery({\n dataQuery,\n query,\n fields,\n filterFieldMapping,\n}: {\n dataQuery: items.WixDataQuery;\n query: OffsetQuery;\n fields: SchemaFields;\n filterFieldMapping?: Record<string, { fieldId: string }>;\n}) {\n if (!filterFieldMapping) {\n return dataQuery;\n }\n\n let dataQueryWithFilters = dataQuery;\n const { filters } = query;\n for (const fieldKey in filters) {\n const mapping: { fieldId: string } | undefined =\n filterFieldMapping[fieldKey];\n if (!mapping) {\n continue;\n }\n const fieldId = mapping.fieldId;\n const filter = filters[fieldKey];\n if (!filter) {\n continue;\n }\n\n if (Array.isArray(filter)) {\n const filterArray = filter as { id?: unknown }[];\n if (fields[fieldId]?.type === 'BOOLEAN') {\n if (filterArray.some((item) => item.id === BooleanFilters.checked)) {\n dataQueryWithFilters = dataQueryWithFilters.eq(fieldId, true);\n } else {\n const falseFilter = items.filter().eq(fieldId, false);\n const undefinedFilter = items.filter().eq(fieldId, undefined);\n dataQueryWithFilters = dataQueryWithFilters.and(\n falseFilter.or(undefinedFilter),\n );\n }\n } else if (\n fields[fieldId]?.type &&\n HAS_VALUE_FILTER_TYPES.includes(fields[fieldId]!.type)\n ) {\n const wantsHasValue = filterArray.some(\n (item) => item.id === HasValueFilters.hasValue,\n );\n const wantsNoValue = filterArray.some(\n (item) => item.id === HasValueFilters.noValue,\n );\n // Apply only when exactly one option is selected.\n if (wantsHasValue && !wantsNoValue) {\n dataQueryWithFilters = dataQueryWithFilters.isNotEmpty(fieldId);\n } else if (wantsNoValue && !wantsHasValue) {\n dataQueryWithFilters = dataQueryWithFilters.isEmpty(fieldId);\n }\n } else {\n dataQueryWithFilters = dataQueryWithFilters.hasSome(\n fieldId,\n filterArray.map((item) => item.id) as string[],\n );\n }\n } else if (typeof filter === 'object') {\n const operatorFilter = filter as {\n operator?: FilterOperator;\n value?: unknown;\n };\n if (operatorFilter.operator) {\n const queryFieldId = getQueryFieldId(\n fieldId,\n fields[fieldId]?.type,\n operatorFilter.operator,\n );\n\n if (operatorFilter.operator === FilterOperator.NOT_CONTAINS) {\n const containsFilter = items\n .filter()\n .contains(queryFieldId, operatorFilter.value as string);\n dataQueryWithFilters = dataQueryWithFilters.not(containsFilter);\n } else {\n const operator = getOperatorForFilter(operatorFilter.operator);\n if (operator) {\n if (operator === 'isEmpty' || operator === 'isNotEmpty') {\n dataQueryWithFilters = dataQueryWithFilters[operator](fieldId);\n } else {\n dataQueryWithFilters = dataQueryWithFilters[operator](\n queryFieldId,\n operatorFilter.value as string,\n );\n }\n }\n }\n }\n const filterObj = filter as Record<string, unknown>;\n for (const filterProp in filterObj) {\n const operator = getOperatorForFilter(filterProp);\n if (\n operator &&\n typeof dataQuery[operator] === 'function' &&\n isSupportedOperator(fields, filterProp, fieldId)\n ) {\n const value = filterObj[filterProp];\n if (value !== undefined && value !== null) {\n dataQueryWithFilters = dataQueryWithFilters[operator](\n fieldId,\n value as string,\n );\n }\n }\n }\n }\n }\n\n return dataQueryWithFilters;\n}\n"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+
3
+ exports.__esModule = true;
4
+ exports.getFieldKey = void 0;
5
+ var _lodash = require("lodash");
6
+ const NON_ASCII_ALPHA_NUMERIC_UNDERSCORE_RE = /[^a-zA-Z_\d\s]/g;
7
+ const stripNonAsciiAlphaNumericUnderscore = str => str.replace(NON_ASCII_ALPHA_NUMERIC_UNDERSCORE_RE, '').trim();
8
+
9
+ /** Derives a unique CMS field key from a display name (dedupes against existing keys). */
10
+ const getFieldKey = (existingFieldKeys, displayName) => {
11
+ const baseSuggestion = (displayName.includes('_') ? _lodash.snakeCase : _lodash.camelCase)(stripNonAsciiAlphaNumericUnderscore(displayName));
12
+ let suggestion = baseSuggestion;
13
+ for (let attempt = 1; existingFieldKeys.includes(suggestion); attempt++) {
14
+ suggestion = baseSuggestion + attempt;
15
+ }
16
+ return suggestion;
17
+ };
18
+ exports.getFieldKey = getFieldKey;
19
+ //# sourceMappingURL=getFieldKey.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_lodash","require","NON_ASCII_ALPHA_NUMERIC_UNDERSCORE_RE","stripNonAsciiAlphaNumericUnderscore","str","replace","trim","getFieldKey","existingFieldKeys","displayName","baseSuggestion","includes","snakeCase","camelCase","suggestion","attempt","exports"],"sources":["../../../src/adapter/getFieldKey.ts"],"sourcesContent":["import { camelCase, snakeCase } from 'lodash';\n\nconst NON_ASCII_ALPHA_NUMERIC_UNDERSCORE_RE = /[^a-zA-Z_\\d\\s]/g;\n\nconst stripNonAsciiAlphaNumericUnderscore = (str: string) =>\n str.replace(NON_ASCII_ALPHA_NUMERIC_UNDERSCORE_RE, '').trim();\n\n/** Derives a unique CMS field key from a display name (dedupes against existing keys). */\nexport const getFieldKey = (\n existingFieldKeys: string[],\n displayName: string,\n): string => {\n const baseSuggestion = (displayName.includes('_') ? snakeCase : camelCase)(\n stripNonAsciiAlphaNumericUnderscore(displayName),\n );\n\n let suggestion = baseSuggestion;\n for (let attempt = 1; existingFieldKeys.includes(suggestion); attempt++) {\n suggestion = baseSuggestion + attempt;\n }\n return suggestion;\n};\n"],"mappings":";;;;AAAA,IAAAA,OAAA,GAAAC,OAAA;AAEA,MAAMC,qCAAqC,GAAG,iBAAiB;AAE/D,MAAMC,mCAAmC,GAAIC,GAAW,IACtDA,GAAG,CAACC,OAAO,CAACH,qCAAqC,EAAE,EAAE,CAAC,CAACI,IAAI,CAAC,CAAC;;AAE/D;AACO,MAAMC,WAAW,GAAGA,CACzBC,iBAA2B,EAC3BC,WAAmB,KACR;EACX,MAAMC,cAAc,GAAG,CAACD,WAAW,CAACE,QAAQ,CAAC,GAAG,CAAC,GAAGC,iBAAS,GAAGC,iBAAS,EACvEV,mCAAmC,CAACM,WAAW,CACjD,CAAC;EAED,IAAIK,UAAU,GAAGJ,cAAc;EAC/B,KAAK,IAAIK,OAAO,GAAG,CAAC,EAAEP,iBAAiB,CAACG,QAAQ,CAACG,UAAU,CAAC,EAAEC,OAAO,EAAE,EAAE;IACvED,UAAU,GAAGJ,cAAc,GAAGK,OAAO;EACvC;EACA,OAAOD,UAAU;AACnB,CAAC;AAACE,OAAA,CAAAT,WAAA,GAAAA,WAAA","ignoreList":[]}