@wix/bex-core 2.331.0 → 2.333.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 (171) hide show
  1. package/dist/cjs/assets/locale/messages_ar.json +11 -0
  2. package/dist/cjs/assets/locale/messages_bg.json +11 -0
  3. package/dist/cjs/assets/locale/messages_ca.json +11 -0
  4. package/dist/cjs/assets/locale/messages_cs.json +11 -0
  5. package/dist/cjs/assets/locale/messages_da.json +11 -0
  6. package/dist/cjs/assets/locale/messages_de.json +11 -0
  7. package/dist/cjs/assets/locale/messages_el.json +11 -0
  8. package/dist/cjs/assets/locale/messages_en.json +11 -0
  9. package/dist/cjs/assets/locale/messages_es.json +11 -0
  10. package/dist/cjs/assets/locale/messages_fi.json +11 -0
  11. package/dist/cjs/assets/locale/messages_fr.json +11 -0
  12. package/dist/cjs/assets/locale/messages_he.json +11 -0
  13. package/dist/cjs/assets/locale/messages_hi.json +11 -0
  14. package/dist/cjs/assets/locale/messages_hu.json +11 -0
  15. package/dist/cjs/assets/locale/messages_id.json +11 -0
  16. package/dist/cjs/assets/locale/messages_it.json +11 -0
  17. package/dist/cjs/assets/locale/messages_ja.json +11 -0
  18. package/dist/cjs/assets/locale/messages_ko.json +11 -0
  19. package/dist/cjs/assets/locale/messages_lt.json +11 -0
  20. package/dist/cjs/assets/locale/messages_ms.json +11 -0
  21. package/dist/cjs/assets/locale/messages_nl.json +11 -0
  22. package/dist/cjs/assets/locale/messages_no.json +11 -0
  23. package/dist/cjs/assets/locale/messages_pl.json +11 -0
  24. package/dist/cjs/assets/locale/messages_pt.json +11 -0
  25. package/dist/cjs/assets/locale/messages_ro.json +11 -0
  26. package/dist/cjs/assets/locale/messages_ru.json +11 -0
  27. package/dist/cjs/assets/locale/messages_sk.json +11 -0
  28. package/dist/cjs/assets/locale/messages_sl.json +11 -0
  29. package/dist/cjs/assets/locale/messages_sv.json +11 -0
  30. package/dist/cjs/assets/locale/messages_th.json +11 -0
  31. package/dist/cjs/assets/locale/messages_tl.json +11 -0
  32. package/dist/cjs/assets/locale/messages_tr.json +11 -0
  33. package/dist/cjs/assets/locale/messages_uk.json +11 -0
  34. package/dist/cjs/assets/locale/messages_vi.json +11 -0
  35. package/dist/cjs/assets/locale/messages_zh.json +11 -0
  36. package/dist/cjs/assets/locale/version_file +1 -1
  37. package/dist/cjs/assets/visual-e2e-locale/messages_visuale2e.json +29 -2
  38. package/dist/cjs/hooks/index.js +0 -6
  39. package/dist/cjs/hooks/index.js.map +1 -1
  40. package/dist/cjs/hooks/useImport.js +3 -13
  41. package/dist/cjs/hooks/useImport.js.map +1 -1
  42. package/dist/cjs/index.js +0 -7
  43. package/dist/cjs/index.js.map +1 -1
  44. package/dist/cjs/services/translations.js.map +1 -1
  45. package/dist/cjs/state/CustomFieldModalState.js +12 -0
  46. package/dist/cjs/state/CustomFieldModalState.js.map +1 -1
  47. package/dist/cjs/state/ImportState/ImportState.js +401 -133
  48. package/dist/cjs/state/ImportState/ImportState.js.map +1 -1
  49. package/dist/cjs/state/ImportState/__tests__/ImportState.engine.spec.js +671 -62
  50. package/dist/cjs/state/ImportState/__tests__/ImportState.engine.spec.js.map +1 -1
  51. package/dist/cjs/state/ImportState/detectFieldType.js +23 -0
  52. package/dist/cjs/state/ImportState/detectFieldType.js.map +1 -1
  53. package/dist/cjs/state/ImportState/fieldEdit.js +49 -0
  54. package/dist/cjs/state/ImportState/fieldEdit.js.map +1 -1
  55. package/dist/cjs/state/TagsState/TagsManagementState.js +17 -44
  56. package/dist/cjs/state/TagsState/TagsManagementState.js.map +1 -1
  57. package/dist/cjs/state/TagsState/TagsSearchState.js +0 -6
  58. package/dist/cjs/state/TagsState/TagsSearchState.js.map +1 -1
  59. package/dist/cjs/testkit/createInMemorySchemaSource.js +186 -0
  60. package/dist/cjs/testkit/createInMemorySchemaSource.js.map +1 -0
  61. package/dist/cjs/testkit/hubJobImportMocks.js +18 -2
  62. package/dist/cjs/testkit/hubJobImportMocks.js.map +1 -1
  63. package/dist/cjs/testkit/index.js +6 -0
  64. package/dist/cjs/testkit/index.js.map +1 -1
  65. package/dist/cjs/types/FieldsSource.js.map +1 -1
  66. package/dist/cjs/types/Schema.js.map +1 -1
  67. package/dist/cjs/types/SchemaSource.js +2 -1
  68. package/dist/cjs/types/SchemaSource.js.map +1 -1
  69. package/dist/esm/assets/locale/messages_ar.json +11 -0
  70. package/dist/esm/assets/locale/messages_bg.json +11 -0
  71. package/dist/esm/assets/locale/messages_ca.json +11 -0
  72. package/dist/esm/assets/locale/messages_cs.json +11 -0
  73. package/dist/esm/assets/locale/messages_da.json +11 -0
  74. package/dist/esm/assets/locale/messages_de.json +11 -0
  75. package/dist/esm/assets/locale/messages_el.json +11 -0
  76. package/dist/esm/assets/locale/messages_en.json +11 -0
  77. package/dist/esm/assets/locale/messages_es.json +11 -0
  78. package/dist/esm/assets/locale/messages_fi.json +11 -0
  79. package/dist/esm/assets/locale/messages_fr.json +11 -0
  80. package/dist/esm/assets/locale/messages_he.json +11 -0
  81. package/dist/esm/assets/locale/messages_hi.json +11 -0
  82. package/dist/esm/assets/locale/messages_hu.json +11 -0
  83. package/dist/esm/assets/locale/messages_id.json +11 -0
  84. package/dist/esm/assets/locale/messages_it.json +11 -0
  85. package/dist/esm/assets/locale/messages_ja.json +11 -0
  86. package/dist/esm/assets/locale/messages_ko.json +11 -0
  87. package/dist/esm/assets/locale/messages_lt.json +11 -0
  88. package/dist/esm/assets/locale/messages_ms.json +11 -0
  89. package/dist/esm/assets/locale/messages_nl.json +11 -0
  90. package/dist/esm/assets/locale/messages_no.json +11 -0
  91. package/dist/esm/assets/locale/messages_pl.json +11 -0
  92. package/dist/esm/assets/locale/messages_pt.json +11 -0
  93. package/dist/esm/assets/locale/messages_ro.json +11 -0
  94. package/dist/esm/assets/locale/messages_ru.json +11 -0
  95. package/dist/esm/assets/locale/messages_sk.json +11 -0
  96. package/dist/esm/assets/locale/messages_sl.json +11 -0
  97. package/dist/esm/assets/locale/messages_sv.json +11 -0
  98. package/dist/esm/assets/locale/messages_th.json +11 -0
  99. package/dist/esm/assets/locale/messages_tl.json +11 -0
  100. package/dist/esm/assets/locale/messages_tr.json +11 -0
  101. package/dist/esm/assets/locale/messages_uk.json +11 -0
  102. package/dist/esm/assets/locale/messages_vi.json +11 -0
  103. package/dist/esm/assets/locale/messages_zh.json +11 -0
  104. package/dist/esm/assets/locale/version_file +1 -1
  105. package/dist/esm/assets/visual-e2e-locale/messages_visuale2e.json +29 -2
  106. package/dist/esm/hooks/index.js +0 -1
  107. package/dist/esm/hooks/index.js.map +1 -1
  108. package/dist/esm/hooks/useImport.js +2 -7
  109. package/dist/esm/hooks/useImport.js.map +1 -1
  110. package/dist/esm/index.js +0 -1
  111. package/dist/esm/index.js.map +1 -1
  112. package/dist/esm/state/CustomFieldModalState.js +8 -0
  113. package/dist/esm/state/CustomFieldModalState.js.map +1 -1
  114. package/dist/esm/state/ImportState/ImportState.js +299 -108
  115. package/dist/esm/state/ImportState/ImportState.js.map +1 -1
  116. package/dist/esm/state/ImportState/__tests__/ImportState.engine.spec.js +442 -55
  117. package/dist/esm/state/ImportState/__tests__/ImportState.engine.spec.js.map +1 -1
  118. package/dist/esm/state/ImportState/detectFieldType.js +19 -0
  119. package/dist/esm/state/ImportState/detectFieldType.js.map +1 -1
  120. package/dist/esm/state/ImportState/fieldEdit.js +44 -0
  121. package/dist/esm/state/ImportState/fieldEdit.js.map +1 -1
  122. package/dist/esm/state/TagsState/TagsManagementState.js +17 -33
  123. package/dist/esm/state/TagsState/TagsManagementState.js.map +1 -1
  124. package/dist/esm/state/TagsState/TagsSearchState.js +0 -6
  125. package/dist/esm/state/TagsState/TagsSearchState.js.map +1 -1
  126. package/dist/esm/testkit/createInMemorySchemaSource.js +140 -0
  127. package/dist/esm/testkit/createInMemorySchemaSource.js.map +1 -0
  128. package/dist/esm/testkit/hubJobImportMocks.js +17 -1
  129. package/dist/esm/testkit/hubJobImportMocks.js.map +1 -1
  130. package/dist/esm/testkit/index.js +1 -0
  131. package/dist/esm/testkit/index.js.map +1 -1
  132. package/dist/esm/types/SchemaSource.js.map +1 -1
  133. package/dist/types/hooks/index.d.ts +0 -1
  134. package/dist/types/hooks/index.d.ts.map +1 -1
  135. package/dist/types/hooks/useImport.d.ts +3 -18
  136. package/dist/types/hooks/useImport.d.ts.map +1 -1
  137. package/dist/types/index.d.ts +0 -1
  138. package/dist/types/index.d.ts.map +1 -1
  139. package/dist/types/services/translations.d.ts +20 -1
  140. package/dist/types/services/translations.d.ts.map +1 -1
  141. package/dist/types/state/CustomFieldModalState.d.ts +9 -0
  142. package/dist/types/state/CustomFieldModalState.d.ts.map +1 -1
  143. package/dist/types/state/ImportState/ImportState.d.ts +201 -62
  144. package/dist/types/state/ImportState/ImportState.d.ts.map +1 -1
  145. package/dist/types/state/ImportState/detectFieldType.d.ts +2 -0
  146. package/dist/types/state/ImportState/detectFieldType.d.ts.map +1 -1
  147. package/dist/types/state/ImportState/fieldEdit.d.ts +6 -0
  148. package/dist/types/state/ImportState/fieldEdit.d.ts.map +1 -1
  149. package/dist/types/state/TagsState/TagsManagementState.d.ts.map +1 -1
  150. package/dist/types/state/TagsState/TagsSearchState.d.ts.map +1 -1
  151. package/dist/types/testkit/WixPatternsContainer.driver.d.ts +4 -0
  152. package/dist/types/testkit/WixPatternsContainer.driver.d.ts.map +1 -1
  153. package/dist/types/testkit/createInMemorySchemaSource.d.ts +41 -0
  154. package/dist/types/testkit/createInMemorySchemaSource.d.ts.map +1 -0
  155. package/dist/types/testkit/hubJobImportMocks.d.ts +11 -1
  156. package/dist/types/testkit/hubJobImportMocks.d.ts.map +1 -1
  157. package/dist/types/testkit/index.d.ts +1 -0
  158. package/dist/types/testkit/index.d.ts.map +1 -1
  159. package/dist/types/types/FieldsSource.d.ts +5 -1
  160. package/dist/types/types/FieldsSource.d.ts.map +1 -1
  161. package/dist/types/types/Schema.d.ts +6 -0
  162. package/dist/types/types/Schema.d.ts.map +1 -1
  163. package/dist/types/types/SchemaSource.d.ts +6 -4
  164. package/dist/types/types/SchemaSource.d.ts.map +1 -1
  165. package/package.json +4 -4
  166. package/dist/cjs/hooks/useImportConfig.js +0 -10
  167. package/dist/cjs/hooks/useImportConfig.js.map +0 -1
  168. package/dist/esm/hooks/useImportConfig.js +0 -6
  169. package/dist/esm/hooks/useImportConfig.js.map +0 -1
  170. package/dist/types/hooks/useImportConfig.d.ts +0 -21
  171. package/dist/types/hooks/useImportConfig.d.ts.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"names":["_mobx","require","_types","_uuid","_events","_CollectionState","_CollectionOptimisticActions","_TaskState","_util","_services","_createTagErrors","_tagsService","TAG_MAX_LENGTH","exports","MAX_TAGS","TAGS_PAGE_SIZE","LEGACY_MAX_TAGS","TagsManagementState","constructor","params","_params$container$int","_defineProperty2","default","TaskState","EventEmitter","container","fqdn","tagsService","TagsService","shouldAllowTagsPagination","internalExperiments","enabled","collection","CollectionState","limit","events","onError","error","_this$container$error","_this$container$error2","_resolvedListTagsError","errorHandler","getResolvedError","call","err","paginationMode","undefined","queryName","fqdnString","join","fetchData","cursor","search","result","queryTags","exposure","TagExposure","PRIVATE","query","cursorPaging","filter","name","$startsWith","serverErrorOverride","message","translate","action","text","onClick","retry","items","hasNext","fetchedItems","listTags","total","length","itemKey","id","itemName","filters","showToast","toastConfig","_params$container","overrideShowToast","emit","remove","optimisticActions","CollectionOptimisticActions","orderBy","sort","fieldName","createdDate","Date","valueOf","order","makeObservable","init","createTag","updateTag","deleteTag","_isFqdnValid","disposers","initTask","runOnce","status","promise","forEach","disposer","hasMore","fetchedLastPage","loadMore","fetchNextPageIfNeeded","isError","isLoading","isIdle","isSuccessful","isSuccess","fqdnToString","getTagById","tagId","_this$collection$resu","_keyedItemsMap","get","item","getTagNameById","_this$getTagById","resource","_optimisticActionBaseParams","optimisticActionParams","tagsBIReporter","actionName","origin","tagName","filteredListSize","isFromSearch","errorCode","onTryAgain","onUndo","otherOptimisticActionParams","internalMonitor","reportError","WixPatternsError","originalException","category","tagsLimit","hasReachedTagsLimit","showTagsLimitErrorToast","visualType","excessCount","Math","max","getTagsReachedLimitErrorMessage","biName","type","tagSubOrigin","uuid","onSuccess","onAction","newTag","createOne","submit","serverCreatedTag","tag","createTagErrors","retryFn","refreshAllPages","tagToUpdate","previousName","updateOne","revision","toString","updatedTag","tagToDelete","deleteOne"],"sources":["../../../../src/state/TagsState/TagsManagementState.ts"],"sourcesContent":["import { action, makeObservable } from 'mobx';\nimport {\n Tag,\n TagExposure,\n} from '@wix/bex-utils/@wix/ambassador-os-tags-v1-tag/types';\nimport { TagsBIReporter } from './TagsBIReporter';\nimport { v4 as uuid } from 'uuid';\nimport { EventEmitter } from 'events';\nimport { WixPatternsContainer } from '../WixPatternsContainer';\nimport { Fqdn, ToastConfig } from '../../model';\nimport { CollectionState } from '../CollectionState';\nimport { CollectionOptimisticActions } from '../CollectionOptimisticActions';\nimport { TaskState } from '../TaskState';\nimport { fqdnToString, TagErrorVisualType, TypedEmitter } from '../../util';\nimport { WixPatternsError, WixPatternsErrorCode } from '../../services';\nimport {\n CreateManyParams,\n DeleteManyParams,\n OptimisticActionBasis,\n UpdateManyParams,\n} from '../OptimisticActions';\nimport {\n createTagErrors,\n getTagsReachedLimitErrorMessage,\n} from '../../services/tagsService/createTagErrors';\nimport { TagsService } from '../../services/tagsService';\nimport type { errorHandler } from '@wix/essentials';\n\nexport const TAG_MAX_LENGTH = 30;\nconst MAX_TAGS = 1000;\nconst TAGS_PAGE_SIZE = 100;\n\n// Pre-cursor tag creation ceiling (restored from before pagination, unrelated to page size)\nconst LEGACY_MAX_TAGS = 100;\n\nexport interface TagsManagementStateParams {\n readonly container: WixPatternsContainer;\n readonly fqdn: Fqdn;\n}\n\nexport class TagsManagementState {\n readonly collection: CollectionState<Tag>;\n readonly optimisticActions: CollectionOptimisticActions<Tag, {}>;\n readonly container;\n readonly fqdn;\n readonly initTask = new TaskState();\n readonly tagsService;\n readonly events = new EventEmitter() as TypedEmitter<{\n showToast: (toastConfig: ToastConfig) => unknown;\n hideToast: (toastConfig: ToastConfig) => unknown;\n }>;\n overrideShowToast = false;\n _resolvedListTagsError?: errorHandler.ResolvedError;\n readonly shouldAllowTagsPagination: boolean;\n\n constructor(params: TagsManagementStateParams) {\n this.container = params.container;\n this.fqdn = params.fqdn;\n this.tagsService = new TagsService({\n container: this.container,\n });\n this.shouldAllowTagsPagination =\n !!params.container.internalExperiments?.enabled(\n 'specs.cairo.TagsPagination',\n );\n\n this.collection = new CollectionState<Tag>({\n ...params.container,\n limit: TAGS_PAGE_SIZE,\n events: {\n onError: (error) => {\n this._resolvedListTagsError =\n this.container.errorHandler.getResolvedError?.(error.err);\n },\n },\n paginationMode: this.shouldAllowTagsPagination ? 'cursor' : undefined,\n queryName: [this.fqdnString, 'tags'].join('/'),\n fetchData: async ({ cursor, limit, search }) => {\n if (this.shouldAllowTagsPagination) {\n const result = await this.tagsService.queryTags(\n {\n fqdn: this.fqdnString,\n exposure: TagExposure.PRIVATE,\n query: {\n cursorPaging: { limit, cursor: cursor ?? undefined },\n ...(search\n ? { filter: { name: { $startsWith: search } } }\n : {}),\n },\n },\n {},\n {\n serverErrorOverride: () => ({\n message: this.container.translate(\n 'cairo.tags.collectionPage.popover.loadTags.error.body',\n ),\n action: {\n text: this.container.translate(\n 'cairo.tags.loadTags.error.CTA',\n ),\n onClick: () => this.retry(),\n },\n }),\n },\n );\n return {\n items: result.items,\n cursor: result.cursor,\n hasNext: result.hasNext,\n };\n }\n\n const fetchedItems = await this.tagsService.listTags(\n {\n fqdn: this.fqdnString,\n exposure: TagExposure.PRIVATE,\n },\n {},\n {\n serverErrorOverride: () => ({\n message: this.container.translate(\n 'cairo.tags.collectionPage.popover.loadTags.error.body',\n ),\n action: {\n text: this.container.translate('cairo.tags.loadTags.error.CTA'),\n onClick: () => this.retry(),\n },\n }),\n },\n );\n return { items: fetchedItems, total: fetchedItems.length };\n },\n itemKey: ({ id }) => id!,\n itemName: ({ name }) => name!,\n filters: {},\n showToast: (toastConfig: ToastConfig) => {\n if (this.overrideShowToast) {\n this.events.emit('showToast', toastConfig);\n return {\n remove: () => {\n this.events.emit('hideToast', toastConfig);\n },\n };\n }\n if (params?.container?.showToast) {\n return params.container.showToast(toastConfig);\n }\n return { remove: () => {} };\n },\n });\n\n this.optimisticActions = new CollectionOptimisticActions<Tag, {}>({\n container: this.container,\n collection: this.collection,\n orderBy: ({ sort }) => [\n ...(sort || []),\n {\n fieldName: ({ createdDate }) => (createdDate ?? new Date()).valueOf(),\n order: 'asc',\n },\n ],\n });\n\n makeObservable(this, {\n init: action,\n createTag: action,\n updateTag: action,\n deleteTag: action,\n retry: action,\n });\n }\n\n init() {\n if (!this._isFqdnValid()) {\n return;\n }\n\n const { collection, optimisticActions } = this;\n\n const disposers = [collection.init(), optimisticActions.init()];\n\n this.initTask.runOnce(async () => {\n collection.initTask.runOnce();\n\n await collection.initTask.status.promise;\n });\n\n return () => {\n disposers.forEach((disposer) => disposer());\n };\n }\n\n retry() {\n this.collection.initTask.runOnce();\n }\n\n get items() {\n return this.collection.result.items ?? [];\n }\n\n get hasMore() {\n return !this.collection.fetchedLastPage;\n }\n\n async loadMore() {\n await this.collection.fetchNextPageIfNeeded();\n }\n\n get isError() {\n return this.initTask.status.isError;\n }\n\n get error() {\n return this._resolvedListTagsError;\n }\n\n get isLoading() {\n const { status } = this.collection.initTask;\n return status.isIdle || status.isLoading;\n }\n\n get isSuccessful() {\n const { status } = this.collection.initTask;\n return status.isSuccess;\n }\n\n get fqdnString() {\n return fqdnToString(this.fqdn);\n }\n\n getTagById(tagId: string) {\n return this.collection.result._keyedItemsMap?.get(tagId)?.item;\n }\n\n getTagNameById(tagId: string) {\n return this.getTagById(tagId)?.name;\n }\n\n private _isFqdnValid() {\n return this.fqdn.resource !== undefined;\n }\n\n private _optimisticActionBaseParams<T extends OptimisticActionBasis>(\n optimisticActionParams: T,\n {\n tagsBIReporter,\n actionName,\n origin,\n tagName,\n filteredListSize,\n isFromSearch = false,\n errorCode,\n }: {\n tagsBIReporter: TagsBIReporter;\n actionName: string;\n origin: string;\n tagName: string;\n filteredListSize: number;\n isFromSearch?: boolean;\n errorCode: WixPatternsErrorCode;\n },\n ) {\n const { onError, onTryAgain, onUndo, ...otherOptimisticActionParams } =\n optimisticActionParams;\n\n return {\n onError: (error: unknown) => {\n tagsBIReporter.onError(\n {\n tagName,\n actionName,\n origin,\n },\n error,\n );\n this.container.internalMonitor.reportError({\n error: new WixPatternsError({\n errorCode,\n originalException: error,\n }),\n category: 'Tags',\n });\n\n onError?.(error);\n },\n onTryAgain: () => {\n tagsBIReporter.onTryAgain({\n actionName,\n isFromSearch,\n filteredListSize,\n });\n onTryAgain?.();\n },\n onUndo: () => {\n tagsBIReporter.onUndo({ actionName });\n onUndo?.();\n },\n ...otherOptimisticActionParams,\n };\n }\n\n private get tagsLimit() {\n return this.shouldAllowTagsPagination ? MAX_TAGS : LEGACY_MAX_TAGS;\n }\n\n private hasReachedTagsLimit() {\n return !this.hasMore && this.items.length >= this.tagsLimit;\n }\n\n private showTagsLimitErrorToast(visualType: TagErrorVisualType) {\n const excessCount = Math.max(1, this.items.length - this.tagsLimit + 1);\n this.collection.showToast({\n message: getTagsReachedLimitErrorMessage({\n visualType,\n translate: this.container.translate,\n excessCount,\n limit: this.tagsLimit,\n }),\n biName: 'cairo-max-tags-error',\n type: 'ERROR',\n });\n }\n\n async createTag(params: {\n name: string;\n origin: string;\n tagSubOrigin?: string;\n filteredListSize: number;\n id?: string;\n isFromSearch?: boolean;\n onSuccess?: (tag: Tag) => void | Promise<void>;\n optimisticActionParams?: Partial<CreateManyParams<Tag>>;\n tagsBIReporter: TagsBIReporter;\n visualType?: TagErrorVisualType;\n }) {\n const {\n name,\n origin,\n tagSubOrigin,\n filteredListSize,\n id = uuid(),\n isFromSearch = false,\n onSuccess,\n optimisticActionParams = {},\n tagsBIReporter,\n visualType = 'toast',\n } = params;\n\n const actionName = 'Add tag';\n\n tagsBIReporter.onAction({\n tagName: name,\n isFromSearch,\n actionName,\n origin,\n tagSubOrigin,\n });\n\n if (this.hasReachedTagsLimit()) {\n return this.showTagsLimitErrorToast(visualType);\n }\n\n const newTag = {\n id,\n name,\n fqdn: this.fqdnString,\n exposure: TagExposure.PRIVATE,\n createdDate: new Date(),\n };\n\n this.optimisticActions.createOne(newTag, {\n submit: async () => {\n const serverCreatedTag = await this.tagsService.createTag(\n {\n tag: newTag,\n },\n createTagErrors({\n translate: this.container.translate,\n visualType,\n retryFn: () => this.createTag(params),\n excessCount: Math.max(1, this.items.length - this.tagsLimit + 1),\n limit: this.tagsLimit,\n }),\n );\n\n await onSuccess?.(serverCreatedTag);\n\n if (this.shouldAllowTagsPagination) {\n // intentional fire-and-forget: optimistic state is already applied\n void this.collection.refreshAllPages();\n }\n\n return [serverCreatedTag];\n },\n ...this._optimisticActionBaseParams(optimisticActionParams, {\n tagsBIReporter,\n actionName,\n origin,\n filteredListSize,\n tagName: name,\n isFromSearch,\n errorCode: 'CreateTagFailed',\n }),\n });\n }\n\n async updateTag({\n tagToUpdate,\n previousName,\n origin,\n tagSubOrigin,\n filteredListSize,\n isFromSearch = false,\n optimisticActionParams = {},\n tagsBIReporter,\n }: {\n tagToUpdate: Tag;\n previousName: string;\n origin: string;\n tagSubOrigin?: string;\n filteredListSize: number;\n isFromSearch?: boolean;\n optimisticActionParams?: Partial<UpdateManyParams<Tag, {}>>;\n tagsBIReporter: TagsBIReporter;\n }) {\n const actionName = 'Rename tag';\n\n tagsBIReporter.onAction({\n actionName,\n previousName,\n tagName: tagToUpdate.name!,\n isFromSearch,\n origin,\n tagSubOrigin,\n });\n\n this.optimisticActions.updateOne(\n { ...tagToUpdate, revision: (+tagToUpdate.revision! + 1).toString() },\n {\n submit: async () => {\n const updatedTag = await this.tagsService.updateTag({\n tag: tagToUpdate,\n });\n if (this.shouldAllowTagsPagination) {\n // intentional fire-and-forget: optimistic state is already applied\n void this.collection.refreshAllPages();\n }\n return updatedTag;\n },\n ...this._optimisticActionBaseParams(optimisticActionParams, {\n tagsBIReporter,\n actionName,\n origin,\n filteredListSize,\n tagName: previousName,\n isFromSearch,\n errorCode: 'UpdateTagFailed',\n }),\n },\n );\n }\n\n async deleteTag({\n tagToDelete,\n origin,\n tagSubOrigin,\n filteredListSize,\n isFromSearch = true,\n optimisticActionParams = {},\n tagsBIReporter,\n }: {\n tagToDelete: Tag;\n origin: string;\n tagSubOrigin?: string;\n filteredListSize: number;\n isFromSearch?: boolean;\n optimisticActionParams?: Partial<DeleteManyParams<Tag, {}>>;\n tagsBIReporter: TagsBIReporter;\n }) {\n const tagName = tagToDelete.name!;\n const actionName = 'Delete tag';\n\n tagsBIReporter.onAction({\n actionName,\n tagName,\n isFromSearch,\n origin,\n tagSubOrigin,\n });\n\n await this.optimisticActions.deleteOne(tagToDelete, {\n submit: async () => {\n const result = await this.tagsService.deleteTag({\n tagId: tagToDelete.id!,\n });\n if (this.shouldAllowTagsPagination) {\n // intentional fire-and-forget: optimistic state is already applied\n void this.collection.refreshAllPages();\n }\n return result;\n },\n ...this._optimisticActionBaseParams(optimisticActionParams, {\n tagsBIReporter,\n actionName,\n origin,\n tagName,\n filteredListSize,\n isFromSearch,\n errorCode: 'RemoveTagFailed',\n }),\n });\n }\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["_mobx","require","_types","_uuid","_events","_CollectionState","_CollectionOptimisticActions","_TaskState","_util","_services","_createTagErrors","_tagsService","TAG_MAX_LENGTH","exports","MAX_TAGS","LEGACY_MAX_TAGS","TagsManagementState","constructor","params","_params$container$int","_defineProperty2","default","TaskState","EventEmitter","container","fqdn","tagsService","TagsService","shouldAllowTagsPagination","internalExperiments","enabled","collection","CollectionState","limit","events","onError","error","_this$container$error","_this$container$error2","_resolvedListTagsError","errorHandler","getResolvedError","call","err","queryName","fqdnString","join","fetchData","fetchedItems","listTags","exposure","TagExposure","PRIVATE","serverErrorOverride","message","translate","action","text","onClick","retry","items","total","length","itemKey","id","itemName","name","filters","showToast","toastConfig","_params$container","overrideShowToast","emit","remove","optimisticActions","CollectionOptimisticActions","orderBy","sort","fieldName","createdDate","Date","valueOf","order","makeObservable","init","createTag","updateTag","deleteTag","_isFqdnValid","disposers","initTask","runOnce","status","promise","forEach","disposer","result","hasMore","fetchedLastPage","loadMore","fetchNextPageIfNeeded","isError","isLoading","isIdle","isSuccessful","isSuccess","fqdnToString","getTagById","tagId","_this$collection$resu","_keyedItemsMap","get","item","getTagNameById","_this$getTagById","resource","undefined","_optimisticActionBaseParams","optimisticActionParams","tagsBIReporter","actionName","origin","tagName","filteredListSize","isFromSearch","errorCode","onTryAgain","onUndo","otherOptimisticActionParams","internalMonitor","reportError","WixPatternsError","originalException","category","tagsLimit","hasReachedTagsLimit","showTagsLimitErrorToast","visualType","excessCount","Math","max","getTagsReachedLimitErrorMessage","biName","type","tagSubOrigin","uuid","onSuccess","onAction","newTag","createOne","submit","serverCreatedTag","tag","createTagErrors","retryFn","refreshAllPages","tagToUpdate","previousName","updateOne","revision","toString","updatedTag","tagToDelete","deleteOne"],"sources":["../../../../src/state/TagsState/TagsManagementState.ts"],"sourcesContent":["import { action, makeObservable } from 'mobx';\nimport {\n Tag,\n TagExposure,\n} from '@wix/bex-utils/@wix/ambassador-os-tags-v1-tag/types';\nimport { TagsBIReporter } from './TagsBIReporter';\nimport { v4 as uuid } from 'uuid';\nimport { EventEmitter } from 'events';\nimport { WixPatternsContainer } from '../WixPatternsContainer';\nimport { Fqdn, ToastConfig } from '../../model';\nimport { CollectionState } from '../CollectionState';\nimport { CollectionOptimisticActions } from '../CollectionOptimisticActions';\nimport { TaskState } from '../TaskState';\nimport { fqdnToString, TagErrorVisualType, TypedEmitter } from '../../util';\nimport { WixPatternsError, WixPatternsErrorCode } from '../../services';\nimport {\n CreateManyParams,\n DeleteManyParams,\n OptimisticActionBasis,\n UpdateManyParams,\n} from '../OptimisticActions';\nimport {\n createTagErrors,\n getTagsReachedLimitErrorMessage,\n} from '../../services/tagsService/createTagErrors';\nimport { TagsService } from '../../services/tagsService';\nimport type { errorHandler } from '@wix/essentials';\n\nexport const TAG_MAX_LENGTH = 30;\nconst MAX_TAGS = 1000;\n\n// Tag creation ceiling before the TagsPagination experiment raised it\nconst LEGACY_MAX_TAGS = 100;\n\nexport interface TagsManagementStateParams {\n readonly container: WixPatternsContainer;\n readonly fqdn: Fqdn;\n}\n\nexport class TagsManagementState {\n readonly collection: CollectionState<Tag>;\n readonly optimisticActions: CollectionOptimisticActions<Tag, {}>;\n readonly container;\n readonly fqdn;\n readonly initTask = new TaskState();\n readonly tagsService;\n readonly events = new EventEmitter() as TypedEmitter<{\n showToast: (toastConfig: ToastConfig) => unknown;\n hideToast: (toastConfig: ToastConfig) => unknown;\n }>;\n overrideShowToast = false;\n _resolvedListTagsError?: errorHandler.ResolvedError;\n readonly shouldAllowTagsPagination: boolean;\n\n constructor(params: TagsManagementStateParams) {\n this.container = params.container;\n this.fqdn = params.fqdn;\n this.tagsService = new TagsService({\n container: this.container,\n });\n this.shouldAllowTagsPagination =\n !!params.container.internalExperiments?.enabled(\n 'specs.cairo.TagsPagination',\n );\n\n this.collection = new CollectionState<Tag>({\n ...params.container,\n // limit must cover the whole list — fetchData returns all tags in one page,\n // and a smaller limit would make fetchedLastPage (hasMore) miscompute\n limit: MAX_TAGS,\n events: {\n onError: (error) => {\n this._resolvedListTagsError =\n this.container.errorHandler.getResolvedError?.(error.err);\n },\n },\n queryName: [this.fqdnString, 'tags'].join('/'),\n fetchData: async () => {\n const fetchedItems = await this.tagsService.listTags(\n {\n fqdn: this.fqdnString,\n exposure: TagExposure.PRIVATE,\n },\n {},\n {\n serverErrorOverride: () => ({\n message: this.container.translate(\n 'cairo.tags.collectionPage.popover.loadTags.error.body',\n ),\n action: {\n text: this.container.translate('cairo.tags.loadTags.error.CTA'),\n onClick: () => this.retry(),\n },\n }),\n },\n );\n return { items: fetchedItems, total: fetchedItems.length };\n },\n itemKey: ({ id }) => id!,\n itemName: ({ name }) => name!,\n filters: {},\n showToast: (toastConfig: ToastConfig) => {\n if (this.overrideShowToast) {\n this.events.emit('showToast', toastConfig);\n return {\n remove: () => {\n this.events.emit('hideToast', toastConfig);\n },\n };\n }\n if (params?.container?.showToast) {\n return params.container.showToast(toastConfig);\n }\n return { remove: () => {} };\n },\n });\n\n this.optimisticActions = new CollectionOptimisticActions<Tag, {}>({\n container: this.container,\n collection: this.collection,\n orderBy: ({ sort }) => [\n ...(sort || []),\n {\n fieldName: ({ createdDate }) => (createdDate ?? new Date()).valueOf(),\n order: 'asc',\n },\n ],\n });\n\n makeObservable(this, {\n init: action,\n createTag: action,\n updateTag: action,\n deleteTag: action,\n retry: action,\n });\n }\n\n init() {\n if (!this._isFqdnValid()) {\n return;\n }\n\n const { collection, optimisticActions } = this;\n\n const disposers = [collection.init(), optimisticActions.init()];\n\n this.initTask.runOnce(async () => {\n collection.initTask.runOnce();\n\n await collection.initTask.status.promise;\n });\n\n return () => {\n disposers.forEach((disposer) => disposer());\n };\n }\n\n retry() {\n this.collection.initTask.runOnce();\n }\n\n get items() {\n return this.collection.result.items ?? [];\n }\n\n get hasMore() {\n return !this.collection.fetchedLastPage;\n }\n\n async loadMore() {\n await this.collection.fetchNextPageIfNeeded();\n }\n\n get isError() {\n return this.initTask.status.isError;\n }\n\n get error() {\n return this._resolvedListTagsError;\n }\n\n get isLoading() {\n const { status } = this.collection.initTask;\n return status.isIdle || status.isLoading;\n }\n\n get isSuccessful() {\n const { status } = this.collection.initTask;\n return status.isSuccess;\n }\n\n get fqdnString() {\n return fqdnToString(this.fqdn);\n }\n\n getTagById(tagId: string) {\n return this.collection.result._keyedItemsMap?.get(tagId)?.item;\n }\n\n getTagNameById(tagId: string) {\n return this.getTagById(tagId)?.name;\n }\n\n private _isFqdnValid() {\n return this.fqdn.resource !== undefined;\n }\n\n private _optimisticActionBaseParams<T extends OptimisticActionBasis>(\n optimisticActionParams: T,\n {\n tagsBIReporter,\n actionName,\n origin,\n tagName,\n filteredListSize,\n isFromSearch = false,\n errorCode,\n }: {\n tagsBIReporter: TagsBIReporter;\n actionName: string;\n origin: string;\n tagName: string;\n filteredListSize: number;\n isFromSearch?: boolean;\n errorCode: WixPatternsErrorCode;\n },\n ) {\n const { onError, onTryAgain, onUndo, ...otherOptimisticActionParams } =\n optimisticActionParams;\n\n return {\n onError: (error: unknown) => {\n tagsBIReporter.onError(\n {\n tagName,\n actionName,\n origin,\n },\n error,\n );\n this.container.internalMonitor.reportError({\n error: new WixPatternsError({\n errorCode,\n originalException: error,\n }),\n category: 'Tags',\n });\n\n onError?.(error);\n },\n onTryAgain: () => {\n tagsBIReporter.onTryAgain({\n actionName,\n isFromSearch,\n filteredListSize,\n });\n onTryAgain?.();\n },\n onUndo: () => {\n tagsBIReporter.onUndo({ actionName });\n onUndo?.();\n },\n ...otherOptimisticActionParams,\n };\n }\n\n private get tagsLimit() {\n return this.shouldAllowTagsPagination ? MAX_TAGS : LEGACY_MAX_TAGS;\n }\n\n private hasReachedTagsLimit() {\n return !this.hasMore && this.items.length >= this.tagsLimit;\n }\n\n private showTagsLimitErrorToast(visualType: TagErrorVisualType) {\n const excessCount = Math.max(1, this.items.length - this.tagsLimit + 1);\n this.collection.showToast({\n message: getTagsReachedLimitErrorMessage({\n visualType,\n translate: this.container.translate,\n excessCount,\n limit: this.tagsLimit,\n }),\n biName: 'cairo-max-tags-error',\n type: 'ERROR',\n });\n }\n\n async createTag(params: {\n name: string;\n origin: string;\n tagSubOrigin?: string;\n filteredListSize: number;\n id?: string;\n isFromSearch?: boolean;\n onSuccess?: (tag: Tag) => void | Promise<void>;\n optimisticActionParams?: Partial<CreateManyParams<Tag>>;\n tagsBIReporter: TagsBIReporter;\n visualType?: TagErrorVisualType;\n }) {\n const {\n name,\n origin,\n tagSubOrigin,\n filteredListSize,\n id = uuid(),\n isFromSearch = false,\n onSuccess,\n optimisticActionParams = {},\n tagsBIReporter,\n visualType = 'toast',\n } = params;\n\n const actionName = 'Add tag';\n\n tagsBIReporter.onAction({\n tagName: name,\n isFromSearch,\n actionName,\n origin,\n tagSubOrigin,\n });\n\n if (this.hasReachedTagsLimit()) {\n return this.showTagsLimitErrorToast(visualType);\n }\n\n const newTag = {\n id,\n name,\n fqdn: this.fqdnString,\n exposure: TagExposure.PRIVATE,\n createdDate: new Date(),\n };\n\n this.optimisticActions.createOne(newTag, {\n submit: async () => {\n const serverCreatedTag = await this.tagsService.createTag(\n {\n tag: newTag,\n },\n createTagErrors({\n translate: this.container.translate,\n visualType,\n retryFn: () => this.createTag(params),\n excessCount: Math.max(1, this.items.length - this.tagsLimit + 1),\n limit: this.tagsLimit,\n }),\n );\n\n await onSuccess?.(serverCreatedTag);\n\n if (this.shouldAllowTagsPagination) {\n // Re-sync with the server: picks up concurrent edits and lets the\n // optimistic patch clear on the refreshed result (otherwise it\n // lingers until unmount). Fire-and-forget — the UI already shows\n // the change via the optimistic patch.\n void this.collection.refreshAllPages();\n }\n\n return [serverCreatedTag];\n },\n ...this._optimisticActionBaseParams(optimisticActionParams, {\n tagsBIReporter,\n actionName,\n origin,\n filteredListSize,\n tagName: name,\n isFromSearch,\n errorCode: 'CreateTagFailed',\n }),\n });\n }\n\n async updateTag({\n tagToUpdate,\n previousName,\n origin,\n tagSubOrigin,\n filteredListSize,\n isFromSearch = false,\n optimisticActionParams = {},\n tagsBIReporter,\n }: {\n tagToUpdate: Tag;\n previousName: string;\n origin: string;\n tagSubOrigin?: string;\n filteredListSize: number;\n isFromSearch?: boolean;\n optimisticActionParams?: Partial<UpdateManyParams<Tag, {}>>;\n tagsBIReporter: TagsBIReporter;\n }) {\n const actionName = 'Rename tag';\n\n tagsBIReporter.onAction({\n actionName,\n previousName,\n tagName: tagToUpdate.name!,\n isFromSearch,\n origin,\n tagSubOrigin,\n });\n\n this.optimisticActions.updateOne(\n { ...tagToUpdate, revision: (+tagToUpdate.revision! + 1).toString() },\n {\n submit: async () => {\n const updatedTag = await this.tagsService.updateTag({\n tag: tagToUpdate,\n });\n if (this.shouldAllowTagsPagination) {\n // Re-sync with the server: picks up concurrent edits and lets the\n // optimistic patch clear on the refreshed result (otherwise it\n // lingers until unmount). Fire-and-forget — the UI already shows\n // the change via the optimistic patch.\n void this.collection.refreshAllPages();\n }\n return updatedTag;\n },\n ...this._optimisticActionBaseParams(optimisticActionParams, {\n tagsBIReporter,\n actionName,\n origin,\n filteredListSize,\n tagName: previousName,\n isFromSearch,\n errorCode: 'UpdateTagFailed',\n }),\n },\n );\n }\n\n async deleteTag({\n tagToDelete,\n origin,\n tagSubOrigin,\n filteredListSize,\n isFromSearch = true,\n optimisticActionParams = {},\n tagsBIReporter,\n }: {\n tagToDelete: Tag;\n origin: string;\n tagSubOrigin?: string;\n filteredListSize: number;\n isFromSearch?: boolean;\n optimisticActionParams?: Partial<DeleteManyParams<Tag, {}>>;\n tagsBIReporter: TagsBIReporter;\n }) {\n const tagName = tagToDelete.name!;\n const actionName = 'Delete tag';\n\n tagsBIReporter.onAction({\n actionName,\n tagName,\n isFromSearch,\n origin,\n tagSubOrigin,\n });\n\n await this.optimisticActions.deleteOne(tagToDelete, {\n submit: async () => {\n const result = await this.tagsService.deleteTag({\n tagId: tagToDelete.id!,\n });\n if (this.shouldAllowTagsPagination) {\n // Re-sync with the server: picks up concurrent edits and lets the\n // optimistic patch clear on the refreshed result (otherwise it\n // lingers until unmount). Fire-and-forget — the UI already shows\n // the change via the optimistic patch.\n void this.collection.refreshAllPages();\n }\n return result;\n },\n ...this._optimisticActionBaseParams(optimisticActionParams, {\n tagsBIReporter,\n actionName,\n origin,\n tagName,\n filteredListSize,\n isFromSearch,\n errorCode: 'RemoveTagFailed',\n }),\n });\n }\n}\n"],"mappings":"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","ignoreList":[]}
@@ -14,9 +14,6 @@ class TagsSearchState {
14
14
  (0, _defineProperty2.default)(this, "searchValue", '');
15
15
  (0, _defineProperty2.default)(this, "setSearchValue", newSearchValue => {
16
16
  this.searchValue = newSearchValue;
17
- if (this.tagsManagementState.shouldAllowTagsPagination) {
18
- this.tagsManagementState.collection.search(newSearchValue.substring(0, _TagsManagementState.TAG_MAX_LENGTH));
19
- }
20
17
  });
21
18
  this.tagsManagementState = tagsManagementState;
22
19
  (0, _mobx.makeObservable)(this, {
@@ -27,9 +24,6 @@ class TagsSearchState {
27
24
  });
28
25
  }
29
26
  get items() {
30
- if (this.tagsManagementState.shouldAllowTagsPagination) {
31
- return this.tagsManagementState.items;
32
- }
33
27
  if (!this.searchValue) {
34
28
  return this.tagsManagementState.items;
35
29
  }
@@ -1 +1 @@
1
- {"version":3,"names":["_TagsManagementState","require","_mobx","TagsSearchState","constructor","tagsManagementState","_defineProperty2","default","newSearchValue","searchValue","shouldAllowTagsPagination","collection","search","substring","TAG_MAX_LENGTH","makeObservable","observable","setSearchValue","action","items","computed","hasSameTagAsSearch","filtered","filter","tag","name","toLowerCase","includes","length","truncated","find","term","some","exports"],"sources":["../../../../src/state/TagsState/TagsSearchState.ts"],"sourcesContent":["import { TAG_MAX_LENGTH, TagsManagementState } from './TagsManagementState';\nimport { action, makeObservable, observable, computed } from 'mobx';\n\nexport interface TagsSearchStateParams {\n readonly tagsManagementState: TagsManagementState;\n}\n\nexport class TagsSearchState {\n readonly tagsManagementState: TagsManagementState;\n searchValue: string = '';\n\n constructor({ tagsManagementState }: TagsSearchStateParams) {\n this.tagsManagementState = tagsManagementState;\n makeObservable(this, {\n searchValue: observable,\n setSearchValue: action,\n items: computed,\n hasSameTagAsSearch: computed,\n });\n }\n\n setSearchValue = (newSearchValue: string) => {\n this.searchValue = newSearchValue;\n if (this.tagsManagementState.shouldAllowTagsPagination) {\n this.tagsManagementState.collection.search(\n newSearchValue.substring(0, TAG_MAX_LENGTH),\n );\n }\n };\n\n get items() {\n if (this.tagsManagementState.shouldAllowTagsPagination) {\n return this.tagsManagementState.items;\n }\n\n if (!this.searchValue) {\n return this.tagsManagementState.items;\n }\n\n const filtered = this.tagsManagementState.items.filter((tag) =>\n tag.name!.toLowerCase().includes(this.searchValue.toLowerCase()),\n );\n\n if (filtered.length === 0 && this.searchValue.length > TAG_MAX_LENGTH) {\n const truncated = this.tagsManagementState.items.find(\n (tag) =>\n tag.name!.toLowerCase() ===\n this.searchValue.substring(0, TAG_MAX_LENGTH).toLowerCase(),\n );\n if (truncated) {\n return [truncated];\n }\n }\n\n return filtered;\n }\n\n get hasSameTagAsSearch() {\n const term = this.searchValue.substring(0, TAG_MAX_LENGTH).toLowerCase();\n return this.tagsManagementState.items.some(\n (tag) => tag.name!.toLowerCase() === term,\n );\n }\n}\n"],"mappings":";;;;;;AAAA,IAAAA,oBAAA,GAAAC,OAAA;AACA,IAAAC,KAAA,GAAAD,OAAA;AAMO,MAAME,eAAe,CAAC;EAI3BC,WAAWA,CAAC;IAAEC;EAA2C,CAAC,EAAE;IAAA,IAAAC,gBAAA,CAAAC,OAAA;IAAA,IAAAD,gBAAA,CAAAC,OAAA,uBAFtC,EAAE;IAAA,IAAAD,gBAAA,CAAAC,OAAA,0BAYNC,cAAsB,IAAK;MAC3C,IAAI,CAACC,WAAW,GAAGD,cAAc;MACjC,IAAI,IAAI,CAACH,mBAAmB,CAACK,yBAAyB,EAAE;QACtD,IAAI,CAACL,mBAAmB,CAACM,UAAU,CAACC,MAAM,CACxCJ,cAAc,CAACK,SAAS,CAAC,CAAC,EAAEC,mCAAc,CAC5C,CAAC;MACH;IACF,CAAC;IAhBC,IAAI,CAACT,mBAAmB,GAAGA,mBAAmB;IAC9C,IAAAU,oBAAc,EAAC,IAAI,EAAE;MACnBN,WAAW,EAAEO,gBAAU;MACvBC,cAAc,EAAEC,YAAM;MACtBC,KAAK,EAAEC,cAAQ;MACfC,kBAAkB,EAAED;IACtB,CAAC,CAAC;EACJ;EAWA,IAAID,KAAKA,CAAA,EAAG;IACV,IAAI,IAAI,CAACd,mBAAmB,CAACK,yBAAyB,EAAE;MACtD,OAAO,IAAI,CAACL,mBAAmB,CAACc,KAAK;IACvC;IAEA,IAAI,CAAC,IAAI,CAACV,WAAW,EAAE;MACrB,OAAO,IAAI,CAACJ,mBAAmB,CAACc,KAAK;IACvC;IAEA,MAAMG,QAAQ,GAAG,IAAI,CAACjB,mBAAmB,CAACc,KAAK,CAACI,MAAM,CAAEC,GAAG,IACzDA,GAAG,CAACC,IAAI,CAAEC,WAAW,CAAC,CAAC,CAACC,QAAQ,CAAC,IAAI,CAAClB,WAAW,CAACiB,WAAW,CAAC,CAAC,CACjE,CAAC;IAED,IAAIJ,QAAQ,CAACM,MAAM,KAAK,CAAC,IAAI,IAAI,CAACnB,WAAW,CAACmB,MAAM,GAAGd,mCAAc,EAAE;MACrE,MAAMe,SAAS,GAAG,IAAI,CAACxB,mBAAmB,CAACc,KAAK,CAACW,IAAI,CAClDN,GAAG,IACFA,GAAG,CAACC,IAAI,CAAEC,WAAW,CAAC,CAAC,KACvB,IAAI,CAACjB,WAAW,CAACI,SAAS,CAAC,CAAC,EAAEC,mCAAc,CAAC,CAACY,WAAW,CAAC,CAC9D,CAAC;MACD,IAAIG,SAAS,EAAE;QACb,OAAO,CAACA,SAAS,CAAC;MACpB;IACF;IAEA,OAAOP,QAAQ;EACjB;EAEA,IAAID,kBAAkBA,CAAA,EAAG;IACvB,MAAMU,IAAI,GAAG,IAAI,CAACtB,WAAW,CAACI,SAAS,CAAC,CAAC,EAAEC,mCAAc,CAAC,CAACY,WAAW,CAAC,CAAC;IACxE,OAAO,IAAI,CAACrB,mBAAmB,CAACc,KAAK,CAACa,IAAI,CACvCR,GAAG,IAAKA,GAAG,CAACC,IAAI,CAAEC,WAAW,CAAC,CAAC,KAAKK,IACvC,CAAC;EACH;AACF;AAACE,OAAA,CAAA9B,eAAA,GAAAA,eAAA","ignoreList":[]}
1
+ {"version":3,"names":["_TagsManagementState","require","_mobx","TagsSearchState","constructor","tagsManagementState","_defineProperty2","default","newSearchValue","searchValue","makeObservable","observable","setSearchValue","action","items","computed","hasSameTagAsSearch","filtered","filter","tag","name","toLowerCase","includes","length","TAG_MAX_LENGTH","truncated","find","substring","term","some","exports"],"sources":["../../../../src/state/TagsState/TagsSearchState.ts"],"sourcesContent":["import { TAG_MAX_LENGTH, TagsManagementState } from './TagsManagementState';\nimport { action, makeObservable, observable, computed } from 'mobx';\n\nexport interface TagsSearchStateParams {\n readonly tagsManagementState: TagsManagementState;\n}\n\nexport class TagsSearchState {\n readonly tagsManagementState: TagsManagementState;\n searchValue: string = '';\n\n constructor({ tagsManagementState }: TagsSearchStateParams) {\n this.tagsManagementState = tagsManagementState;\n makeObservable(this, {\n searchValue: observable,\n setSearchValue: action,\n items: computed,\n hasSameTagAsSearch: computed,\n });\n }\n\n setSearchValue = (newSearchValue: string) => {\n this.searchValue = newSearchValue;\n };\n\n get items() {\n if (!this.searchValue) {\n return this.tagsManagementState.items;\n }\n\n const filtered = this.tagsManagementState.items.filter((tag) =>\n tag.name!.toLowerCase().includes(this.searchValue.toLowerCase()),\n );\n\n if (filtered.length === 0 && this.searchValue.length > TAG_MAX_LENGTH) {\n const truncated = this.tagsManagementState.items.find(\n (tag) =>\n tag.name!.toLowerCase() ===\n this.searchValue.substring(0, TAG_MAX_LENGTH).toLowerCase(),\n );\n if (truncated) {\n return [truncated];\n }\n }\n\n return filtered;\n }\n\n get hasSameTagAsSearch() {\n const term = this.searchValue.substring(0, TAG_MAX_LENGTH).toLowerCase();\n return this.tagsManagementState.items.some(\n (tag) => tag.name!.toLowerCase() === term,\n );\n }\n}\n"],"mappings":";;;;;;AAAA,IAAAA,oBAAA,GAAAC,OAAA;AACA,IAAAC,KAAA,GAAAD,OAAA;AAMO,MAAME,eAAe,CAAC;EAI3BC,WAAWA,CAAC;IAAEC;EAA2C,CAAC,EAAE;IAAA,IAAAC,gBAAA,CAAAC,OAAA;IAAA,IAAAD,gBAAA,CAAAC,OAAA,uBAFtC,EAAE;IAAA,IAAAD,gBAAA,CAAAC,OAAA,0BAYNC,cAAsB,IAAK;MAC3C,IAAI,CAACC,WAAW,GAAGD,cAAc;IACnC,CAAC;IAXC,IAAI,CAACH,mBAAmB,GAAGA,mBAAmB;IAC9C,IAAAK,oBAAc,EAAC,IAAI,EAAE;MACnBD,WAAW,EAAEE,gBAAU;MACvBC,cAAc,EAAEC,YAAM;MACtBC,KAAK,EAAEC,cAAQ;MACfC,kBAAkB,EAAED;IACtB,CAAC,CAAC;EACJ;EAMA,IAAID,KAAKA,CAAA,EAAG;IACV,IAAI,CAAC,IAAI,CAACL,WAAW,EAAE;MACrB,OAAO,IAAI,CAACJ,mBAAmB,CAACS,KAAK;IACvC;IAEA,MAAMG,QAAQ,GAAG,IAAI,CAACZ,mBAAmB,CAACS,KAAK,CAACI,MAAM,CAAEC,GAAG,IACzDA,GAAG,CAACC,IAAI,CAAEC,WAAW,CAAC,CAAC,CAACC,QAAQ,CAAC,IAAI,CAACb,WAAW,CAACY,WAAW,CAAC,CAAC,CACjE,CAAC;IAED,IAAIJ,QAAQ,CAACM,MAAM,KAAK,CAAC,IAAI,IAAI,CAACd,WAAW,CAACc,MAAM,GAAGC,mCAAc,EAAE;MACrE,MAAMC,SAAS,GAAG,IAAI,CAACpB,mBAAmB,CAACS,KAAK,CAACY,IAAI,CAClDP,GAAG,IACFA,GAAG,CAACC,IAAI,CAAEC,WAAW,CAAC,CAAC,KACvB,IAAI,CAACZ,WAAW,CAACkB,SAAS,CAAC,CAAC,EAAEH,mCAAc,CAAC,CAACH,WAAW,CAAC,CAC9D,CAAC;MACD,IAAII,SAAS,EAAE;QACb,OAAO,CAACA,SAAS,CAAC;MACpB;IACF;IAEA,OAAOR,QAAQ;EACjB;EAEA,IAAID,kBAAkBA,CAAA,EAAG;IACvB,MAAMY,IAAI,GAAG,IAAI,CAACnB,WAAW,CAACkB,SAAS,CAAC,CAAC,EAAEH,mCAAc,CAAC,CAACH,WAAW,CAAC,CAAC;IACxE,OAAO,IAAI,CAAChB,mBAAmB,CAACS,KAAK,CAACe,IAAI,CACvCV,GAAG,IAAKA,GAAG,CAACC,IAAI,CAAEC,WAAW,CAAC,CAAC,KAAKO,IACvC,CAAC;EACH;AACF;AAACE,OAAA,CAAA3B,eAAA,GAAAA,eAAA","ignoreList":[]}
@@ -0,0 +1,186 @@
1
+ "use strict";
2
+
3
+ exports.__esModule = true;
4
+ exports.createInMemorySchemaSource = createInMemorySchemaSource;
5
+ var _SchemaSource = require("../types/SchemaSource");
6
+ var _InMemoryBackend = require("../InMemoryBackend");
7
+ const ALL_PERMISSIONS = {
8
+ createField: true,
9
+ updateField: true,
10
+ deleteField: true
11
+ };
12
+
13
+ // The types the add/edit modal offers by default (the ones @wix/data can create).
14
+ const DEFAULT_CREATABLE_FIELD_TYPES = [{
15
+ patternsType: 'SHORT_TEXT'
16
+ }, {
17
+ patternsType: 'NUMBER'
18
+ }, {
19
+ patternsType: 'BOOLEAN'
20
+ }, {
21
+ patternsType: 'DATE'
22
+ }];
23
+ /**
24
+ * Builds a real `SchemaSource<T>` backed by in-memory state — no data source (no
25
+ * `@wix/data`, no network). Its `collectionConfig.fetchData` serves the seeded
26
+ * `items`, and its `fieldActions` mutate the in-memory schema and return the
27
+ * updated fields map, so the create-new-field import flow works end to end (the
28
+ * created column surfaces via the schema-source merge).
29
+ *
30
+ * Returns `{ source, backend }`. Pass `source` anywhere a `SchemaSource` is
31
+ * accepted — `<Table fieldsSource={...} />`, `useSchemaImport(...)`, or
32
+ * `...collectionConfig` into the collection hook. Use `backend` to read or
33
+ * assert on the in-memory rows directly.
34
+ */
35
+ function createInMemorySchemaSource(config) {
36
+ var _config$fields$;
37
+ const {
38
+ collectionId,
39
+ idField = '_id',
40
+ displayField = ((_config$fields$ = config.fields[0]) == null ? void 0 : _config$fields$.id) ?? idField,
41
+ schemaPermissions = ALL_PERMISSIONS,
42
+ itemPermissions,
43
+ creatableFieldTypes = DEFAULT_CREATABLE_FIELD_TYPES,
44
+ supportsPii = false
45
+ } = config;
46
+
47
+ // Mutable in-memory state shared by the backend, schema, and field actions.
48
+ const fields = {};
49
+ config.fields.forEach(field => {
50
+ fields[field.id] = field;
51
+ });
52
+ const schema = {
53
+ id: collectionId,
54
+ fields,
55
+ displayField,
56
+ idField,
57
+ schemaPermissions,
58
+ ...(itemPermissions && {
59
+ itemPermissions
60
+ })
61
+ };
62
+ const keyOf = item => String(item[idField] ?? '');
63
+ // A fresh copy each mutation, so the schema-source merge sees a new map.
64
+ const fieldsSnapshot = () => ({
65
+ ...fields
66
+ });
67
+
68
+ // The shared `InMemoryBackend` holds the rows and runs the query logic
69
+ // (ordering, filtering, pagination). The `collectionBackend` below adapts it
70
+ // to the source-neutral contract. Mutations write straight to `backend.map`
71
+ // and reads use the synchronous surface, so operations resolve without the
72
+ // util's simulated async delay (which relies on timers the test suite freezes).
73
+ const seed = config.items ?? [];
74
+ const backend = new _InMemoryBackend.InMemoryBackend({
75
+ paginationMode: 'offset',
76
+ total: seed.length,
77
+ createOne: index => seed[index],
78
+ itemKey: keyOf
79
+ });
80
+ const collectionBackend = {
81
+ paginationMode: 'offset',
82
+ find: async query => {
83
+ const offset = query.offset ?? 0;
84
+ const {
85
+ items,
86
+ total = 0
87
+ } = backend.fetchDataSync(query);
88
+ return {
89
+ items,
90
+ total,
91
+ hasNext: offset + items.length < total
92
+ };
93
+ },
94
+ get: async entityId => {
95
+ const item = backend.get(entityId);
96
+ if (!item) {
97
+ throw new Error(`Item "${entityId}" not found`);
98
+ }
99
+ return item;
100
+ },
101
+ create: async entity => {
102
+ const created = {
103
+ ...entity
104
+ };
105
+ backend.map.set(keyOf(created), created);
106
+ return created;
107
+ },
108
+ update: async entity => {
109
+ backend.map.set(keyOf(entity), entity);
110
+ return entity;
111
+ },
112
+ delete: async entityId => {
113
+ backend.map.delete(entityId);
114
+ },
115
+ bulkDelete: async entityIds => {
116
+ entityIds.forEach(entityId => backend.map.delete(entityId));
117
+ },
118
+ bulkInsert: async entities => {
119
+ entities.forEach(entity => {
120
+ const created = {
121
+ ...entity
122
+ };
123
+ backend.map.set(keyOf(created), created);
124
+ });
125
+ return {
126
+ succeeded: entities.length,
127
+ failed: 0
128
+ };
129
+ }
130
+ };
131
+ const fieldActions = {
132
+ addField: async field => {
133
+ fields[field.id] = field;
134
+ return fieldsSnapshot();
135
+ },
136
+ addFields: async newFields => {
137
+ newFields.forEach(field => {
138
+ fields[field.id] = field;
139
+ });
140
+ return fieldsSnapshot();
141
+ },
142
+ editField: async (fieldId, updates) => {
143
+ const current = fields[fieldId];
144
+ if (current) {
145
+ fields[fieldId] = {
146
+ ...current,
147
+ ...updates
148
+ };
149
+ }
150
+ return fieldsSnapshot();
151
+ },
152
+ deleteField: async fieldId => {
153
+ Reflect.deleteProperty(fields, fieldId);
154
+ return fieldsSnapshot();
155
+ },
156
+ renameField: async (fieldId, newName) => {
157
+ const current = fields[fieldId];
158
+ if (current) {
159
+ fields[fieldId] = {
160
+ ...current,
161
+ displayName: newName
162
+ };
163
+ }
164
+ },
165
+ makePrimary: async fieldId => {
166
+ schema.displayField = fieldId;
167
+ return fieldsSnapshot();
168
+ }
169
+ };
170
+ const loadSchema = async () => ({
171
+ schema,
172
+ backend: collectionBackend,
173
+ fieldActions
174
+ });
175
+ const source = (0, _SchemaSource.defineSchemaSource)({
176
+ collectionId,
177
+ loadSchema,
178
+ creatableFieldTypes,
179
+ supportsPii
180
+ });
181
+ return {
182
+ source,
183
+ backend
184
+ };
185
+ }
186
+ //# sourceMappingURL=createInMemorySchemaSource.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_SchemaSource","require","_InMemoryBackend","ALL_PERMISSIONS","createField","updateField","deleteField","DEFAULT_CREATABLE_FIELD_TYPES","patternsType","createInMemorySchemaSource","config","_config$fields$","collectionId","idField","displayField","fields","id","schemaPermissions","itemPermissions","creatableFieldTypes","supportsPii","forEach","field","schema","keyOf","item","String","fieldsSnapshot","seed","items","backend","InMemoryBackend","paginationMode","total","length","createOne","index","itemKey","collectionBackend","find","query","offset","fetchDataSync","hasNext","get","entityId","Error","create","entity","created","map","set","update","delete","bulkDelete","entityIds","bulkInsert","entities","succeeded","failed","fieldActions","addField","addFields","newFields","editField","fieldId","updates","current","Reflect","deleteProperty","renameField","newName","displayName","makePrimary","loadSchema","source","defineSchemaSource"],"sources":["../../../src/testkit/createInMemorySchemaSource.ts"],"sourcesContent":["import {\n defineSchemaSource,\n type CreatableFieldType,\n type SchemaSource,\n} from '../types/SchemaSource';\nimport type {\n CollectionBackend,\n FieldActions,\n ItemPermissions,\n LoadedSchema,\n Schema,\n SchemaPermissions,\n} from '../types/Schema';\nimport type { Field } from '../types/Field';\nimport type { OffsetQuery } from '../hooks/paginationModeConfig';\nimport { InMemoryBackend } from '../InMemoryBackend';\n\nconst ALL_PERMISSIONS: SchemaPermissions = {\n createField: true,\n updateField: true,\n deleteField: true,\n};\n\n// The types the add/edit modal offers by default (the ones @wix/data can create).\nconst DEFAULT_CREATABLE_FIELD_TYPES: CreatableFieldType[] = [\n { patternsType: 'SHORT_TEXT' },\n { patternsType: 'NUMBER' },\n { patternsType: 'BOOLEAN' },\n { patternsType: 'DATE' },\n];\n\nexport interface InMemorySchemaSource<T> {\n /** The `SchemaSource<T>` to pass anywhere a schema source is accepted. */\n source: SchemaSource<T>;\n /** The in-memory backend holding the rows — read or mutate them directly. */\n backend: InMemoryBackend<T>;\n}\n\nexport interface InMemorySchemaSourceConfig<T> {\n collectionId: string;\n /** The collection's fields (keyed internally by `field.id`). */\n fields: Field[];\n /** Seed rows the backend serves via `find`/`get`. */\n items?: T[];\n /** Defaults to the first field's id, else `idField`. */\n displayField?: string;\n /** Defaults to `_id`. */\n idField?: string;\n /** Defaults to all-true (add/edit/delete allowed). */\n schemaPermissions?: SchemaPermissions;\n itemPermissions?: ItemPermissions;\n /** Types the add-field modal offers. Defaults to text/number/boolean/date. */\n creatableFieldTypes?: CreatableFieldType[];\n supportsPii?: boolean;\n}\n\n/**\n * Builds a real `SchemaSource<T>` backed by in-memory state — no data source (no\n * `@wix/data`, no network). Its `collectionConfig.fetchData` serves the seeded\n * `items`, and its `fieldActions` mutate the in-memory schema and return the\n * updated fields map, so the create-new-field import flow works end to end (the\n * created column surfaces via the schema-source merge).\n *\n * Returns `{ source, backend }`. Pass `source` anywhere a `SchemaSource` is\n * accepted — `<Table fieldsSource={...} />`, `useSchemaImport(...)`, or\n * `...collectionConfig` into the collection hook. Use `backend` to read or\n * assert on the in-memory rows directly.\n */\nexport function createInMemorySchemaSource<\n T extends Record<string, unknown> = Record<string, unknown>,\n>(config: InMemorySchemaSourceConfig<T>): InMemorySchemaSource<T> {\n const {\n collectionId,\n idField = '_id',\n displayField = config.fields[0]?.id ?? idField,\n schemaPermissions = ALL_PERMISSIONS,\n itemPermissions,\n creatableFieldTypes = DEFAULT_CREATABLE_FIELD_TYPES,\n supportsPii = false,\n } = config;\n\n // Mutable in-memory state shared by the backend, schema, and field actions.\n const fields: Schema['fields'] = {};\n config.fields.forEach((field) => {\n fields[field.id] = field;\n });\n\n const schema: Schema = {\n id: collectionId,\n fields,\n displayField,\n idField,\n schemaPermissions,\n ...(itemPermissions && { itemPermissions }),\n };\n\n const keyOf = (item: T): string =>\n String((item as Record<string, unknown>)[idField] ?? '');\n // A fresh copy each mutation, so the schema-source merge sees a new map.\n const fieldsSnapshot = (): Schema['fields'] => ({ ...fields });\n\n // The shared `InMemoryBackend` holds the rows and runs the query logic\n // (ordering, filtering, pagination). The `collectionBackend` below adapts it\n // to the source-neutral contract. Mutations write straight to `backend.map`\n // and reads use the synchronous surface, so operations resolve without the\n // util's simulated async delay (which relies on timers the test suite freezes).\n const seed = config.items ?? [];\n const backend = new InMemoryBackend<T>({\n paginationMode: 'offset',\n total: seed.length,\n createOne: (index) => seed[index],\n itemKey: keyOf,\n });\n\n const collectionBackend: CollectionBackend<T> = {\n paginationMode: 'offset',\n find: async (query: OffsetQuery) => {\n const offset = query.offset ?? 0;\n const { items, total = 0 } = backend.fetchDataSync(query);\n return { items, total, hasNext: offset + items.length < total };\n },\n get: async (entityId) => {\n const item = backend.get(entityId);\n if (!item) {\n throw new Error(`Item \"${entityId}\" not found`);\n }\n return item;\n },\n create: async (entity) => {\n const created = { ...entity } as T;\n backend.map.set(keyOf(created), created);\n return created;\n },\n update: async (entity) => {\n backend.map.set(keyOf(entity), entity);\n return entity;\n },\n delete: async (entityId) => {\n backend.map.delete(entityId);\n },\n bulkDelete: async (entityIds) => {\n entityIds.forEach((entityId) => backend.map.delete(entityId));\n },\n bulkInsert: async (entities) => {\n entities.forEach((entity) => {\n const created = { ...entity } as T;\n backend.map.set(keyOf(created), created);\n });\n return { succeeded: entities.length, failed: 0 };\n },\n };\n\n const fieldActions: FieldActions = {\n addField: async (field) => {\n fields[field.id] = field;\n return fieldsSnapshot();\n },\n addFields: async (newFields) => {\n newFields.forEach((field) => {\n fields[field.id] = field;\n });\n return fieldsSnapshot();\n },\n editField: async (fieldId, updates) => {\n const current = fields[fieldId];\n if (current) {\n fields[fieldId] = { ...current, ...updates } as Field;\n }\n return fieldsSnapshot();\n },\n deleteField: async (fieldId) => {\n Reflect.deleteProperty(fields, fieldId);\n return fieldsSnapshot();\n },\n renameField: async (fieldId, newName) => {\n const current = fields[fieldId];\n if (current) {\n fields[fieldId] = { ...current, displayName: newName } as Field;\n }\n },\n makePrimary: async (fieldId) => {\n schema.displayField = fieldId;\n return fieldsSnapshot();\n },\n };\n\n const loadSchema = async (): Promise<LoadedSchema<T>> => ({\n schema,\n backend: collectionBackend,\n fieldActions,\n });\n\n const source = defineSchemaSource<T>({\n collectionId,\n loadSchema,\n creatableFieldTypes,\n supportsPii,\n });\n\n return { source, backend };\n}\n"],"mappings":"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","ignoreList":[]}
@@ -20,6 +20,10 @@ function hubJobImportMocks(whenRequest, when) {
20
20
  outcome: 'completed',
21
21
  succeeded: 0,
22
22
  failed: 0,
23
+ /** new items created (subset of `succeeded`), for the summary step */
24
+ created: 0,
25
+ /** existing items updated (subset of `succeeded`), for the summary step */
26
+ updated: 0,
23
27
  /** number of IN_PROGRESS polls before the job goes terminal */
24
28
  inProgressPolls: 0,
25
29
  /** csvRows indices reported as failed via movement logs */
@@ -41,7 +45,11 @@ function hubJobImportMocks(whenRequest, when) {
41
45
  current: total(),
42
46
  total: total(),
43
47
  itemsSuccessful: state.succeeded,
44
- itemsRejected: state.failed
48
+ itemsRejected: state.failed,
49
+ itemsSuccessfulInfo: {
50
+ itemsCreated: state.created,
51
+ itemsUpdated: state.updated
52
+ }
45
53
  },
46
54
  ...(state.outcome === 'failed' && {
47
55
  error: {
@@ -52,11 +60,17 @@ function hubJobImportMocks(whenRequest, when) {
52
60
  });
53
61
  return {
54
62
  state,
55
- /** Set the job's terminal outcome and its success/failure counts. */
63
+ /**
64
+ * Set the job's terminal outcome and its counts. `created`/`updated` are the
65
+ * split of `succeeded` reported to the summary step; when omitted they
66
+ * default so `created` covers all successes (older jobs report neither).
67
+ */
56
68
  setOutcome(outcome, counts = {}) {
57
69
  state.outcome = outcome;
58
70
  state.succeeded = counts.succeeded ?? 0;
59
71
  state.failed = counts.failed ?? 0;
72
+ state.updated = counts.updated ?? 0;
73
+ state.created = counts.created ?? state.succeeded - state.updated;
60
74
  },
61
75
  /** Make the job report IN_PROGRESS for `n` polls before going terminal. */
62
76
  setInProgressPolls(n) {
@@ -95,6 +109,8 @@ function hubJobImportMocks(whenRequest, when) {
95
109
  state.outcome = 'completed';
96
110
  state.succeeded = 0;
97
111
  state.failed = 0;
112
+ state.created = 0;
113
+ state.updated = 0;
98
114
  state.inProgressPolls = 0;
99
115
  state.failedRowIndices = [];
100
116
  state.uploadedBody = undefined;
@@ -1 +1 @@
1
- {"version":3,"names":["_http","require","_types","UPLOAD_BASE","UPLOAD_PATH","FILE_ID","JOB_ID","hubJobImportMocks","whenRequest","when","state","outcome","succeeded","failed","inProgressPolls","failedRowIndices","uploadedBody","undefined","submittedRequest","submittedJobId","terminatedJobIds","pollCounts","Map","terminalStatus","JobStatus","FAILED","PARTIALLY_SUCCESSFUL","COMPLETED","total","terminalJob","id","status","progress","current","itemsSuccessful","itemsRejected","error","code","description","setOutcome","counts","setInProgressPolls","n","setFailedRowIndices","indices","getUploadedCsv","body","blob","text","arrayBuffer","TextDecoder","decode","Promise","resolve","reject","reader","FileReader","onload","String","result","onerror","readAsText","reset","clear","mocks","createFileUploadUrl","reply","uploadUrl","fileId","persist","put","data","submitJob","payload","set","job","INITIALIZING","getJob","seen","get","jobId","IN_PROGRESS","terminateJob","push","listMovementLogs","logs","map","index","sourceItemId","failure","pagingMetadata","hasNext"],"sources":["../../../src/testkit/hubJobImportMocks.ts"],"sourcesContent":["import {\n createFileUploadUrl,\n submitJob,\n getJob,\n terminateJob,\n listMovementLogs,\n} from '@wix/bex-utils/@wix/ambassador-hub-v1-job/http';\nimport {\n JobStatus,\n type DataMovementJob,\n type SubmitJobRequest,\n} from '@wix/bex-utils/@wix/ambassador-hub-v1-job/types';\n\nconst UPLOAD_BASE = 'https://import-upload.test';\nconst UPLOAD_PATH = '/file';\nconst FILE_ID = 'file-1';\nconst JOB_ID = 'job-1';\n\nexport type ImportJobOutcome = 'completed' | 'partial' | 'failed';\n\n/**\n * Test mocks for the data-hub Hub Job import lifecycle, mirroring\n * `exportServiceMocks`. Auto-included in the test container's httpClient\n * scenarios so every import test drives a fake server. Behavior is controllable\n * per test via `setOutcome` / `setInProgressPolls`, and the uploaded (aligned)\n * CSV + the submitted job request are captured for assertions.\n */\nexport function hubJobImportMocks(\n whenRequest: typeof import('@wix/http-client-testkit/client').whenRequest,\n when: typeof import('@wix/http-client-testkit/client').when,\n) {\n const state = {\n outcome: 'completed' as ImportJobOutcome,\n succeeded: 0,\n failed: 0,\n /** number of IN_PROGRESS polls before the job goes terminal */\n inProgressPolls: 0,\n /** csvRows indices reported as failed via movement logs */\n failedRowIndices: [] as number[],\n /** the raw body PUT to the signed upload URL (the aligned CSV File) */\n uploadedBody: undefined as unknown,\n /** the SubmitJobRequest payload */\n submittedRequest: undefined as SubmitJobRequest | undefined,\n submittedJobId: undefined as string | undefined,\n terminatedJobIds: [] as string[],\n };\n\n const pollCounts = new Map<string, number>();\n\n const terminalStatus = (): JobStatus =>\n state.outcome === 'failed'\n ? JobStatus.FAILED\n : state.outcome === 'partial'\n ? JobStatus.PARTIALLY_SUCCESSFUL\n : JobStatus.COMPLETED;\n\n const total = () => state.succeeded + state.failed;\n\n const terminalJob = (id: string): DataMovementJob => ({\n id,\n status: terminalStatus(),\n progress: {\n current: total(),\n total: total(),\n itemsSuccessful: state.succeeded,\n itemsRejected: state.failed,\n },\n ...(state.outcome === 'failed' && {\n error: { code: 'import_failed', description: 'Import job failed' },\n }),\n });\n\n return {\n state,\n\n /** Set the job's terminal outcome and its success/failure counts. */\n setOutcome(\n outcome: ImportJobOutcome,\n counts: { succeeded?: number; failed?: number } = {},\n ) {\n state.outcome = outcome;\n state.succeeded = counts.succeeded ?? 0;\n state.failed = counts.failed ?? 0;\n },\n\n /** Make the job report IN_PROGRESS for `n` polls before going terminal. */\n setInProgressPolls(n: number) {\n state.inProgressPolls = n;\n },\n\n /** Row indices `listMovementLogs` reports as failed (sourceItemId). */\n setFailedRowIndices(indices: number[]) {\n state.failedRowIndices = indices;\n },\n\n /** The aligned CSV uploaded to the signed URL, as text. */\n async getUploadedCsv(): Promise<string> {\n const body = state.uploadedBody;\n if (body == null) {\n return '';\n }\n if (typeof body === 'string') {\n return body;\n }\n const blob = body as Blob;\n // jsdom's File implements neither text() nor arrayBuffer() here, so fall\n // back to FileReader.\n if (typeof blob.text === 'function') {\n return blob.text();\n }\n if (typeof blob.arrayBuffer === 'function') {\n return new TextDecoder().decode(await blob.arrayBuffer());\n }\n return new Promise<string>((resolve, reject) => {\n const reader = new FileReader();\n reader.onload = () => resolve(String(reader.result));\n reader.onerror = () => reject(reader.error);\n reader.readAsText(blob);\n });\n },\n\n reset() {\n state.outcome = 'completed';\n state.succeeded = 0;\n state.failed = 0;\n state.inProgressPolls = 0;\n state.failedRowIndices = [];\n state.uploadedBody = undefined;\n state.submittedRequest = undefined;\n state.submittedJobId = undefined;\n state.terminatedJobIds = [];\n pollCounts.clear();\n },\n\n mocks: [\n whenRequest(createFileUploadUrl)\n .reply(200, {\n uploadUrl: `${UPLOAD_BASE}${UPLOAD_PATH}`,\n fileId: FILE_ID,\n })\n .persist(),\n\n when(UPLOAD_BASE)\n .put(UPLOAD_PATH)\n .reply(200, (data: unknown) => {\n state.uploadedBody = data;\n return {};\n })\n .persist(),\n\n whenRequest(submitJob)\n .reply(200, (payload: SubmitJobRequest) => {\n state.submittedRequest = payload;\n state.submittedJobId = JOB_ID;\n pollCounts.set(JOB_ID, 0);\n return {\n job: {\n id: JOB_ID,\n status: JobStatus.INITIALIZING,\n progress: { current: 0, total: total() },\n },\n };\n })\n .persist(),\n\n whenRequest(getJob)\n .reply(200, (payload: { jobId: string }) => {\n const seen = pollCounts.get(payload.jobId) ?? 0;\n pollCounts.set(payload.jobId, seen + 1);\n\n if (seen < state.inProgressPolls) {\n // No `total` here so ImportState keeps its initial CSV-row total;\n // `current` is 0-based so the first poll reports nothing processed.\n return {\n job: {\n id: payload.jobId,\n status: JobStatus.IN_PROGRESS,\n progress: {\n current: seen,\n itemsSuccessful: seen,\n itemsRejected: 0,\n },\n },\n };\n }\n\n return { job: terminalJob(payload.jobId) };\n })\n .persist(),\n\n whenRequest(terminateJob)\n .reply(200, (payload: { jobId: string }) => {\n state.terminatedJobIds.push(payload.jobId);\n return {};\n })\n .persist(),\n\n whenRequest(listMovementLogs)\n .reply(200, () => ({\n // data-hub formats a CSV item's sourceItemId as \"row N\", where N is\n // the 1-based file line (header is line 1) — so csvRows[i] is \"row i+2\".\n logs: state.failedRowIndices.map((index) => ({\n sourceItemId: `row ${index + 2}`,\n failure: { code: 'row_failed', description: 'Invalid row' },\n })),\n pagingMetadata: { hasNext: false },\n }))\n .persist(),\n ] as import('@wix/http-client-testkit').AnyScenario[],\n };\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["_http","require","_types","UPLOAD_BASE","UPLOAD_PATH","FILE_ID","JOB_ID","hubJobImportMocks","whenRequest","when","state","outcome","succeeded","failed","created","updated","inProgressPolls","failedRowIndices","uploadedBody","undefined","submittedRequest","submittedJobId","terminatedJobIds","pollCounts","Map","terminalStatus","JobStatus","FAILED","PARTIALLY_SUCCESSFUL","COMPLETED","total","terminalJob","id","status","progress","current","itemsSuccessful","itemsRejected","itemsSuccessfulInfo","itemsCreated","itemsUpdated","error","code","description","setOutcome","counts","setInProgressPolls","n","setFailedRowIndices","indices","getUploadedCsv","body","blob","text","arrayBuffer","TextDecoder","decode","Promise","resolve","reject","reader","FileReader","onload","String","result","onerror","readAsText","reset","clear","mocks","createFileUploadUrl","reply","uploadUrl","fileId","persist","put","data","submitJob","payload","set","job","INITIALIZING","getJob","seen","get","jobId","IN_PROGRESS","terminateJob","push","listMovementLogs","logs","map","index","sourceItemId","failure","pagingMetadata","hasNext"],"sources":["../../../src/testkit/hubJobImportMocks.ts"],"sourcesContent":["import {\n createFileUploadUrl,\n submitJob,\n getJob,\n terminateJob,\n listMovementLogs,\n} from '@wix/bex-utils/@wix/ambassador-hub-v1-job/http';\nimport {\n JobStatus,\n type DataMovementJob,\n type SubmitJobRequest,\n} from '@wix/bex-utils/@wix/ambassador-hub-v1-job/types';\n\nconst UPLOAD_BASE = 'https://import-upload.test';\nconst UPLOAD_PATH = '/file';\nconst FILE_ID = 'file-1';\nconst JOB_ID = 'job-1';\n\nexport type ImportJobOutcome = 'completed' | 'partial' | 'failed';\n\n/**\n * Test mocks for the data-hub Hub Job import lifecycle, mirroring\n * `exportServiceMocks`. Auto-included in the test container's httpClient\n * scenarios so every import test drives a fake server. Behavior is controllable\n * per test via `setOutcome` / `setInProgressPolls`, and the uploaded (aligned)\n * CSV + the submitted job request are captured for assertions.\n */\nexport function hubJobImportMocks(\n whenRequest: typeof import('@wix/http-client-testkit/client').whenRequest,\n when: typeof import('@wix/http-client-testkit/client').when,\n) {\n const state = {\n outcome: 'completed' as ImportJobOutcome,\n succeeded: 0,\n failed: 0,\n /** new items created (subset of `succeeded`), for the summary step */\n created: 0,\n /** existing items updated (subset of `succeeded`), for the summary step */\n updated: 0,\n /** number of IN_PROGRESS polls before the job goes terminal */\n inProgressPolls: 0,\n /** csvRows indices reported as failed via movement logs */\n failedRowIndices: [] as number[],\n /** the raw body PUT to the signed upload URL (the aligned CSV File) */\n uploadedBody: undefined as unknown,\n /** the SubmitJobRequest payload */\n submittedRequest: undefined as SubmitJobRequest | undefined,\n submittedJobId: undefined as string | undefined,\n terminatedJobIds: [] as string[],\n };\n\n const pollCounts = new Map<string, number>();\n\n const terminalStatus = (): JobStatus =>\n state.outcome === 'failed'\n ? JobStatus.FAILED\n : state.outcome === 'partial'\n ? JobStatus.PARTIALLY_SUCCESSFUL\n : JobStatus.COMPLETED;\n\n const total = () => state.succeeded + state.failed;\n\n const terminalJob = (id: string): DataMovementJob => ({\n id,\n status: terminalStatus(),\n progress: {\n current: total(),\n total: total(),\n itemsSuccessful: state.succeeded,\n itemsRejected: state.failed,\n itemsSuccessfulInfo: {\n itemsCreated: state.created,\n itemsUpdated: state.updated,\n },\n },\n ...(state.outcome === 'failed' && {\n error: { code: 'import_failed', description: 'Import job failed' },\n }),\n });\n\n return {\n state,\n\n /**\n * Set the job's terminal outcome and its counts. `created`/`updated` are the\n * split of `succeeded` reported to the summary step; when omitted they\n * default so `created` covers all successes (older jobs report neither).\n */\n setOutcome(\n outcome: ImportJobOutcome,\n counts: {\n succeeded?: number;\n failed?: number;\n created?: number;\n updated?: number;\n } = {},\n ) {\n state.outcome = outcome;\n state.succeeded = counts.succeeded ?? 0;\n state.failed = counts.failed ?? 0;\n state.updated = counts.updated ?? 0;\n state.created = counts.created ?? state.succeeded - state.updated;\n },\n\n /** Make the job report IN_PROGRESS for `n` polls before going terminal. */\n setInProgressPolls(n: number) {\n state.inProgressPolls = n;\n },\n\n /** Row indices `listMovementLogs` reports as failed (sourceItemId). */\n setFailedRowIndices(indices: number[]) {\n state.failedRowIndices = indices;\n },\n\n /** The aligned CSV uploaded to the signed URL, as text. */\n async getUploadedCsv(): Promise<string> {\n const body = state.uploadedBody;\n if (body == null) {\n return '';\n }\n if (typeof body === 'string') {\n return body;\n }\n const blob = body as Blob;\n // jsdom's File implements neither text() nor arrayBuffer() here, so fall\n // back to FileReader.\n if (typeof blob.text === 'function') {\n return blob.text();\n }\n if (typeof blob.arrayBuffer === 'function') {\n return new TextDecoder().decode(await blob.arrayBuffer());\n }\n return new Promise<string>((resolve, reject) => {\n const reader = new FileReader();\n reader.onload = () => resolve(String(reader.result));\n reader.onerror = () => reject(reader.error);\n reader.readAsText(blob);\n });\n },\n\n reset() {\n state.outcome = 'completed';\n state.succeeded = 0;\n state.failed = 0;\n state.created = 0;\n state.updated = 0;\n state.inProgressPolls = 0;\n state.failedRowIndices = [];\n state.uploadedBody = undefined;\n state.submittedRequest = undefined;\n state.submittedJobId = undefined;\n state.terminatedJobIds = [];\n pollCounts.clear();\n },\n\n mocks: [\n whenRequest(createFileUploadUrl)\n .reply(200, {\n uploadUrl: `${UPLOAD_BASE}${UPLOAD_PATH}`,\n fileId: FILE_ID,\n })\n .persist(),\n\n when(UPLOAD_BASE)\n .put(UPLOAD_PATH)\n .reply(200, (data: unknown) => {\n state.uploadedBody = data;\n return {};\n })\n .persist(),\n\n whenRequest(submitJob)\n .reply(200, (payload: SubmitJobRequest) => {\n state.submittedRequest = payload;\n state.submittedJobId = JOB_ID;\n pollCounts.set(JOB_ID, 0);\n return {\n job: {\n id: JOB_ID,\n status: JobStatus.INITIALIZING,\n progress: { current: 0, total: total() },\n },\n };\n })\n .persist(),\n\n whenRequest(getJob)\n .reply(200, (payload: { jobId: string }) => {\n const seen = pollCounts.get(payload.jobId) ?? 0;\n pollCounts.set(payload.jobId, seen + 1);\n\n if (seen < state.inProgressPolls) {\n // No `total` here so ImportState keeps its initial CSV-row total;\n // `current` is 0-based so the first poll reports nothing processed.\n return {\n job: {\n id: payload.jobId,\n status: JobStatus.IN_PROGRESS,\n progress: {\n current: seen,\n itemsSuccessful: seen,\n itemsRejected: 0,\n },\n },\n };\n }\n\n return { job: terminalJob(payload.jobId) };\n })\n .persist(),\n\n whenRequest(terminateJob)\n .reply(200, (payload: { jobId: string }) => {\n state.terminatedJobIds.push(payload.jobId);\n return {};\n })\n .persist(),\n\n whenRequest(listMovementLogs)\n .reply(200, () => ({\n // data-hub formats a CSV item's sourceItemId as \"row N\", where N is\n // the 1-based file line (header is line 1) — so csvRows[i] is \"row i+2\".\n logs: state.failedRowIndices.map((index) => ({\n sourceItemId: `row ${index + 2}`,\n failure: { code: 'row_failed', description: 'Invalid row' },\n })),\n pagingMetadata: { hasNext: false },\n }))\n .persist(),\n ] as import('@wix/http-client-testkit').AnyScenario[],\n };\n}\n"],"mappings":";;;;AAAA,IAAAA,KAAA,GAAAC,OAAA;AAOA,IAAAC,MAAA,GAAAD,OAAA;AAMA,MAAME,WAAW,GAAG,4BAA4B;AAChD,MAAMC,WAAW,GAAG,OAAO;AAC3B,MAAMC,OAAO,GAAG,QAAQ;AACxB,MAAMC,MAAM,GAAG,OAAO;AAItB;AACA;AACA;AACA;AACA;AACA;AACA;AACO,SAASC,iBAAiBA,CAC/BC,WAAyE,EACzEC,IAA2D,EAC3D;EACA,MAAMC,KAAK,GAAG;IACZC,OAAO,EAAE,WAA+B;IACxCC,SAAS,EAAE,CAAC;IACZC,MAAM,EAAE,CAAC;IACT;IACAC,OAAO,EAAE,CAAC;IACV;IACAC,OAAO,EAAE,CAAC;IACV;IACAC,eAAe,EAAE,CAAC;IAClB;IACAC,gBAAgB,EAAE,EAAc;IAChC;IACAC,YAAY,EAAEC,SAAoB;IAClC;IACAC,gBAAgB,EAAED,SAAyC;IAC3DE,cAAc,EAAEF,SAA+B;IAC/CG,gBAAgB,EAAE;EACpB,CAAC;EAED,MAAMC,UAAU,GAAG,IAAIC,GAAG,CAAiB,CAAC;EAE5C,MAAMC,cAAc,GAAGA,CAAA,KACrBf,KAAK,CAACC,OAAO,KAAK,QAAQ,GACtBe,gBAAS,CAACC,MAAM,GAChBjB,KAAK,CAACC,OAAO,KAAK,SAAS,GAC3Be,gBAAS,CAACE,oBAAoB,GAC9BF,gBAAS,CAACG,SAAS;EAEzB,MAAMC,KAAK,GAAGA,CAAA,KAAMpB,KAAK,CAACE,SAAS,GAAGF,KAAK,CAACG,MAAM;EAElD,MAAMkB,WAAW,GAAIC,EAAU,KAAuB;IACpDA,EAAE;IACFC,MAAM,EAAER,cAAc,CAAC,CAAC;IACxBS,QAAQ,EAAE;MACRC,OAAO,EAAEL,KAAK,CAAC,CAAC;MAChBA,KAAK,EAAEA,KAAK,CAAC,CAAC;MACdM,eAAe,EAAE1B,KAAK,CAACE,SAAS;MAChCyB,aAAa,EAAE3B,KAAK,CAACG,MAAM;MAC3ByB,mBAAmB,EAAE;QACnBC,YAAY,EAAE7B,KAAK,CAACI,OAAO;QAC3B0B,YAAY,EAAE9B,KAAK,CAACK;MACtB;IACF,CAAC;IACD,IAAIL,KAAK,CAACC,OAAO,KAAK,QAAQ,IAAI;MAChC8B,KAAK,EAAE;QAAEC,IAAI,EAAE,eAAe;QAAEC,WAAW,EAAE;MAAoB;IACnE,CAAC;EACH,CAAC,CAAC;EAEF,OAAO;IACLjC,KAAK;IAEL;AACJ;AACA;AACA;AACA;IACIkC,UAAUA,CACRjC,OAAyB,EACzBkC,MAKC,GAAG,CAAC,CAAC,EACN;MACAnC,KAAK,CAACC,OAAO,GAAGA,OAAO;MACvBD,KAAK,CAACE,SAAS,GAAGiC,MAAM,CAACjC,SAAS,IAAI,CAAC;MACvCF,KAAK,CAACG,MAAM,GAAGgC,MAAM,CAAChC,MAAM,IAAI,CAAC;MACjCH,KAAK,CAACK,OAAO,GAAG8B,MAAM,CAAC9B,OAAO,IAAI,CAAC;MACnCL,KAAK,CAACI,OAAO,GAAG+B,MAAM,CAAC/B,OAAO,IAAIJ,KAAK,CAACE,SAAS,GAAGF,KAAK,CAACK,OAAO;IACnE,CAAC;IAED;IACA+B,kBAAkBA,CAACC,CAAS,EAAE;MAC5BrC,KAAK,CAACM,eAAe,GAAG+B,CAAC;IAC3B,CAAC;IAED;IACAC,mBAAmBA,CAACC,OAAiB,EAAE;MACrCvC,KAAK,CAACO,gBAAgB,GAAGgC,OAAO;IAClC,CAAC;IAED;IACA,MAAMC,cAAcA,CAAA,EAAoB;MACtC,MAAMC,IAAI,GAAGzC,KAAK,CAACQ,YAAY;MAC/B,IAAIiC,IAAI,IAAI,IAAI,EAAE;QAChB,OAAO,EAAE;MACX;MACA,IAAI,OAAOA,IAAI,KAAK,QAAQ,EAAE;QAC5B,OAAOA,IAAI;MACb;MACA,MAAMC,IAAI,GAAGD,IAAY;MACzB;MACA;MACA,IAAI,OAAOC,IAAI,CAACC,IAAI,KAAK,UAAU,EAAE;QACnC,OAAOD,IAAI,CAACC,IAAI,CAAC,CAAC;MACpB;MACA,IAAI,OAAOD,IAAI,CAACE,WAAW,KAAK,UAAU,EAAE;QAC1C,OAAO,IAAIC,WAAW,CAAC,CAAC,CAACC,MAAM,CAAC,MAAMJ,IAAI,CAACE,WAAW,CAAC,CAAC,CAAC;MAC3D;MACA,OAAO,IAAIG,OAAO,CAAS,CAACC,OAAO,EAAEC,MAAM,KAAK;QAC9C,MAAMC,MAAM,GAAG,IAAIC,UAAU,CAAC,CAAC;QAC/BD,MAAM,CAACE,MAAM,GAAG,MAAMJ,OAAO,CAACK,MAAM,CAACH,MAAM,CAACI,MAAM,CAAC,CAAC;QACpDJ,MAAM,CAACK,OAAO,GAAG,MAAMN,MAAM,CAACC,MAAM,CAACnB,KAAK,CAAC;QAC3CmB,MAAM,CAACM,UAAU,CAACd,IAAI,CAAC;MACzB,CAAC,CAAC;IACJ,CAAC;IAEDe,KAAKA,CAAA,EAAG;MACNzD,KAAK,CAACC,OAAO,GAAG,WAAW;MAC3BD,KAAK,CAACE,SAAS,GAAG,CAAC;MACnBF,KAAK,CAACG,MAAM,GAAG,CAAC;MAChBH,KAAK,CAACI,OAAO,GAAG,CAAC;MACjBJ,KAAK,CAACK,OAAO,GAAG,CAAC;MACjBL,KAAK,CAACM,eAAe,GAAG,CAAC;MACzBN,KAAK,CAACO,gBAAgB,GAAG,EAAE;MAC3BP,KAAK,CAACQ,YAAY,GAAGC,SAAS;MAC9BT,KAAK,CAACU,gBAAgB,GAAGD,SAAS;MAClCT,KAAK,CAACW,cAAc,GAAGF,SAAS;MAChCT,KAAK,CAACY,gBAAgB,GAAG,EAAE;MAC3BC,UAAU,CAAC6C,KAAK,CAAC,CAAC;IACpB,CAAC;IAEDC,KAAK,EAAE,CACL7D,WAAW,CAAC8D,yBAAmB,CAAC,CAC7BC,KAAK,CAAC,GAAG,EAAE;MACVC,SAAS,EAAE,GAAGrE,WAAW,GAAGC,WAAW,EAAE;MACzCqE,MAAM,EAAEpE;IACV,CAAC,CAAC,CACDqE,OAAO,CAAC,CAAC,EAEZjE,IAAI,CAACN,WAAW,CAAC,CACdwE,GAAG,CAACvE,WAAW,CAAC,CAChBmE,KAAK,CAAC,GAAG,EAAGK,IAAa,IAAK;MAC7BlE,KAAK,CAACQ,YAAY,GAAG0D,IAAI;MACzB,OAAO,CAAC,CAAC;IACX,CAAC,CAAC,CACDF,OAAO,CAAC,CAAC,EAEZlE,WAAW,CAACqE,eAAS,CAAC,CACnBN,KAAK,CAAC,GAAG,EAAGO,OAAyB,IAAK;MACzCpE,KAAK,CAACU,gBAAgB,GAAG0D,OAAO;MAChCpE,KAAK,CAACW,cAAc,GAAGf,MAAM;MAC7BiB,UAAU,CAACwD,GAAG,CAACzE,MAAM,EAAE,CAAC,CAAC;MACzB,OAAO;QACL0E,GAAG,EAAE;UACHhD,EAAE,EAAE1B,MAAM;UACV2B,MAAM,EAAEP,gBAAS,CAACuD,YAAY;UAC9B/C,QAAQ,EAAE;YAAEC,OAAO,EAAE,CAAC;YAAEL,KAAK,EAAEA,KAAK,CAAC;UAAE;QACzC;MACF,CAAC;IACH,CAAC,CAAC,CACD4C,OAAO,CAAC,CAAC,EAEZlE,WAAW,CAAC0E,YAAM,CAAC,CAChBX,KAAK,CAAC,GAAG,EAAGO,OAA0B,IAAK;MAC1C,MAAMK,IAAI,GAAG5D,UAAU,CAAC6D,GAAG,CAACN,OAAO,CAACO,KAAK,CAAC,IAAI,CAAC;MAC/C9D,UAAU,CAACwD,GAAG,CAACD,OAAO,CAACO,KAAK,EAAEF,IAAI,GAAG,CAAC,CAAC;MAEvC,IAAIA,IAAI,GAAGzE,KAAK,CAACM,eAAe,EAAE;QAChC;QACA;QACA,OAAO;UACLgE,GAAG,EAAE;YACHhD,EAAE,EAAE8C,OAAO,CAACO,KAAK;YACjBpD,MAAM,EAAEP,gBAAS,CAAC4D,WAAW;YAC7BpD,QAAQ,EAAE;cACRC,OAAO,EAAEgD,IAAI;cACb/C,eAAe,EAAE+C,IAAI;cACrB9C,aAAa,EAAE;YACjB;UACF;QACF,CAAC;MACH;MAEA,OAAO;QAAE2C,GAAG,EAAEjD,WAAW,CAAC+C,OAAO,CAACO,KAAK;MAAE,CAAC;IAC5C,CAAC,CAAC,CACDX,OAAO,CAAC,CAAC,EAEZlE,WAAW,CAAC+E,kBAAY,CAAC,CACtBhB,KAAK,CAAC,GAAG,EAAGO,OAA0B,IAAK;MAC1CpE,KAAK,CAACY,gBAAgB,CAACkE,IAAI,CAACV,OAAO,CAACO,KAAK,CAAC;MAC1C,OAAO,CAAC,CAAC;IACX,CAAC,CAAC,CACDX,OAAO,CAAC,CAAC,EAEZlE,WAAW,CAACiF,sBAAgB,CAAC,CAC1BlB,KAAK,CAAC,GAAG,EAAE,OAAO;MACjB;MACA;MACAmB,IAAI,EAAEhF,KAAK,CAACO,gBAAgB,CAAC0E,GAAG,CAAEC,KAAK,KAAM;QAC3CC,YAAY,EAAE,OAAOD,KAAK,GAAG,CAAC,EAAE;QAChCE,OAAO,EAAE;UAAEpD,IAAI,EAAE,YAAY;UAAEC,WAAW,EAAE;QAAc;MAC5D,CAAC,CAAC,CAAC;MACHoD,cAAc,EAAE;QAAEC,OAAO,EAAE;MAAM;IACnC,CAAC,CAAC,CAAC,CACFtB,OAAO,CAAC,CAAC;EAEhB,CAAC;AACH","ignoreList":[]}
@@ -31,6 +31,12 @@ Object.keys(_hubJobImportMocks).forEach(function (key) {
31
31
  if (key in exports && exports[key] === _hubJobImportMocks[key]) return;
32
32
  exports[key] = _hubJobImportMocks[key];
33
33
  });
34
+ var _createInMemorySchemaSource = require("./createInMemorySchemaSource");
35
+ Object.keys(_createInMemorySchemaSource).forEach(function (key) {
36
+ if (key === "default" || key === "__esModule") return;
37
+ if (key in exports && exports[key] === _createInMemorySchemaSource[key]) return;
38
+ exports[key] = _createInMemorySchemaSource[key];
39
+ });
34
40
  var _flush = require("../test-utils/flush");
35
41
  Object.keys(_flush).forEach(function (key) {
36
42
  if (key === "default" || key === "__esModule") return;
@@ -1 +1 @@
1
- {"version":3,"names":["_product","require","Object","keys","forEach","key","exports","_productFilters","_createProductsBackend","_exportServiceMocks","_hubJobImportMocks","_flush","_folder","_createFoldersBackend","_country","_createCountriesBackend","_appSettingsMocks"],"sources":["../../../src/testkit/index.ts"],"sourcesContent":["export * from './product';\nexport * from './productFilters';\nexport * from './createProductsBackend';\nexport * from './exportServiceMocks';\nexport * from './hubJobImportMocks';\nexport * from '../test-utils/flush';\nexport * from './folder';\nexport * from './createFoldersBackend';\nexport * from './country';\nexport * from './createCountriesBackend';\nexport * from './appSettingsMocks';\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["_product","require","Object","keys","forEach","key","exports","_productFilters","_createProductsBackend","_exportServiceMocks","_hubJobImportMocks","_createInMemorySchemaSource","_flush","_folder","_createFoldersBackend","_country","_createCountriesBackend","_appSettingsMocks"],"sources":["../../../src/testkit/index.ts"],"sourcesContent":["export * from './product';\nexport * from './productFilters';\nexport * from './createProductsBackend';\nexport * from './exportServiceMocks';\nexport * from './hubJobImportMocks';\nexport * from './createInMemorySchemaSource';\nexport * from '../test-utils/flush';\nexport * from './folder';\nexport * from './createFoldersBackend';\nexport * from './country';\nexport * from './createCountriesBackend';\nexport * from './appSettingsMocks';\n"],"mappings":"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","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"names":[],"sources":["../../../src/types/FieldsSource.ts"],"sourcesContent":["import type { Field, PatternsFieldType } from './Field';\nimport type { FieldActions } from './Schema';\n\n/** A field the source has archived. Sources without archiving omit `archive`. */\nexport interface ArchivedFieldItem {\n id: string;\n label: string;\n isPii?: boolean;\n}\n\n/** A field type a source allows creating, with display metadata for the modal. */\nexport interface FieldTypeOption {\n /** Stored on the draft; the source maps it back to its native type. */\n id: string;\n label: string;\n namePlaceholder?: string;\n /** Drives the type icon in the modal. */\n patternsType: PatternsFieldType;\n}\n\n/** Read/write permission defaults a source supports, per audience. */\nexport interface FieldPermissions {\n installedApps?: {\n hide?: boolean;\n defaultRead?: boolean;\n defaultWrite?: boolean;\n };\n siteVisitors?: {\n hide?: boolean;\n defaultRead?: boolean;\n defaultWrite?: boolean;\n };\n}\n\n/** The values the add/edit field modal collects, source-neutral. */\nexport interface FieldDraft {\n type?: string;\n key: string;\n name: string;\n readApps: boolean;\n readUsers: boolean;\n writeApps: boolean;\n writeUsers: boolean;\n containsPii: boolean;\n}\n\n/** Add/edit/delete capability a source exposes. Present ⇒ field management UI shows. */\nexport interface FieldManagement {\n /** False ⇒ the add-field CTA is hidden entirely. */\n canAddFields: boolean;\n /** True ⇒ the add-field CTA renders but is disabled. */\n addFieldDisabled: boolean;\n /** Hint text shown beneath the add-field CTA while it is disabled. */\n addFieldDisabledHint?: string;\n canEditField(field: Field): boolean;\n /** `origin` is the UI surface the delete was triggered from; used for BI. */\n deleteField(fieldId: string, origin: string): Promise<void>;\n\n /** Field types the source allows creating, shown in the add/edit modal. */\n creatableFieldTypes: FieldTypeOption[];\n /** Existing field keys, used by the add modal to reject duplicates. */\n existingFieldKeys: string[];\n /** True when no more fields can be added because a limit is reached. */\n maxReached?: boolean;\n /** Permission defaults; absent ⇒ the modal hides the permissions section. */\n permissions?: FieldPermissions;\n /** True when the source supports marking a field as PII. */\n supportsPii?: boolean;\n addField(draft: FieldDraft): Promise<void>;\n editField(fieldId: string, draft: FieldDraft): Promise<void>;\n /** Current values for an existing field, to prefill the edit modal. */\n getFieldDraft(fieldId: string): FieldDraft | undefined;\n}\n\n/** Archiving capability a source exposes. Present ⇒ archive/restore UI shows. */\nexport interface FieldArchive {\n items: ArchivedFieldItem[];\n shouldDisplay: boolean;\n /** Whether the archived-items panel is currently open. */\n isOpen: boolean;\n openPanel(): void;\n closePanel(): void;\n /** `origin` is the UI surface the action was triggered from; used for BI. */\n archiveField(fieldId: string, origin: string): Promise<void>;\n restoreField(fieldId: string, origin: string): Promise<void>;\n /** Display name for a field, for the confirm-dialog copy. */\n fieldName(fieldId: string): string;\n}\n\n/**\n * The source-neutral fields data a collection reads, implemented by each source\n * adapter. Rendering — field modals, filter elements — is not here; it lives in\n * the collection-page layer.\n */\nexport interface FieldsSource {\n /** Loads the fields (schema/data). The collection runs this once, tracks its\n * status, and shows a retry toast on failure. */\n load(): Promise<void>;\n\n fields: Field[];\n filterableFields: Field[];\n /** The fields the manage-fields panel lists — the source's editable fields. */\n manageableFields: Field[];\n /** Column id for a field. Sources that group fields prefix the group; flat sources use the field key. */\n columnIdForField(field: Field): string;\n /** WQL field path for a filter. Sources that group fields prefix the group; flat sources use the field key. */\n queryFieldId(field: Field): string;\n /** The value to display for a field on a row. */\n getCellValue(row: unknown, field: Field): unknown;\n /** Writes a new value for a field on a row, returning the updated row. Present when cells can be edited in place. */\n setCellValue?(row: unknown, field: Field, value: unknown): unknown;\n\n /** Present when fields can be added/edited/deleted. */\n fieldManagement?: FieldManagement;\n\n /** The collection's field-mutation actions (delete/makePrimary/duplicate/…),\n * driving the shared FieldActions menu. Absent ⇒ no per-field action menu. */\n fieldActions?: FieldActions;\n\n /** Present when the source supports archiving fields. */\n archive?: FieldArchive;\n\n /** Present when fields are grouped. Absent ⇒ flat list. */\n groups?: {\n all: string[];\n fieldsForGroup(group: string): Field[];\n };\n}\n"],"mappings":"","ignoreList":[]}
1
+ {"version":3,"names":[],"sources":["../../../src/types/FieldsSource.ts"],"sourcesContent":["import type { Field, PatternsFieldType } from './Field';\nimport type { FieldActions, Schema } from './Schema';\n\n/** A field the source has archived. Sources without archiving omit `archive`. */\nexport interface ArchivedFieldItem {\n id: string;\n label: string;\n isPii?: boolean;\n}\n\n/** A field type a source allows creating, with display metadata for the modal. */\nexport interface FieldTypeOption {\n /** Stored on the draft; the source maps it back to its native type. */\n id: string;\n label: string;\n namePlaceholder?: string;\n /** Drives the type icon in the modal. */\n patternsType: PatternsFieldType;\n}\n\n/** Read/write permission defaults a source supports, per audience. */\nexport interface FieldPermissions {\n installedApps?: {\n hide?: boolean;\n defaultRead?: boolean;\n defaultWrite?: boolean;\n };\n siteVisitors?: {\n hide?: boolean;\n defaultRead?: boolean;\n defaultWrite?: boolean;\n };\n}\n\n/** The values the add/edit field modal collects, source-neutral. */\nexport interface FieldDraft {\n type?: string;\n key: string;\n name: string;\n readApps: boolean;\n readUsers: boolean;\n writeApps: boolean;\n writeUsers: boolean;\n containsPii: boolean;\n}\n\n/** Add/edit/delete capability a source exposes. Present ⇒ field management UI shows. */\nexport interface FieldManagement {\n /** False ⇒ the add-field CTA is hidden entirely. */\n canAddFields: boolean;\n /** True ⇒ the add-field CTA renders but is disabled. */\n addFieldDisabled: boolean;\n /** Hint text shown beneath the add-field CTA while it is disabled. */\n addFieldDisabledHint?: string;\n canEditField(field: Field): boolean;\n /** `origin` is the UI surface the delete was triggered from; used for BI. */\n deleteField(fieldId: string, origin: string): Promise<void>;\n\n /** Field types the source allows creating, shown in the add/edit modal. */\n creatableFieldTypes: FieldTypeOption[];\n /** Existing field keys, used by the add modal to reject duplicates. */\n existingFieldKeys: string[];\n /** True when no more fields can be added because a limit is reached. */\n maxReached?: boolean;\n /** Permission defaults; absent ⇒ the modal hides the permissions section. */\n permissions?: FieldPermissions;\n /** True when the source supports marking a field as PII. */\n supportsPii?: boolean;\n addField(draft: FieldDraft): Promise<void>;\n editField(fieldId: string, draft: FieldDraft): Promise<void>;\n /** Current values for an existing field, to prefill the edit modal. */\n getFieldDraft(fieldId: string): FieldDraft | undefined;\n}\n\n/** Archiving capability a source exposes. Present ⇒ archive/restore UI shows. */\nexport interface FieldArchive {\n items: ArchivedFieldItem[];\n shouldDisplay: boolean;\n /** Whether the archived-items panel is currently open. */\n isOpen: boolean;\n openPanel(): void;\n closePanel(): void;\n /** `origin` is the UI surface the action was triggered from; used for BI. */\n archiveField(fieldId: string, origin: string): Promise<void>;\n restoreField(fieldId: string, origin: string): Promise<void>;\n /** Display name for a field, for the confirm-dialog copy. */\n fieldName(fieldId: string): string;\n}\n\n/**\n * The source-neutral fields data a collection reads, implemented by each source\n * adapter. Rendering — field modals, filter elements — is not here; it lives in\n * the collection-page layer.\n */\nexport interface FieldsSource {\n /** Loads the fields (schema/data). The collection runs this once, tracks its\n * status, and shows a retry toast on failure. */\n load(): Promise<void>;\n\n fields: Field[];\n filterableFields: Field[];\n /** The fields the manage-fields panel lists — the source's editable fields. */\n manageableFields: Field[];\n /** Column id for a field. Sources that group fields prefix the group; flat sources use the field key. */\n columnIdForField(field: Field): string;\n /** WQL field path for a filter. Sources that group fields prefix the group; flat sources use the field key. */\n queryFieldId(field: Field): string;\n /** The value to display for a field on a row. */\n getCellValue(row: unknown, field: Field): unknown;\n /** Writes a new value for a field on a row, returning the updated row. Present when cells can be edited in place. */\n setCellValue?(row: unknown, field: Field, value: unknown): unknown;\n\n /** Replaces the source's fields with a freshly-returned map, updating the\n * columns with no refetch. Present when the source holds its fields in a\n * mergeable state (e.g. a loaded schema); used after an import creates fields. */\n mergeFields?(fields: Schema['fields']): void;\n\n /** Present when fields can be added/edited/deleted. */\n fieldManagement?: FieldManagement;\n\n /** The collection's field-mutation actions (delete/makePrimary/duplicate/…),\n * driving the shared FieldActions menu. Absent ⇒ no per-field action menu. */\n fieldActions?: FieldActions;\n\n /** Present when the source supports archiving fields. */\n archive?: FieldArchive;\n\n /** Present when fields are grouped. Absent ⇒ flat list. */\n groups?: {\n all: string[];\n fieldsForGroup(group: string): Field[];\n };\n}\n"],"mappings":"","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"names":[],"sources":["../../../src/types/Schema.ts"],"sourcesContent":["import type { Field } from './Field';\nimport type { FiltersMap, OptionalFiltersMap } from '../model';\nimport type {\n OffsetQuery,\n OffsetQueryResult,\n CursorQuery,\n CursorQueryResult,\n FetchTotalFn,\n} from '../hooks/paginationModeConfig';\n\n/** Field-management permissions. Absent when the schema's fields cannot be edited. */\nexport interface SchemaPermissions {\n createField: boolean;\n updateField: boolean;\n deleteField: boolean;\n}\n\n/** Item-level CRUD permissions. */\nexport interface ItemPermissions {\n createItem: boolean;\n updateItem: boolean;\n deleteItem: boolean;\n}\n\n/**\n * A source-neutral description of a collection — data only, no behavior.\n * Item access is in `CollectionBackend`, field mutations in `FieldActions`.\n */\nexport interface Schema {\n id: string;\n fields: Record<string, Field | undefined>;\n /** The field that best represents the entity (titles/selections). */\n displayField: string;\n /** The identifier field. */\n idField: string;\n /** Absent when the schema's fields cannot be edited. */\n schemaPermissions?: SchemaPermissions;\n itemPermissions?: ItemPermissions;\n}\n\nexport interface BackupConfig {\n create: () => Promise<{ backupId: string }>;\n waitForCompletion: (\n backupId: string,\n options?: { signal?: AbortSignal },\n ) => Promise<void>;\n cancel?: (backupId: string) => Promise<void>;\n restore?: (backupId: string) => Promise<{ restorationId: string }>;\n waitForRestoration?: (\n restorationId: string,\n options?: { signal?: AbortSignal },\n ) => Promise<void>;\n}\n\nexport interface BulkInsertError {\n rowIndex: number;\n message?: string;\n code?: string;\n}\n\nexport interface BulkInsertResult {\n succeeded?: number;\n failed?: number;\n errors?: BulkInsertError[];\n}\n\n/** Item data access shared by both pagination modes. */\nexport interface CollectionBackendBase<T = Record<string, unknown>> {\n get: (entityId: string) => Promise<T>;\n create: (entity: Partial<T>) => Promise<T>;\n update: (entity: T) => Promise<T>;\n delete: (entityId: string) => Promise<void>;\n bulkDelete: (entityIds: string[]) => Promise<void>;\n move?: (\n id: string,\n params: { moveAfterId: string | null | undefined },\n ) => Promise<void>;\n backup?: BackupConfig;\n bulkInsert?: (entities: Partial<T>[]) => Promise<BulkInsertResult>;\n}\n\n/** Per-call search scope the query layer passes to a backend's `find`. */\nexport interface FindOptions {\n searchableFieldIds?: string[];\n}\n\n/**\n * The query-layer fetch-data fns plus the optional `find` options the runtime\n * already accepts. Kept separate so the shared `OffsetFetchDataFn`/\n * `CursorFetchDataFn` used by `fetchData` stay unchanged.\n */\ntype OffsetFindFn<T, F extends FiltersMap> = (\n query: OffsetQuery<F>,\n options?: FindOptions,\n) => Promise<OffsetQueryResult<T>>;\ntype CursorFindFn<T, F extends FiltersMap> = (\n query: CursorQuery<F>,\n options?: FindOptions,\n) => Promise<CursorQueryResult<T>>;\n\n/**\n * A source's item data access. The source declares its `paginationMode`\n * (offset by default) together with the matching `find`, same as core's\n * `PaginationModeConfig`.\n */\nexport type CollectionBackend<\n T = Record<string, unknown>,\n F extends FiltersMap = OptionalFiltersMap,\n> = CollectionBackendBase<T> &\n (\n | { paginationMode?: 'offset'; find: OffsetFindFn<T, F> }\n | {\n paginationMode: 'cursor';\n find: CursorFindFn<T, F>;\n fetchTotal?: FetchTotalFn;\n }\n );\n\n/** Field-management actions. All optional — a read-only source provides none. */\nexport interface FieldActions {\n /**\n * Field-mutating actions return the collection's updated fields map so the\n * caller can merge its local state from the response, without reloading the\n * schema. (`renameField` is the exception — nothing consumes its result yet.)\n */\n addField?: (field: Field) => Promise<Schema['fields']>;\n editField?: (\n fieldId: string,\n updates: Partial<Field>,\n ) => Promise<Schema['fields']>;\n deleteField?: (fieldId: string) => Promise<Schema['fields']>;\n renameField?: (fieldId: string, newName: string) => Promise<void>;\n makePrimary?: (fieldId: string) => Promise<Schema['fields']>;\n duplicateField?: (fieldId: string) => Promise<Schema['fields']>;\n duplicateFieldWithContent?: (fieldId: string) => Promise<Schema['fields']>;\n}\n\n/** Everything a source provides for a collection. */\nexport interface LoadedSchema<T = Record<string, unknown>> {\n schema: Schema;\n backend: CollectionBackend<T>;\n fieldActions?: FieldActions;\n}\n\n/**\n * Loads a collection's `LoadedSchema`. Sources that need dependencies expose a\n * factory that returns this type.\n */\nexport type SchemaLoader<\n T extends Record<string, unknown> = Record<string, unknown>,\n> = (collectionId: string) => Promise<LoadedSchema<T>>;\n"],"mappings":"","ignoreList":[]}
1
+ {"version":3,"names":[],"sources":["../../../src/types/Schema.ts"],"sourcesContent":["import type { Field } from './Field';\nimport type { FiltersMap, OptionalFiltersMap } from '../model';\nimport type {\n OffsetQuery,\n OffsetQueryResult,\n CursorQuery,\n CursorQueryResult,\n FetchTotalFn,\n} from '../hooks/paginationModeConfig';\n\n/** Field-management permissions. Absent when the schema's fields cannot be edited. */\nexport interface SchemaPermissions {\n createField: boolean;\n updateField: boolean;\n deleteField: boolean;\n}\n\n/** Item-level CRUD permissions. */\nexport interface ItemPermissions {\n createItem: boolean;\n updateItem: boolean;\n deleteItem: boolean;\n}\n\n/**\n * A source-neutral description of a collection — data only, no behavior.\n * Item access is in `CollectionBackend`, field mutations in `FieldActions`.\n */\nexport interface Schema {\n id: string;\n fields: Record<string, Field | undefined>;\n /** The field that best represents the entity (titles/selections). */\n displayField: string;\n /** The identifier field. */\n idField: string;\n /** Absent when the schema's fields cannot be edited. */\n schemaPermissions?: SchemaPermissions;\n itemPermissions?: ItemPermissions;\n}\n\nexport interface BackupConfig {\n create: () => Promise<{ backupId: string }>;\n waitForCompletion: (\n backupId: string,\n options?: { signal?: AbortSignal },\n ) => Promise<void>;\n cancel?: (backupId: string) => Promise<void>;\n restore?: (backupId: string) => Promise<{ restorationId: string }>;\n waitForRestoration?: (\n restorationId: string,\n options?: { signal?: AbortSignal },\n ) => Promise<void>;\n}\n\nexport interface BulkInsertError {\n rowIndex: number;\n message?: string;\n code?: string;\n}\n\nexport interface BulkInsertResult {\n succeeded?: number;\n failed?: number;\n errors?: BulkInsertError[];\n}\n\n/** Item data access shared by both pagination modes. */\nexport interface CollectionBackendBase<T = Record<string, unknown>> {\n get: (entityId: string) => Promise<T>;\n create: (entity: Partial<T>) => Promise<T>;\n update: (entity: T) => Promise<T>;\n delete: (entityId: string) => Promise<void>;\n bulkDelete: (entityIds: string[]) => Promise<void>;\n move?: (\n id: string,\n params: { moveAfterId: string | null | undefined },\n ) => Promise<void>;\n backup?: BackupConfig;\n bulkInsert?: (entities: Partial<T>[]) => Promise<BulkInsertResult>;\n}\n\n/** Per-call search scope the query layer passes to a backend's `find`. */\nexport interface FindOptions {\n searchableFieldIds?: string[];\n}\n\n/**\n * The query-layer fetch-data fns plus the optional `find` options the runtime\n * already accepts. Kept separate so the shared `OffsetFetchDataFn`/\n * `CursorFetchDataFn` used by `fetchData` stay unchanged.\n */\ntype OffsetFindFn<T, F extends FiltersMap> = (\n query: OffsetQuery<F>,\n options?: FindOptions,\n) => Promise<OffsetQueryResult<T>>;\ntype CursorFindFn<T, F extends FiltersMap> = (\n query: CursorQuery<F>,\n options?: FindOptions,\n) => Promise<CursorQueryResult<T>>;\n\n/**\n * A source's item data access. The source declares its `paginationMode`\n * (offset by default) together with the matching `find`, same as core's\n * `PaginationModeConfig`.\n */\nexport type CollectionBackend<\n T = Record<string, unknown>,\n F extends FiltersMap = OptionalFiltersMap,\n> = CollectionBackendBase<T> &\n (\n | { paginationMode?: 'offset'; find: OffsetFindFn<T, F> }\n | {\n paginationMode: 'cursor';\n find: CursorFindFn<T, F>;\n fetchTotal?: FetchTotalFn;\n }\n );\n\n/** Field-management actions. All optional — a read-only source provides none. */\nexport interface FieldActions {\n /**\n * Field-mutating actions return the collection's updated fields map so the\n * caller can merge its local state from the response, without reloading the\n * schema. (`renameField` is the exception — nothing consumes its result yet.)\n */\n addField?: (field: Field) => Promise<Schema['fields']>;\n /**\n * Adds several fields in a single mutation, each under its `field.id` key\n * (callers decide the keys up front — e.g. CSV import uploads values under\n * them), unlike `addField`, which derives a fresh key from the display name.\n */\n addFields?: (fields: Field[]) => Promise<Schema['fields']>;\n editField?: (\n fieldId: string,\n updates: Partial<Field>,\n ) => Promise<Schema['fields']>;\n deleteField?: (fieldId: string) => Promise<Schema['fields']>;\n renameField?: (fieldId: string, newName: string) => Promise<void>;\n makePrimary?: (fieldId: string) => Promise<Schema['fields']>;\n duplicateField?: (fieldId: string) => Promise<Schema['fields']>;\n duplicateFieldWithContent?: (fieldId: string) => Promise<Schema['fields']>;\n}\n\n/** Everything a source provides for a collection. */\nexport interface LoadedSchema<T = Record<string, unknown>> {\n schema: Schema;\n backend: CollectionBackend<T>;\n fieldActions?: FieldActions;\n}\n\n/**\n * Loads a collection's `LoadedSchema`. Sources that need dependencies expose a\n * factory that returns this type.\n */\nexport type SchemaLoader<\n T extends Record<string, unknown> = Record<string, unknown>,\n> = (collectionId: string) => Promise<LoadedSchema<T>>;\n"],"mappings":"","ignoreList":[]}
@@ -2,7 +2,8 @@
2
2
 
3
3
  exports.__esModule = true;
4
4
  exports.defineSchemaSource = defineSchemaSource;
5
- /** A field type a source allows creating. The label keys are resolved to text by the UI. */
5
+ /** A field type a source allows creating. Declare one entry per
6
+ * `patternsType` — the type is the entry's identity. */
6
7
 
7
8
  /** Collection-query config derived from a source, ready to spread into a collection hook. */
8
9