@wix/patterns-cms 1.14.0 → 1.15.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/adapter/__tests__/cmsFieldActions.spec.js.map +1 -1
- package/dist/cjs/adapter/__tests__/createCmsBackend.spec.js +107 -14
- package/dist/cjs/adapter/__tests__/createCmsBackend.spec.js.map +1 -1
- package/dist/cjs/adapter/__tests__/filterUtils.spec.js +7 -7
- package/dist/cjs/adapter/__tests__/filterUtils.spec.js.map +1 -1
- package/dist/cjs/adapter/__tests__/searchUtils.spec.js.map +1 -1
- package/dist/cjs/adapter/__tests__/sortUtils.spec.js.map +1 -1
- package/dist/cjs/adapter/__tests__/transformCmsSchema.spec.js.map +1 -1
- package/dist/cjs/adapter/__tests__/useCmsSchemaSource.spec.js +47 -11
- package/dist/cjs/adapter/__tests__/useCmsSchemaSource.spec.js.map +1 -1
- package/dist/cjs/adapter/cmsBackup.js.map +1 -1
- package/dist/cjs/adapter/cmsFieldTypeMap.js.map +1 -1
- package/dist/cjs/adapter/cmsPermissions.js.map +1 -1
- package/dist/cjs/adapter/constants.js.map +1 -1
- package/dist/cjs/adapter/createCmsBackend.js +33 -10
- package/dist/cjs/adapter/createCmsBackend.js.map +1 -1
- package/dist/cjs/adapter/createCmsFieldActions.js.map +1 -1
- package/dist/cjs/adapter/fetchExternalDbConnections.js.map +1 -1
- package/dist/cjs/adapter/filterUtils.js +7 -7
- package/dist/cjs/adapter/filterUtils.js.map +1 -1
- package/dist/cjs/adapter/loadCmsSchema.js.map +1 -1
- package/dist/cjs/adapter/searchUtils.js.map +1 -1
- package/dist/cjs/adapter/sortUtils.js.map +1 -1
- package/dist/cjs/adapter/transformCmsSchema.js.map +1 -1
- package/dist/cjs/adapter/useCmsSchemaSource.js +36 -11
- package/dist/cjs/adapter/useCmsSchemaSource.js.map +1 -1
- package/dist/cjs/testkit/cmsFetchMocks.js +2 -2
- package/dist/cjs/testkit/cmsFetchMocks.js.map +1 -1
- package/dist/esm/adapter/__tests__/cmsFieldActions.spec.js +15 -3
- package/dist/esm/adapter/__tests__/cmsFieldActions.spec.js.map +1 -1
- package/dist/esm/adapter/__tests__/createCmsBackend.spec.js +68 -12
- package/dist/esm/adapter/__tests__/createCmsBackend.spec.js.map +1 -1
- package/dist/esm/adapter/__tests__/filterUtils.spec.js +1 -1
- package/dist/esm/adapter/__tests__/filterUtils.spec.js.map +1 -1
- package/dist/esm/adapter/__tests__/searchUtils.spec.js.map +1 -1
- package/dist/esm/adapter/__tests__/sortUtils.spec.js.map +1 -1
- package/dist/esm/adapter/__tests__/useCmsSchemaSource.spec.js +45 -6
- package/dist/esm/adapter/__tests__/useCmsSchemaSource.spec.js.map +1 -1
- package/dist/esm/adapter/createCmsBackend.js +33 -10
- package/dist/esm/adapter/createCmsBackend.js.map +1 -1
- package/dist/esm/adapter/createCmsFieldActions.js.map +1 -1
- package/dist/esm/adapter/filterUtils.js +2 -2
- package/dist/esm/adapter/filterUtils.js.map +1 -1
- package/dist/esm/adapter/loadCmsSchema.js.map +1 -1
- package/dist/esm/adapter/searchUtils.js.map +1 -1
- package/dist/esm/adapter/sortUtils.js.map +1 -1
- package/dist/esm/adapter/transformCmsSchema.js.map +1 -1
- package/dist/esm/adapter/useCmsSchemaSource.js +39 -8
- package/dist/esm/adapter/useCmsSchemaSource.js.map +1 -1
- package/dist/esm/testkit/cmsFetchMocks.js +1 -1
- package/dist/esm/testkit/cmsFetchMocks.js.map +1 -1
- package/dist/types/adapter/cmsBackup.d.ts +1 -1
- package/dist/types/adapter/cmsFieldTypeMap.d.ts +1 -1
- package/dist/types/adapter/cmsPermissions.d.ts +1 -1
- package/dist/types/adapter/constants.d.ts +1 -1
- package/dist/types/adapter/createCmsBackend.d.ts +1 -1
- package/dist/types/adapter/createCmsBackend.d.ts.map +1 -1
- package/dist/types/adapter/createCmsFieldActions.d.ts +1 -1
- package/dist/types/adapter/createCmsFieldActions.d.ts.map +1 -1
- package/dist/types/adapter/fetchExternalDbConnections.d.ts +1 -1
- package/dist/types/adapter/filterUtils.d.ts +2 -1
- package/dist/types/adapter/filterUtils.d.ts.map +1 -1
- package/dist/types/adapter/loadCmsSchema.d.ts +2 -1
- package/dist/types/adapter/loadCmsSchema.d.ts.map +1 -1
- package/dist/types/adapter/searchUtils.d.ts +2 -1
- package/dist/types/adapter/searchUtils.d.ts.map +1 -1
- package/dist/types/adapter/sortUtils.d.ts +2 -1
- package/dist/types/adapter/sortUtils.d.ts.map +1 -1
- package/dist/types/adapter/transformCmsSchema.d.ts +1 -1
- package/dist/types/adapter/transformCmsSchema.d.ts.map +1 -1
- package/dist/types/adapter/useCmsSchemaSource.d.ts +4 -1
- package/dist/types/adapter/useCmsSchemaSource.d.ts.map +1 -1
- package/dist/types/testkit/cmsFetchMocks.d.ts +2 -2
- package/dist/types/testkit/cmsFetchMocks.d.ts.map +1 -1
- package/package.json +7 -7
|
@@ -11,14 +11,26 @@ var _cmsBackup = require("./cmsBackup");
|
|
|
11
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
12
|
const getMultiReferenceFields = fields => Object.values(fields).filter(f => (f == null ? void 0 : f.type) === 'MULTI_REFERENCE');
|
|
13
13
|
|
|
14
|
-
/**
|
|
14
|
+
/** The referenced item's id, from either a bare id or the `{_id, <display>}`
|
|
15
|
+
* object the cell editors and form fields carry so they can render a label. */
|
|
16
|
+
const toReferenceId = value => {
|
|
17
|
+
if (value && typeof value === 'object' && !Array.isArray(value)) {
|
|
18
|
+
const id = value._id;
|
|
19
|
+
return typeof id === 'string' ? id : value;
|
|
20
|
+
}
|
|
21
|
+
return value;
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
/** MULTI_REFERENCE values aren't stored inline — sync them via the reference
|
|
25
|
+
* endpoint. A field the entity doesn't carry is left untouched; one it carries
|
|
26
|
+
* as empty (the last reference removed) is unlinked. */
|
|
15
27
|
const updateMultiReferences = async (collectionId, entityId, entity, multiReferenceFields) => {
|
|
16
28
|
await Promise.all(multiReferenceFields.map(async field => {
|
|
17
|
-
|
|
18
|
-
if (!Array.isArray(rawValue)) {
|
|
29
|
+
if (!(field.id in entity)) {
|
|
19
30
|
return;
|
|
20
31
|
}
|
|
21
|
-
const
|
|
32
|
+
const rawValue = entity[field.id];
|
|
33
|
+
const referenceIds = Array.isArray(rawValue) ? rawValue.map(value => toReferenceId(value)) : [];
|
|
22
34
|
await _data.items.replaceReferences(collectionId, field.id, entityId, referenceIds);
|
|
23
35
|
}));
|
|
24
36
|
};
|
|
@@ -73,9 +85,9 @@ function createCmsBackend(collectionId, fields) {
|
|
|
73
85
|
await _data.items.bulkRemove(collectionId, entityIds);
|
|
74
86
|
},
|
|
75
87
|
find: async (query, options = {}) => {
|
|
76
|
-
// Without options, search
|
|
77
|
-
//
|
|
78
|
-
//
|
|
88
|
+
// Without options, search is skipped. The options arg is not on the
|
|
89
|
+
// `CollectionBackend.find` contract type — how a consumer supplies it is
|
|
90
|
+
// still open.
|
|
79
91
|
const searchableFieldIds = options.searchableFieldIds ?? [];
|
|
80
92
|
let dataQuery = _data.items.query(collectionId);
|
|
81
93
|
dataQuery = (0, _searchUtils.addSearchToDataQuery)({
|
|
@@ -94,9 +106,20 @@ function createCmsBackend(collectionId, fields) {
|
|
|
94
106
|
query,
|
|
95
107
|
fields
|
|
96
108
|
});
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
109
|
+
|
|
110
|
+
// Reference fields are expanded for rendering, not for querying — the
|
|
111
|
+
// cells read the referenced item's display field off the value, so a row
|
|
112
|
+
// holding a bare id shows blank. Not gated on `searchableFieldIds`: this
|
|
113
|
+
// source's default is just the display field, so gating meant no
|
|
114
|
+
// expansion at all. Matches auto-patterns, which passes every visible
|
|
115
|
+
// field as searchable and so always expands.
|
|
116
|
+
//
|
|
117
|
+
// A read-restricted referenced collection makes the whole query fail. If
|
|
118
|
+
// that shows up, retry with the offending fields dropped (cms-web's
|
|
119
|
+
// `fallbackQueryWithInclude`), and chunk the list — includes are capped
|
|
120
|
+
// per query.
|
|
121
|
+
if (allReferenceFieldIds.length > 0) {
|
|
122
|
+
dataQuery = dataQuery.include(...allReferenceFieldIds);
|
|
100
123
|
}
|
|
101
124
|
const offset = query.offset ?? 0;
|
|
102
125
|
const res = await dataQuery.skip(offset).limit(query.limit).find({
|
|
@@ -1 +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","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 CollectionBackendBase,\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/** CMS supports every item capability except `move`. */\nexport type CmsCollectionBackend<\n T extends Record<string, unknown> = Record<string, unknown>,\n> = CollectionBackend<T> & Required<Omit<CollectionBackendBase<T>, 'move'>>;\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): CmsCollectionBackend<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 } = {},\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\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 });\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":[]}
|
|
1
|
+
{"version":3,"names":["_data","require","_essentials","_filterUtils","_searchUtils","_sortUtils","_cmsBackup","getReferenceFields","fields","Object","values","filter","f","type","getMultiReferenceFields","toReferenceId","value","Array","isArray","id","_id","updateMultiReferences","collectionId","entityId","entity","multiReferenceFields","Promise","all","map","field","rawValue","referenceIds","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","addSearchToDataQuery","addFiltersToDataQuery","addSortToDataQuery","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 Field,\n OffsetQuery,\n OffsetQueryResult,\n} from '@wix/patterns';\nimport type {\n CollectionBackend,\n CollectionBackendBase,\n Schema,\n} from '@wix/patterns/schema';\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/** The referenced item's id, from either a bare id or the `{_id, <display>}`\n * object the cell editors and form fields carry so they can render a label. */\nconst toReferenceId = (value: unknown): unknown => {\n if (value && typeof value === 'object' && !Array.isArray(value)) {\n const id = (value as Record<string, unknown>)._id;\n return typeof id === 'string' ? id : value;\n }\n return value;\n};\n\n/** MULTI_REFERENCE values aren't stored inline — sync them via the reference\n * endpoint. A field the entity doesn't carry is left untouched; one it carries\n * as empty (the last reference removed) is unlinked. */\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 if (!(field.id in entity)) {\n return;\n }\n const rawValue = entity[field.id];\n const referenceIds = Array.isArray(rawValue)\n ? rawValue.map((value) => toReferenceId(value) as string)\n : [];\n\n await items.replaceReferences(\n collectionId,\n field.id,\n entityId,\n referenceIds,\n );\n }),\n );\n};\n\n/** CMS supports every item capability except `move`. */\nexport type CmsCollectionBackend<\n T extends Record<string, unknown> = Record<string, unknown>,\n> = CollectionBackend<T> & Required<Omit<CollectionBackendBase<T>, 'move'>>;\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): CmsCollectionBackend<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 } = {},\n ): Promise<OffsetQueryResult<T>> => {\n // Without options, search is skipped. The options arg is not on the\n // `CollectionBackend.find` contract type — how a consumer supplies it is\n // still open.\n const searchableFieldIds: string[] = options.searchableFieldIds ?? [];\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 });\n dataQuery = addSortToDataQuery({ dataQuery, query, fields });\n\n // Reference fields are expanded for rendering, not for querying — the\n // cells read the referenced item's display field off the value, so a row\n // holding a bare id shows blank. Not gated on `searchableFieldIds`: this\n // source's default is just the display field, so gating meant no\n // expansion at all. Matches auto-patterns, which passes every visible\n // field as searchable and so always expands.\n //\n // A read-restricted referenced collection makes the whole query fail. If\n // that shows up, retry with the offending fields dropped (cms-web's\n // `fallbackQueryWithInclude`), and chunk the list — includes are capped\n // per query.\n if (allReferenceFieldIds.length > 0) {\n dataQuery = dataQuery.include(...allReferenceFieldIds);\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":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_data","require","_cmsFieldTypeMap","_transformCmsSchema","_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","fieldsAfterMutation","dataCollection","transformCmsSchema","toCmsField","field","_field$validation","_field$validation2","_field$validation3","cmsType","PatternsFieldTypeToCmsFieldType","type","cmsField","displayName","required","validation","isPii","encrypted","helpText","numberRange","stringLengthRange","buildFieldPatch","fieldId","updates","_findCmsField","_updates$validation","_updates$validation2","_updates$validation3","sourceCmsType","patch","undefined","cloneFieldDefinition","source","newKey","newDisplayName","_cloned$typeMetadata","systemField","capabilities","rest","cloned","typeMetadata","multiReference","referencingFieldKey","addField","getFieldKey","collections","createDataCollectionField","addFields","collection","cmsFields","map","id","updateDataCollection","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, Schema } from '@wix/bex-core';\nimport { PatternsFieldTypeToCmsFieldType } from './cmsFieldTypeMap';\nimport { transformCmsSchema } from './transformCmsSchema';\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 // A field mutation returns the updated collection; turn it into the new fields\n // map. The SDK guarantees `dataCollection` on a successful mutation, so there is\n // no missing-collection case to handle here.\n const fieldsAfterMutation = (\n dataCollection: collections.DataCollection,\n ): Schema['fields'] => transformCmsSchema(dataCollection).fields;\n\n // Maps a source-neutral `Field` to a CMS field under the given `key`. Throws\n // for a type with no CMS mapping before any SDK call. Shared by addField (key\n // derived from the display name) and addFields (key = the caller's field.id).\n const toCmsField = (field: Field, key: string): collections.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,\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 return cmsField;\n };\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 cmsField = toCmsField(\n field,\n getFieldKey(existingFieldKeys(), field.displayName),\n );\n const { dataCollection } = await collections.createDataCollectionField(\n collectionId,\n { field: cmsField },\n );\n return fieldsAfterMutation(dataCollection!);\n },\n\n addFields: async (fields: Field[]) => {\n const collection = getCollection();\n if (!collection) {\n throw new Error(`Collection ${collectionId} not found`);\n }\n\n // Callers decide the keys up front (import uploads values under them), so\n // key each new field by its `id` — mapped before any SDK call so an\n // unsupported type throws without a partial write.\n const cmsFields = fields.map((field) => toCmsField(field, field.id));\n\n // One mutation for all new fields: append them to the existing\n // definition. Unlike the field mutations, `updateDataCollection` resolves\n // with the updated collection directly (not wrapped in `{ dataCollection }`).\n const dataCollection = await collections.updateDataCollection({\n ...collection,\n fields: [...(collection.fields ?? []), ...cmsFields],\n });\n return fieldsAfterMutation(dataCollection);\n },\n\n editField: async (fieldId, updates) => {\n const { dataCollection } = await collections.patchDataCollectionField(\n collectionId,\n buildFieldPatch(fieldId, updates),\n );\n return fieldsAfterMutation(dataCollection!);\n },\n\n deleteField: async (fieldId) => {\n const { dataCollection } = await collections.deleteDataCollectionField(\n collectionId,\n { fieldKey: fieldId },\n );\n return fieldsAfterMutation(dataCollection!);\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 const { dataCollection } = await collections.patchDataCollection(\n collectionId,\n { displayField: fieldId },\n );\n return fieldsAfterMutation(dataCollection!);\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 const { dataCollection } = await collections.createDataCollectionField(\n collectionId,\n { field: cloneFieldDefinition(sourceField, newKey, newDisplayName) },\n );\n return fieldsAfterMutation(dataCollection!);\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 const { dataCollection } = await collections.createDataCollectionField(\n 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 return fieldsAfterMutation(dataCollection!);\n },\n };\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":["_data","require","_cmsFieldTypeMap","_transformCmsSchema","_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","fieldsAfterMutation","dataCollection","transformCmsSchema","toCmsField","field","_field$validation","_field$validation2","_field$validation3","cmsType","PatternsFieldTypeToCmsFieldType","type","cmsField","displayName","required","validation","isPii","encrypted","helpText","numberRange","stringLengthRange","buildFieldPatch","fieldId","updates","_findCmsField","_updates$validation","_updates$validation2","_updates$validation3","sourceCmsType","patch","undefined","cloneFieldDefinition","source","newKey","newDisplayName","_cloned$typeMetadata","systemField","capabilities","rest","cloned","typeMetadata","multiReference","referencingFieldKey","addField","getFieldKey","collections","createDataCollectionField","addFields","collection","cmsFields","map","id","updateDataCollection","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 } from '@wix/patterns';\nimport type { FieldActions, Schema } from '@wix/patterns/schema';\nimport { PatternsFieldTypeToCmsFieldType } from './cmsFieldTypeMap';\nimport { transformCmsSchema } from './transformCmsSchema';\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 // A field mutation returns the updated collection; turn it into the new fields\n // map. The SDK guarantees `dataCollection` on a successful mutation, so there is\n // no missing-collection case to handle here.\n const fieldsAfterMutation = (\n dataCollection: collections.DataCollection,\n ): Schema['fields'] => transformCmsSchema(dataCollection).fields;\n\n // Maps a source-neutral `Field` to a CMS field under the given `key`. Throws\n // for a type with no CMS mapping before any SDK call. Shared by addField (key\n // derived from the display name) and addFields (key = the caller's field.id).\n const toCmsField = (field: Field, key: string): collections.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,\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 return cmsField;\n };\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 cmsField = toCmsField(\n field,\n getFieldKey(existingFieldKeys(), field.displayName),\n );\n const { dataCollection } = await collections.createDataCollectionField(\n collectionId,\n { field: cmsField },\n );\n return fieldsAfterMutation(dataCollection!);\n },\n\n addFields: async (fields: Field[]) => {\n const collection = getCollection();\n if (!collection) {\n throw new Error(`Collection ${collectionId} not found`);\n }\n\n // Callers decide the keys up front (import uploads values under them), so\n // key each new field by its `id` — mapped before any SDK call so an\n // unsupported type throws without a partial write.\n const cmsFields = fields.map((field) => toCmsField(field, field.id));\n\n // One mutation for all new fields: append them to the existing\n // definition. Unlike the field mutations, `updateDataCollection` resolves\n // with the updated collection directly (not wrapped in `{ dataCollection }`).\n const dataCollection = await collections.updateDataCollection({\n ...collection,\n fields: [...(collection.fields ?? []), ...cmsFields],\n });\n return fieldsAfterMutation(dataCollection);\n },\n\n editField: async (fieldId, updates) => {\n const { dataCollection } = await collections.patchDataCollectionField(\n collectionId,\n buildFieldPatch(fieldId, updates),\n );\n return fieldsAfterMutation(dataCollection!);\n },\n\n deleteField: async (fieldId) => {\n const { dataCollection } = await collections.deleteDataCollectionField(\n collectionId,\n { fieldKey: fieldId },\n );\n return fieldsAfterMutation(dataCollection!);\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 const { dataCollection } = await collections.patchDataCollection(\n collectionId,\n { displayField: fieldId },\n );\n return fieldsAfterMutation(dataCollection!);\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 const { dataCollection } = await collections.createDataCollectionField(\n collectionId,\n { field: cloneFieldDefinition(sourceField, newKey, newDisplayName) },\n );\n return fieldsAfterMutation(dataCollection!);\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 const { dataCollection } = await collections.createDataCollectionField(\n 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 return fieldsAfterMutation(dataCollection!);\n },\n };\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -1 +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/
|
|
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/patterns';\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":[]}
|
|
@@ -3,16 +3,16 @@
|
|
|
3
3
|
exports.__esModule = true;
|
|
4
4
|
exports.addFiltersToDataQuery = addFiltersToDataQuery;
|
|
5
5
|
var _data = require("@wix/data");
|
|
6
|
-
var
|
|
6
|
+
var _patterns = require("@wix/patterns");
|
|
7
7
|
var _constants = require("./constants");
|
|
8
|
-
// FilterOperator is a real runtime enum
|
|
8
|
+
// FilterOperator is a real runtime enum (a value import, not type-only).
|
|
9
9
|
|
|
10
10
|
const FilterPropToMethod = {
|
|
11
11
|
from: 'ge',
|
|
12
12
|
to: 'le',
|
|
13
|
-
[
|
|
14
|
-
[
|
|
15
|
-
[
|
|
13
|
+
[_patterns.FilterOperator.CONTAINS]: 'contains',
|
|
14
|
+
[_patterns.FilterOperator.IS_EMPTY]: 'isEmpty',
|
|
15
|
+
[_patterns.FilterOperator.EXISTS]: 'isNotEmpty'
|
|
16
16
|
};
|
|
17
17
|
function isValidFilterProp(prop) {
|
|
18
18
|
return prop in FilterPropToMethod;
|
|
@@ -43,7 +43,7 @@ const isSupportedOperator = (fields, filterProp, filterKey) => {
|
|
|
43
43
|
*/
|
|
44
44
|
const getQueryFieldId = (fieldId, fieldType, operator) => {
|
|
45
45
|
const isAddressField = fieldType === 'ADDRESS';
|
|
46
|
-
const isExistenceOperator = operator ===
|
|
46
|
+
const isExistenceOperator = operator === _patterns.FilterOperator.IS_EMPTY || operator === _patterns.FilterOperator.EXISTS;
|
|
47
47
|
return isAddressField && !isExistenceOperator ? `${fieldId}.formatted` : fieldId;
|
|
48
48
|
};
|
|
49
49
|
function addFiltersToDataQuery({
|
|
@@ -93,7 +93,7 @@ function addFiltersToDataQuery({
|
|
|
93
93
|
if (operatorFilter.operator) {
|
|
94
94
|
var _fields$fieldId3;
|
|
95
95
|
const queryFieldId = getQueryFieldId(fieldId, (_fields$fieldId3 = fields[fieldId]) == null ? void 0 : _fields$fieldId3.type, operatorFilter.operator);
|
|
96
|
-
if (operatorFilter.operator ===
|
|
96
|
+
if (operatorFilter.operator === _patterns.FilterOperator.NOT_CONTAINS) {
|
|
97
97
|
const containsFilter = _data.items.filter().contains(queryFieldId, operatorFilter.value);
|
|
98
98
|
dataQueryWithFilters = dataQueryWithFilters.not(containsFilter);
|
|
99
99
|
} else {
|
|
@@ -1 +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","dataQueryWithFilters","filters","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}: {\n dataQuery: items.WixDataQuery;\n query: OffsetQuery;\n fields: SchemaFields;\n}) {\n let dataQueryWithFilters = dataQuery;\n const { filters } = query;\n for (const fieldId in filters) {\n // Skip filters for keys that aren't fields in the loaded schema (stale URL\n // state, a deleted field) — otherwise the query hits an unknown field.\n if (!fields[fieldId]) {\n continue;\n }\n const filter = filters[fieldId];\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":[]}
|
|
1
|
+
{"version":3,"names":["_data","require","_patterns","_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","dataQueryWithFilters","filters","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 (a value import, not type-only).\nimport { FilterOperator } from '@wix/patterns';\nimport type { OffsetQuery } from '@wix/patterns';\nimport type { Schema } from '@wix/patterns/schema';\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}: {\n dataQuery: items.WixDataQuery;\n query: OffsetQuery;\n fields: SchemaFields;\n}) {\n let dataQueryWithFilters = dataQuery;\n const { filters } = query;\n for (const fieldId in filters) {\n // Skip filters for keys that aren't fields in the loaded schema (stale URL\n // state, a deleted field) — otherwise the query hits an unknown field.\n if (!fields[fieldId]) {\n continue;\n }\n const filter = filters[fieldId];\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":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_data","require","_essentials","_transformCmsSchema","_createCmsBackend","_createCmsFieldActions","_fetchExternalDbConnections","_fetchUserPermissions","fetchCmsCollection","collectionId","errorHandler","withErrorHandler","collections","getDataCollection","includeAllowedDataPermissions","createCmsSchemaLoader","deps","httpClient","includeUserPermissions","metasiteId","undefined","rawCollection","userPermissions","externalDbConnections","Promise","all","resolve","fetchUserPermissions","catch","fetchExternalDbConnections","schema","transformCmsSchema","backend","createCmsBackend","fields","fieldActions","createCmsFieldActions"],"sources":["../../../src/adapter/loadCmsSchema.ts"],"sourcesContent":["import { collections } from '@wix/data';\nimport { errorHandler } from '@wix/essentials';\nimport type {
|
|
1
|
+
{"version":3,"names":["_data","require","_essentials","_transformCmsSchema","_createCmsBackend","_createCmsFieldActions","_fetchExternalDbConnections","_fetchUserPermissions","fetchCmsCollection","collectionId","errorHandler","withErrorHandler","collections","getDataCollection","includeAllowedDataPermissions","createCmsSchemaLoader","deps","httpClient","includeUserPermissions","metasiteId","undefined","rawCollection","userPermissions","externalDbConnections","Promise","all","resolve","fetchUserPermissions","catch","fetchExternalDbConnections","schema","transformCmsSchema","backend","createCmsBackend","fields","fieldActions","createCmsFieldActions"],"sources":["../../../src/adapter/loadCmsSchema.ts"],"sourcesContent":["import { collections } from '@wix/data';\nimport { errorHandler } from '@wix/essentials';\nimport type { WixPatternsContainerParams } from '@wix/patterns';\nimport type { LoadedSchema, SchemaLoader } from '@wix/patterns/schema';\nimport { transformCmsSchema } from './transformCmsSchema';\nimport { createCmsBackend } from './createCmsBackend';\nimport { createCmsFieldActions } from './createCmsFieldActions';\nimport type { ExternalDbConnection } from './cmsPermissions';\nimport { fetchExternalDbConnections } from './fetchExternalDbConnections';\nimport { fetchUserPermissions } from './fetchUserPermissions';\n\ntype HttpClient = WixPatternsContainerParams['httpClient'];\n\nexport interface CreateCmsSchemaLoaderDeps {\n httpClient: HttpClient;\n /** Fetch the user's ABAC permissions for field-management gating. Default `false`. */\n includeUserPermissions?: boolean;\n /** Host-supplied metasite id; the ABAC permission fetch is skipped without it. */\n metasiteId?: string;\n /** Pre-resolved overrides (tests); skip the internal fetch when provided. */\n userPermissions?: string[];\n externalDbConnections?: ExternalDbConnection[];\n}\n\n/**\n * Fetches the raw `@wix/data` collection. `includeAllowedDataPermissions` asks the\n * server to evaluate the calling user against the collection's data-permission rules\n * (`allowedDataPermissions` on the response — read by cmsPermissions.ts). The option\n * is forwarded at runtime but stripped from the public typings, hence the cast.\n */\nexport async function fetchCmsCollection(\n collectionId: string,\n): Promise<collections.DataCollection> {\n return errorHandler.withErrorHandler<collections.DataCollection>(\n async () =>\n collections.getDataCollection(collectionId, {\n includeAllowedDataPermissions: true,\n } as collections.GetDataCollectionOptions),\n {},\n );\n}\n\n/**\n * Creates the CMS `SchemaLoader`: fetches the collection, ABAC permissions and\n * external-DB connections in parallel and returns them as `LoadedSchema`.\n * Failed permission/connection fetches degrade to `[]`.\n */\nexport function createCmsSchemaLoader<\n T extends Record<string, unknown> = Record<string, unknown>,\n>(deps: CreateCmsSchemaLoaderDeps): SchemaLoader<T> {\n const { httpClient, includeUserPermissions = false } = deps;\n\n return async (collectionId: string): Promise<LoadedSchema<T>> => {\n const metasiteId = includeUserPermissions ? deps.metasiteId : undefined;\n\n const [rawCollection, userPermissions, externalDbConnections] =\n await Promise.all([\n fetchCmsCollection(collectionId),\n deps.userPermissions !== undefined\n ? Promise.resolve(deps.userPermissions)\n : includeUserPermissions && metasiteId\n ? fetchUserPermissions(metasiteId).catch(() => [] as string[])\n : Promise.resolve([] as string[]),\n deps.externalDbConnections !== undefined\n ? Promise.resolve(deps.externalDbConnections)\n : fetchExternalDbConnections(httpClient).catch(\n () => [] as ExternalDbConnection[],\n ),\n ]);\n\n const schema = transformCmsSchema(rawCollection, {\n userPermissions,\n externalDbConnections,\n });\n const backend = createCmsBackend<T>(collectionId, schema.fields);\n const fieldActions = createCmsFieldActions(\n collectionId,\n () => rawCollection,\n );\n\n return { schema, backend, fieldActions };\n };\n}\n"],"mappings":";;;;;AAAA,IAAAA,KAAA,GAAAC,OAAA;AACA,IAAAC,WAAA,GAAAD,OAAA;AAGA,IAAAE,mBAAA,GAAAF,OAAA;AACA,IAAAG,iBAAA,GAAAH,OAAA;AACA,IAAAI,sBAAA,GAAAJ,OAAA;AAEA,IAAAK,2BAAA,GAAAL,OAAA;AACA,IAAAM,qBAAA,GAAAN,OAAA;AAeA;AACA;AACA;AACA;AACA;AACA;AACO,eAAeO,kBAAkBA,CACtCC,YAAoB,EACiB;EACrC,OAAOC,wBAAY,CAACC,gBAAgB,CAClC,YACEC,iBAAW,CAACC,iBAAiB,CAACJ,YAAY,EAAE;IAC1CK,6BAA6B,EAAE;EACjC,CAAyC,CAAC,EAC5C,CAAC,CACH,CAAC;AACH;;AAEA;AACA;AACA;AACA;AACA;AACO,SAASC,qBAAqBA,CAEnCC,IAA+B,EAAmB;EAClD,MAAM;IAAEC,UAAU;IAAEC,sBAAsB,GAAG;EAAM,CAAC,GAAGF,IAAI;EAE3D,OAAO,MAAOP,YAAoB,IAA+B;IAC/D,MAAMU,UAAU,GAAGD,sBAAsB,GAAGF,IAAI,CAACG,UAAU,GAAGC,SAAS;IAEvE,MAAM,CAACC,aAAa,EAAEC,eAAe,EAAEC,qBAAqB,CAAC,GAC3D,MAAMC,OAAO,CAACC,GAAG,CAAC,CAChBjB,kBAAkB,CAACC,YAAY,CAAC,EAChCO,IAAI,CAACM,eAAe,KAAKF,SAAS,GAC9BI,OAAO,CAACE,OAAO,CAACV,IAAI,CAACM,eAAe,CAAC,GACrCJ,sBAAsB,IAAIC,UAAU,GACpC,IAAAQ,0CAAoB,EAACR,UAAU,CAAC,CAACS,KAAK,CAAC,MAAM,EAAc,CAAC,GAC5DJ,OAAO,CAACE,OAAO,CAAC,EAAc,CAAC,EACnCV,IAAI,CAACO,qBAAqB,KAAKH,SAAS,GACpCI,OAAO,CAACE,OAAO,CAACV,IAAI,CAACO,qBAAqB,CAAC,GAC3C,IAAAM,sDAA0B,EAACZ,UAAU,CAAC,CAACW,KAAK,CAC1C,MAAM,EACR,CAAC,CACN,CAAC;IAEJ,MAAME,MAAM,GAAG,IAAAC,sCAAkB,EAACV,aAAa,EAAE;MAC/CC,eAAe;MACfC;IACF,CAAC,CAAC;IACF,MAAMS,OAAO,GAAG,IAAAC,kCAAgB,EAAIxB,YAAY,EAAEqB,MAAM,CAACI,MAAM,CAAC;IAChE,MAAMC,YAAY,GAAG,IAAAC,4CAAqB,EACxC3B,YAAY,EACZ,MAAMY,aACR,CAAC;IAED,OAAO;MAAES,MAAM;MAAEE,OAAO;MAAEG;IAAa,CAAC;EAC1C,CAAC;AACH","ignoreList":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_data","require","TEXT_FIELD_TYPES","addSearchToDataQuery","dataQuery","query","fields","searchableFieldIds","searchableFields","Object","keys","filter","fieldId","field","isFieldSearchable","includes","type","search","length","searchFilter","forEach","currentFilter","items","contains","or","and"],"sources":["../../../src/adapter/searchUtils.ts"],"sourcesContent":["import { items } from '@wix/data';\nimport type { OffsetQuery
|
|
1
|
+
{"version":3,"names":["_data","require","TEXT_FIELD_TYPES","addSearchToDataQuery","dataQuery","query","fields","searchableFieldIds","searchableFields","Object","keys","filter","fieldId","field","isFieldSearchable","includes","type","search","length","searchFilter","forEach","currentFilter","items","contains","or","and"],"sources":["../../../src/adapter/searchUtils.ts"],"sourcesContent":["import { items } from '@wix/data';\nimport type { OffsetQuery } from '@wix/patterns';\nimport type { Schema } from '@wix/patterns/schema';\n\ntype SchemaFields = Schema['fields'];\n\nconst TEXT_FIELD_TYPES = ['LONG_TEXT', 'SHORT_TEXT'];\n\n/** Free-text search: OR of `contains` over `SHORT_TEXT`/`LONG_TEXT` fields in `searchableFieldIds`. */\nexport function addSearchToDataQuery({\n dataQuery,\n query,\n fields,\n searchableFieldIds,\n}: {\n dataQuery: items.WixDataQuery;\n query: OffsetQuery;\n fields: SchemaFields;\n searchableFieldIds: string[];\n}) {\n const searchableFields = Object.keys(fields).filter((fieldId) => {\n const field = fields[fieldId];\n const isFieldSearchable = searchableFieldIds.includes(fieldId);\n\n return isFieldSearchable && field && TEXT_FIELD_TYPES.includes(field.type);\n });\n\n if (query.search && searchableFields.length > 0) {\n let searchFilter: items.WixDataFilter | null = null;\n\n searchableFields.forEach((field) => {\n const currentFilter = items.filter().contains(field, query.search!);\n searchFilter = searchFilter\n ? searchFilter.or(currentFilter)\n : currentFilter;\n });\n\n if (searchFilter) {\n dataQuery = dataQuery.and(searchFilter);\n }\n }\n\n return dataQuery;\n}\n"],"mappings":";;;;AAAA,IAAAA,KAAA,GAAAC,OAAA;AAMA,MAAMC,gBAAgB,GAAG,CAAC,WAAW,EAAE,YAAY,CAAC;;AAEpD;AACO,SAASC,oBAAoBA,CAAC;EACnCC,SAAS;EACTC,KAAK;EACLC,MAAM;EACNC;AAMF,CAAC,EAAE;EACD,MAAMC,gBAAgB,GAAGC,MAAM,CAACC,IAAI,CAACJ,MAAM,CAAC,CAACK,MAAM,CAAEC,OAAO,IAAK;IAC/D,MAAMC,KAAK,GAAGP,MAAM,CAACM,OAAO,CAAC;IAC7B,MAAME,iBAAiB,GAAGP,kBAAkB,CAACQ,QAAQ,CAACH,OAAO,CAAC;IAE9D,OAAOE,iBAAiB,IAAID,KAAK,IAAIX,gBAAgB,CAACa,QAAQ,CAACF,KAAK,CAACG,IAAI,CAAC;EAC5E,CAAC,CAAC;EAEF,IAAIX,KAAK,CAACY,MAAM,IAAIT,gBAAgB,CAACU,MAAM,GAAG,CAAC,EAAE;IAC/C,IAAIC,YAAwC,GAAG,IAAI;IAEnDX,gBAAgB,CAACY,OAAO,CAAEP,KAAK,IAAK;MAClC,MAAMQ,aAAa,GAAGC,WAAK,CAACX,MAAM,CAAC,CAAC,CAACY,QAAQ,CAACV,KAAK,EAAER,KAAK,CAACY,MAAO,CAAC;MACnEE,YAAY,GAAGA,YAAY,GACvBA,YAAY,CAACK,EAAE,CAACH,aAAa,CAAC,GAC9BA,aAAa;IACnB,CAAC,CAAC;IAEF,IAAIF,YAAY,EAAE;MAChBf,SAAS,GAAGA,SAAS,CAACqB,GAAG,CAACN,YAAY,CAAC;IACzC;EACF;EAEA,OAAOf,SAAS;AAClB","ignoreList":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["addSortToDataQuery","dataQuery","query","fields","dataQueryWithSort","sort","forEach","sortField","fieldName","order","_fieldDefinition$capa","fieldDefinition","capabilities","sortable","ascending","descending"],"sources":["../../../src/adapter/sortUtils.ts"],"sourcesContent":["import { items } from '@wix/data';\nimport type { OffsetQuery
|
|
1
|
+
{"version":3,"names":["addSortToDataQuery","dataQuery","query","fields","dataQueryWithSort","sort","forEach","sortField","fieldName","order","_fieldDefinition$capa","fieldDefinition","capabilities","sortable","ascending","descending"],"sources":["../../../src/adapter/sortUtils.ts"],"sourcesContent":["import { items } from '@wix/data';\nimport type { OffsetQuery } from '@wix/patterns';\nimport type { Schema } from '@wix/patterns/schema';\n\ntype SchemaFields = Schema['fields'];\n\n/** Applies the query's sort to the WQL query — only `sortable` fields. */\nexport function addSortToDataQuery({\n dataQuery,\n query,\n fields,\n}: {\n dataQuery: items.WixDataQuery;\n query: OffsetQuery;\n fields: SchemaFields;\n}) {\n let dataQueryWithSort = dataQuery;\n const { sort } = query;\n sort?.forEach((sortField) => {\n const { fieldName, order } = sortField;\n if (fieldName && order) {\n const fieldDefinition = fields[fieldName];\n if (fieldDefinition?.capabilities?.sortable) {\n if (order === 'asc') {\n dataQueryWithSort = dataQueryWithSort.ascending(fieldName);\n } else if (order === 'desc') {\n dataQueryWithSort = dataQueryWithSort.descending(fieldName);\n }\n }\n }\n });\n\n return dataQueryWithSort;\n}\n"],"mappings":";;;;AAMA;AACO,SAASA,kBAAkBA,CAAC;EACjCC,SAAS;EACTC,KAAK;EACLC;AAKF,CAAC,EAAE;EACD,IAAIC,iBAAiB,GAAGH,SAAS;EACjC,MAAM;IAAEI;EAAK,CAAC,GAAGH,KAAK;EACtBG,IAAI,YAAJA,IAAI,CAAEC,OAAO,CAAEC,SAAS,IAAK;IAC3B,MAAM;MAAEC,SAAS;MAAEC;IAAM,CAAC,GAAGF,SAAS;IACtC,IAAIC,SAAS,IAAIC,KAAK,EAAE;MAAA,IAAAC,qBAAA;MACtB,MAAMC,eAAe,GAAGR,MAAM,CAACK,SAAS,CAAC;MACzC,IAAIG,eAAe,aAAAD,qBAAA,GAAfC,eAAe,CAAEC,YAAY,aAA7BF,qBAAA,CAA+BG,QAAQ,EAAE;QAC3C,IAAIJ,KAAK,KAAK,KAAK,EAAE;UACnBL,iBAAiB,GAAGA,iBAAiB,CAACU,SAAS,CAACN,SAAS,CAAC;QAC5D,CAAC,MAAM,IAAIC,KAAK,KAAK,MAAM,EAAE;UAC3BL,iBAAiB,GAAGA,iBAAiB,CAACW,UAAU,CAACP,SAAS,CAAC;QAC7D;MACF;IACF;EACF,CAAC,CAAC;EAEF,OAAOJ,iBAAiB;AAC1B","ignoreList":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_cmsFieldTypeMap","require","_cmsPermissions","transformCmsSchema","schema","options","userPermissions","externalDbConnections","collectionId","_id","transformedFields","fields","reduce","acc","field","_field$capabilities","_field$capabilities2","_field$typeMetadata","_field$typeMetadata2","key","fieldType","type","CmsFieldTypeToPatternsFieldType","baseField","id","displayName","isPrimary","displayField","isPii","encrypted","helpText","description","undefined","isSystem","systemField","startsWith","validation","numberRange","min","max","stringLengthRange","minLength","maxLength","required","capabilities","supportedQueryOperators","queryOperators","sortable","referencedCollectionId","typeMetadata","reference","multiReference","isReference","referenceMetadata","schemaPermissions","itemPermissions","computeCmsPermissions","idField"],"sources":["../../../src/adapter/transformCmsSchema.ts"],"sourcesContent":["import { collections } from '@wix/data';\nimport type { Field
|
|
1
|
+
{"version":3,"names":["_cmsFieldTypeMap","require","_cmsPermissions","transformCmsSchema","schema","options","userPermissions","externalDbConnections","collectionId","_id","transformedFields","fields","reduce","acc","field","_field$capabilities","_field$capabilities2","_field$typeMetadata","_field$typeMetadata2","key","fieldType","type","CmsFieldTypeToPatternsFieldType","baseField","id","displayName","isPrimary","displayField","isPii","encrypted","helpText","description","undefined","isSystem","systemField","startsWith","validation","numberRange","min","max","stringLengthRange","minLength","maxLength","required","capabilities","supportedQueryOperators","queryOperators","sortable","referencedCollectionId","typeMetadata","reference","multiReference","isReference","referenceMetadata","schemaPermissions","itemPermissions","computeCmsPermissions","idField"],"sources":["../../../src/adapter/transformCmsSchema.ts"],"sourcesContent":["import { collections } from '@wix/data';\nimport type { Field } from '@wix/patterns';\nimport type { Schema } from '@wix/patterns/schema';\nimport { CmsFieldTypeToPatternsFieldType } from './cmsFieldTypeMap';\nimport {\n computeCmsPermissions,\n type ExternalDbConnection,\n} from './cmsPermissions';\n\nexport interface TransformCmsSchemaOptions {\n /** Current user's ABAC permission strings. */\n userPermissions?: string[];\n /** External-DB connections (drive EXTERNAL-collection editability). */\n externalDbConnections?: ExternalDbConnection[];\n}\n\n/** Transforms a raw `@wix/data` `DataCollection` into the source-neutral `Schema`. */\nexport function transformCmsSchema(\n schema: collections.DataCollection,\n options: TransformCmsSchemaOptions = {},\n): Schema {\n const { userPermissions = [], externalDbConnections = [] } = options;\n const collectionId = schema._id as string;\n\n const transformedFields = (schema.fields || []).reduce<Record<string, Field>>(\n (acc, field) => {\n if (!field.key) {\n return acc;\n }\n\n const fieldType = field.type\n ? CmsFieldTypeToPatternsFieldType[field.type] || 'UNKNOWN'\n : 'UNKNOWN';\n\n const baseField = {\n id: field.key,\n displayName: field.displayName || '',\n isPrimary: field.key === schema.displayField,\n isPii: field.encrypted ?? false,\n helpText: field.description ?? undefined,\n // `@wix/data` does not flag the manual-sort field (`_manualSort_<id>`)\n // as `systemField`, but it is internal and must not surface as an\n // editable field — treat it as system, matching auto-patterns.\n isSystem:\n (field.systemField ?? false) || field.key.startsWith('_manualSort'),\n validation: {\n numberRange: field.numberRange\n ? {\n min: field.numberRange.min ?? undefined,\n max: field.numberRange.max ?? undefined,\n }\n : undefined,\n stringLengthRange: field.stringLengthRange\n ? {\n minLength: field.stringLengthRange.minLength ?? undefined,\n maxLength: field.stringLengthRange.maxLength ?? undefined,\n }\n : undefined,\n required: field.required ?? false,\n },\n capabilities: {\n supportedQueryOperators: field.capabilities?.queryOperators || [],\n sortable: field.capabilities?.sortable || false,\n },\n };\n\n const referencedCollectionId =\n field.typeMetadata?.reference?.referencedCollectionId ??\n field.typeMetadata?.multiReference?.referencedCollectionId;\n\n const isReference =\n fieldType === 'REFERENCE' || fieldType === 'MULTI_REFERENCE';\n\n if (isReference && referencedCollectionId) {\n acc[field.key] = {\n ...baseField,\n type: fieldType as 'REFERENCE' | 'MULTI_REFERENCE',\n referenceMetadata: { referencedCollectionId },\n };\n } else {\n acc[field.key] = {\n ...baseField,\n // A reference field without a target collection degrades to UNKNOWN.\n type: isReference ? 'UNKNOWN' : fieldType,\n };\n }\n\n return acc;\n },\n {},\n );\n\n const { schemaPermissions, itemPermissions } = computeCmsPermissions(\n schema,\n userPermissions,\n externalDbConnections,\n );\n\n return {\n id: collectionId,\n fields: transformedFields,\n displayField: schema.displayField ?? '_id',\n idField: '_id',\n schemaPermissions,\n itemPermissions,\n };\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -3,24 +3,42 @@
|
|
|
3
3
|
exports.__esModule = true;
|
|
4
4
|
exports.cmsSchemaSourceInput = cmsSchemaSourceInput;
|
|
5
5
|
exports.useCmsSchemaSource = useCmsSchemaSource;
|
|
6
|
-
var
|
|
7
|
-
var
|
|
6
|
+
var _patterns = require("@wix/patterns");
|
|
7
|
+
var _schema = require("@wix/patterns/schema");
|
|
8
8
|
var _loadCmsSchema = require("./loadCmsSchema");
|
|
9
|
+
const ESSENTIALS = 'Essentials';
|
|
10
|
+
const TIME_AND_LOCATION = 'Time and location';
|
|
11
|
+
|
|
9
12
|
// The field types the add/edit modal offers, in display order. These are the
|
|
10
|
-
// only types @wix/data can create (see PatternsFieldTypeToCmsFieldType).
|
|
13
|
+
// only types @wix/data can create (see PatternsFieldTypeToCmsFieldType). The
|
|
14
|
+
// subtitles and group labels are plain strings until this package gets its own
|
|
15
|
+
// translations.
|
|
11
16
|
const CMS_CREATABLE_TYPES = [{
|
|
12
|
-
patternsType: 'SHORT_TEXT'
|
|
17
|
+
patternsType: 'SHORT_TEXT',
|
|
18
|
+
label: 'Text',
|
|
19
|
+
subtitle: 'Titles, paragraph',
|
|
20
|
+
group: ESSENTIALS
|
|
13
21
|
}, {
|
|
14
|
-
patternsType: 'NUMBER'
|
|
22
|
+
patternsType: 'NUMBER',
|
|
23
|
+
label: 'Number',
|
|
24
|
+
subtitle: 'ID, rating, order number',
|
|
25
|
+
group: ESSENTIALS
|
|
15
26
|
}, {
|
|
16
|
-
patternsType: 'BOOLEAN'
|
|
27
|
+
patternsType: 'BOOLEAN',
|
|
28
|
+
label: 'Boolean',
|
|
29
|
+
subtitle: 'Yes or no, true or false',
|
|
30
|
+
group: ESSENTIALS
|
|
17
31
|
}, {
|
|
18
|
-
patternsType: 'DATE'
|
|
32
|
+
patternsType: 'DATE',
|
|
33
|
+
label: 'Date',
|
|
34
|
+
subtitle: 'Date of event, date added',
|
|
35
|
+
group: TIME_AND_LOCATION
|
|
19
36
|
}];
|
|
20
37
|
function cmsSchemaSourceInput(deps) {
|
|
21
38
|
const {
|
|
22
39
|
collectionId,
|
|
23
40
|
references: seedReferences,
|
|
41
|
+
fieldTypes,
|
|
24
42
|
...loaderDeps
|
|
25
43
|
} = deps;
|
|
26
44
|
const loader = (0, _loadCmsSchema.createCmsSchemaLoader)(loaderDeps);
|
|
@@ -41,7 +59,7 @@ function cmsSchemaSourceInput(deps) {
|
|
|
41
59
|
}
|
|
42
60
|
const referencedCollectionId = field.referenceMetadata.referencedCollectionId;
|
|
43
61
|
if (referencedCollectionId && !references[referencedCollectionId]) {
|
|
44
|
-
references[referencedCollectionId] = (0,
|
|
62
|
+
references[referencedCollectionId] = (0, _schema.defineSchemaSource)(cmsSchemaSourceInput({
|
|
45
63
|
collectionId: referencedCollectionId,
|
|
46
64
|
...loaderDeps
|
|
47
65
|
}));
|
|
@@ -53,7 +71,14 @@ function cmsSchemaSourceInput(deps) {
|
|
|
53
71
|
collectionId,
|
|
54
72
|
loadSchema,
|
|
55
73
|
creatableFieldTypes: CMS_CREATABLE_TYPES,
|
|
56
|
-
references
|
|
74
|
+
references,
|
|
75
|
+
fieldTypes,
|
|
76
|
+
// Plain strings until this package gets its own translations. CMS names it
|
|
77
|
+
// "field" (not "custom field") and shows no subtitle.
|
|
78
|
+
fieldModalText: {
|
|
79
|
+
addTitle: 'Add a field',
|
|
80
|
+
editTitle: 'Edit field'
|
|
81
|
+
}
|
|
57
82
|
};
|
|
58
83
|
}
|
|
59
84
|
|
|
@@ -63,8 +88,8 @@ function cmsSchemaSourceInput(deps) {
|
|
|
63
88
|
* collection hook.
|
|
64
89
|
*/
|
|
65
90
|
function useCmsSchemaSource(deps) {
|
|
66
|
-
const container = (0,
|
|
67
|
-
return (0,
|
|
91
|
+
const container = (0, _patterns.useWixPatternsContainer)();
|
|
92
|
+
return (0, _schema.useSchemaSource)(cmsSchemaSourceInput({
|
|
68
93
|
...deps,
|
|
69
94
|
httpClient: deps.httpClient ?? container.httpClient
|
|
70
95
|
}));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["
|
|
1
|
+
{"version":3,"names":["_patterns","require","_schema","_loadCmsSchema","ESSENTIALS","TIME_AND_LOCATION","CMS_CREATABLE_TYPES","patternsType","label","subtitle","group","cmsSchemaSourceInput","deps","collectionId","references","seedReferences","fieldTypes","loaderDeps","loader","createCmsSchemaLoader","loadSchema","loaded","Object","values","schema","fields","forEach","field","type","referencedCollectionId","referenceMetadata","defineSchemaSource","creatableFieldTypes","fieldModalText","addTitle","editTitle","useCmsSchemaSource","container","useWixPatternsContainer","useSchemaSource","httpClient"],"sources":["../../../src/adapter/useCmsSchemaSource.ts"],"sourcesContent":["import { useWixPatternsContainer } from '@wix/patterns';\nimport type { FieldTypeDefinition } from '@wix/patterns';\nimport { defineSchemaSource, useSchemaSource } from '@wix/patterns/schema';\nimport type {\n CreatableFieldType,\n SchemaSource,\n SchemaSourceInput,\n} from '@wix/patterns/schema';\nimport {\n createCmsSchemaLoader,\n type CreateCmsSchemaLoaderDeps,\n} from './loadCmsSchema';\n\nconst ESSENTIALS = 'Essentials';\nconst TIME_AND_LOCATION = 'Time and location';\n\n// The field types the add/edit modal offers, in display order. These are the\n// only types @wix/data can create (see PatternsFieldTypeToCmsFieldType). The\n// subtitles and group labels are plain strings until this package gets its own\n// translations.\nconst CMS_CREATABLE_TYPES: CreatableFieldType[] = [\n {\n patternsType: 'SHORT_TEXT',\n label: 'Text',\n subtitle: 'Titles, paragraph',\n group: ESSENTIALS,\n },\n {\n patternsType: 'NUMBER',\n label: 'Number',\n subtitle: 'ID, rating, order number',\n group: ESSENTIALS,\n },\n {\n patternsType: 'BOOLEAN',\n label: 'Boolean',\n subtitle: 'Yes or no, true or false',\n group: ESSENTIALS,\n },\n {\n patternsType: 'DATE',\n label: 'Date',\n subtitle: 'Date of event, date added',\n group: TIME_AND_LOCATION,\n },\n];\n\nexport interface UseCmsSchemaSourceDeps\n extends Omit<CreateCmsSchemaLoaderDeps, 'httpClient'> {\n collectionId: string;\n /** Default: the patterns container's client. */\n httpClient?: CreateCmsSchemaLoaderDeps['httpClient'];\n /** Seed sources for referenced collections, keyed by referenced collection\n * id. Usually unnecessary — reference fields are resolved automatically from\n * the loaded schema. Provide an entry only to override the auto-built one. */\n references?: Record<string, SchemaSource<any>>;\n /** Consumer-defined field types, resolved by fields with `type: 'CUSTOM'`. */\n fieldTypes?: FieldTypeDefinition[];\n}\n\nexport function cmsSchemaSourceInput<\n T extends Record<string, unknown> = Record<string, unknown>,\n>(\n deps: UseCmsSchemaSourceDeps & Pick<CreateCmsSchemaLoaderDeps, 'httpClient'>,\n): SchemaSourceInput<T> {\n const {\n collectionId,\n references: seedReferences,\n fieldTypes,\n ...loaderDeps\n } = deps;\n const loader = createCmsSchemaLoader<T>(loaderDeps);\n\n // Reference fields are wired automatically: when the schema loads, each\n // REFERENCE / MULTI_REFERENCE field's referencedCollectionId gets a child CMS\n // source (same loader deps) added to `references`, so entity-page reference\n // inputs can query the referenced collection with no manual wiring. The object\n // is shared with the resolved source; seeded entries win over auto-built ones.\n const references: Record<string, SchemaSource<any>> = { ...seedReferences };\n\n const loadSchema = async () => {\n const loaded = await loader(collectionId);\n Object.values(loaded.schema.fields).forEach((field) => {\n if (field?.type !== 'REFERENCE' && field?.type !== 'MULTI_REFERENCE') {\n return;\n }\n const referencedCollectionId =\n field.referenceMetadata.referencedCollectionId;\n if (referencedCollectionId && !references[referencedCollectionId]) {\n references[referencedCollectionId] = defineSchemaSource(\n cmsSchemaSourceInput({\n collectionId: referencedCollectionId,\n ...loaderDeps,\n }),\n );\n }\n });\n return loaded;\n };\n\n return {\n collectionId,\n loadSchema,\n creatableFieldTypes: CMS_CREATABLE_TYPES,\n references,\n fieldTypes,\n // Plain strings until this package gets its own translations. CMS names it\n // \"field\" (not \"custom field\") and shows no subtitle.\n fieldModalText: {\n addTitle: 'Add a field',\n editTitle: 'Edit field',\n },\n };\n}\n\n/**\n * A ready-to-use `SchemaSource` for a CMS collection: wraps the CMS schema\n * loader and supplies the CMS field types. Pass it to a `@wix/patterns/schema`\n * collection hook.\n */\nexport function useCmsSchemaSource<\n T extends Record<string, unknown> = Record<string, unknown>,\n>(deps: UseCmsSchemaSourceDeps): SchemaSource<T> {\n const container = useWixPatternsContainer();\n return useSchemaSource<T>(\n cmsSchemaSourceInput<T>({\n ...deps,\n httpClient: deps.httpClient ?? container.httpClient,\n }),\n );\n}\n"],"mappings":";;;;;AAAA,IAAAA,SAAA,GAAAC,OAAA;AAEA,IAAAC,OAAA,GAAAD,OAAA;AAMA,IAAAE,cAAA,GAAAF,OAAA;AAKA,MAAMG,UAAU,GAAG,YAAY;AAC/B,MAAMC,iBAAiB,GAAG,mBAAmB;;AAE7C;AACA;AACA;AACA;AACA,MAAMC,mBAAyC,GAAG,CAChD;EACEC,YAAY,EAAE,YAAY;EAC1BC,KAAK,EAAE,MAAM;EACbC,QAAQ,EAAE,mBAAmB;EAC7BC,KAAK,EAAEN;AACT,CAAC,EACD;EACEG,YAAY,EAAE,QAAQ;EACtBC,KAAK,EAAE,QAAQ;EACfC,QAAQ,EAAE,0BAA0B;EACpCC,KAAK,EAAEN;AACT,CAAC,EACD;EACEG,YAAY,EAAE,SAAS;EACvBC,KAAK,EAAE,SAAS;EAChBC,QAAQ,EAAE,0BAA0B;EACpCC,KAAK,EAAEN;AACT,CAAC,EACD;EACEG,YAAY,EAAE,MAAM;EACpBC,KAAK,EAAE,MAAM;EACbC,QAAQ,EAAE,2BAA2B;EACrCC,KAAK,EAAEL;AACT,CAAC,CACF;AAeM,SAASM,oBAAoBA,CAGlCC,IAA4E,EACtD;EACtB,MAAM;IACJC,YAAY;IACZC,UAAU,EAAEC,cAAc;IAC1BC,UAAU;IACV,GAAGC;EACL,CAAC,GAAGL,IAAI;EACR,MAAMM,MAAM,GAAG,IAAAC,oCAAqB,EAAIF,UAAU,CAAC;;EAEnD;EACA;EACA;EACA;EACA;EACA,MAAMH,UAA6C,GAAG;IAAE,GAAGC;EAAe,CAAC;EAE3E,MAAMK,UAAU,GAAG,MAAAA,CAAA,KAAY;IAC7B,MAAMC,MAAM,GAAG,MAAMH,MAAM,CAACL,YAAY,CAAC;IACzCS,MAAM,CAACC,MAAM,CAACF,MAAM,CAACG,MAAM,CAACC,MAAM,CAAC,CAACC,OAAO,CAAEC,KAAK,IAAK;MACrD,IAAI,CAAAA,KAAK,oBAALA,KAAK,CAAEC,IAAI,MAAK,WAAW,IAAI,CAAAD,KAAK,oBAALA,KAAK,CAAEC,IAAI,MAAK,iBAAiB,EAAE;QACpE;MACF;MACA,MAAMC,sBAAsB,GAC1BF,KAAK,CAACG,iBAAiB,CAACD,sBAAsB;MAChD,IAAIA,sBAAsB,IAAI,CAACf,UAAU,CAACe,sBAAsB,CAAC,EAAE;QACjEf,UAAU,CAACe,sBAAsB,CAAC,GAAG,IAAAE,0BAAkB,EACrDpB,oBAAoB,CAAC;UACnBE,YAAY,EAAEgB,sBAAsB;UACpC,GAAGZ;QACL,CAAC,CACH,CAAC;MACH;IACF,CAAC,CAAC;IACF,OAAOI,MAAM;EACf,CAAC;EAED,OAAO;IACLR,YAAY;IACZO,UAAU;IACVY,mBAAmB,EAAE1B,mBAAmB;IACxCQ,UAAU;IACVE,UAAU;IACV;IACA;IACAiB,cAAc,EAAE;MACdC,QAAQ,EAAE,aAAa;MACvBC,SAAS,EAAE;IACb;EACF,CAAC;AACH;;AAEA;AACA;AACA;AACA;AACA;AACO,SAASC,kBAAkBA,CAEhCxB,IAA4B,EAAmB;EAC/C,MAAMyB,SAAS,GAAG,IAAAC,iCAAuB,EAAC,CAAC;EAC3C,OAAO,IAAAC,uBAAe,EACpB5B,oBAAoB,CAAI;IACtB,GAAGC,IAAI;IACP4B,UAAU,EAAE5B,IAAI,CAAC4B,UAAU,IAAIH,SAAS,CAACG;EAC3C,CAAC,CACH,CAAC;AACH","ignoreList":[]}
|
|
@@ -6,7 +6,7 @@ exports.mockCmsItems = mockCmsItems;
|
|
|
6
6
|
var _fetchMock = require("@wix/sdk-testkit/fetch-mock");
|
|
7
7
|
var _meta = require("@wix/data/meta");
|
|
8
8
|
var _data = require("@wix/data");
|
|
9
|
-
var
|
|
9
|
+
var _schema = require("@wix/patterns/schema");
|
|
10
10
|
var _cmsFieldTypeMap = require("../adapter/cmsFieldTypeMap");
|
|
11
11
|
var itemsApi = _interopRequireWildcard(require("@wix/wix-data-items-sdk/build/cjs/src/data-items-api-client"));
|
|
12
12
|
function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
|
|
@@ -146,7 +146,7 @@ function toResolver(items) {
|
|
|
146
146
|
* `sourceFetchData(source)`, so an in-memory source drives paging per request.
|
|
147
147
|
*/
|
|
148
148
|
function mockCmsItems(fetchMock, options) {
|
|
149
|
-
const resolve = 'source' in options ? (0,
|
|
149
|
+
const resolve = 'source' in options ? (0, _schema.sourceFetchData)(options.source) : toResolver(options.items);
|
|
150
150
|
const [url] = (0, _fetchMock.when)(queryDataItemsMeta()).reply(null);
|
|
151
151
|
fetchMock.route(url, async opts => {
|
|
152
152
|
const {
|