@wix/bex-core 2.329.0 → 2.330.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/assets/visual-e2e-locale/messages_visuale2e.json +1 -0
- package/dist/cjs/index.js +5 -2
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/services/DataExtensionFieldOperationsService.js +3 -3
- package/dist/cjs/services/DataExtensionFieldOperationsService.js.map +1 -1
- package/dist/cjs/state/ArchiveFieldModalState.js +5 -8
- package/dist/cjs/state/ArchiveFieldModalState.js.map +1 -1
- package/dist/cjs/state/CustomFieldModalBiReporter.js +5 -9
- package/dist/cjs/state/CustomFieldModalBiReporter.js.map +1 -1
- package/dist/cjs/state/CustomFieldModalState.js +32 -71
- package/dist/cjs/state/CustomFieldModalState.js.map +1 -1
- package/dist/cjs/state/DataExtensionState.js +0 -12
- package/dist/cjs/state/DataExtensionState.js.map +1 -1
- package/dist/cjs/state/DeleteFieldModalState.js +9 -11
- package/dist/cjs/state/DeleteFieldModalState.js.map +1 -1
- package/dist/cjs/state/{DataExtensionStateBIReporter.js → FieldOperationsBIReporter.js} +7 -32
- package/dist/cjs/state/FieldOperationsBIReporter.js.map +1 -0
- package/dist/cjs/state/ImportState/ImportState.js +20 -0
- package/dist/cjs/state/ImportState/ImportState.js.map +1 -1
- package/dist/cjs/state/ImportState/__tests__/ImportState.engine.spec.js +74 -0
- package/dist/cjs/state/ImportState/__tests__/ImportState.engine.spec.js.map +1 -1
- package/dist/cjs/state/formatPermissionsForBi.js +36 -0
- package/dist/cjs/state/formatPermissionsForBi.js.map +1 -0
- package/dist/cjs/types/FieldsSource.js +4 -0
- package/dist/cjs/types/FieldsSource.js.map +1 -0
- package/dist/cjs/types/Schema.js.map +1 -1
- package/dist/cjs/types/SchemaSource.js +81 -0
- package/dist/cjs/types/SchemaSource.js.map +1 -0
- package/dist/esm/assets/visual-e2e-locale/messages_visuale2e.json +1 -0
- package/dist/esm/index.js +1 -0
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/services/DataExtensionFieldOperationsService.js +3 -3
- package/dist/esm/services/DataExtensionFieldOperationsService.js.map +1 -1
- package/dist/esm/state/ArchiveFieldModalState.js +4 -7
- package/dist/esm/state/ArchiveFieldModalState.js.map +1 -1
- package/dist/esm/state/CustomFieldModalBiReporter.js +5 -8
- package/dist/esm/state/CustomFieldModalBiReporter.js.map +1 -1
- package/dist/esm/state/CustomFieldModalState.js +28 -52
- package/dist/esm/state/CustomFieldModalState.js.map +1 -1
- package/dist/esm/state/DataExtensionState.js +0 -10
- package/dist/esm/state/DataExtensionState.js.map +1 -1
- package/dist/esm/state/DeleteFieldModalState.js +7 -10
- package/dist/esm/state/DeleteFieldModalState.js.map +1 -1
- package/dist/esm/state/{DataExtensionStateBIReporter.js → FieldOperationsBIReporter.js} +5 -25
- package/dist/esm/state/FieldOperationsBIReporter.js.map +1 -0
- package/dist/esm/state/ImportState/ImportState.js +21 -0
- package/dist/esm/state/ImportState/ImportState.js.map +1 -1
- package/dist/esm/state/ImportState/__tests__/ImportState.engine.spec.js +49 -0
- package/dist/esm/state/ImportState/__tests__/ImportState.engine.spec.js.map +1 -1
- package/dist/esm/state/formatPermissionsForBi.js +26 -0
- package/dist/esm/state/formatPermissionsForBi.js.map +1 -0
- package/dist/esm/types/FieldsSource.js +2 -0
- package/dist/esm/types/FieldsSource.js.map +1 -0
- package/dist/esm/types/SchemaSource.js +52 -0
- package/dist/esm/types/SchemaSource.js.map +1 -0
- package/dist/types/index.d.ts +4 -1
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/state/ArchiveFieldModalState.d.ts +7 -5
- package/dist/types/state/ArchiveFieldModalState.d.ts.map +1 -1
- package/dist/types/state/CustomFieldModalBiReporter.d.ts +4 -3
- package/dist/types/state/CustomFieldModalBiReporter.d.ts.map +1 -1
- package/dist/types/state/CustomFieldModalState.d.ts +12 -6
- package/dist/types/state/CustomFieldModalState.d.ts.map +1 -1
- package/dist/types/state/DataExtensionState.d.ts +0 -2
- package/dist/types/state/DataExtensionState.d.ts.map +1 -1
- package/dist/types/state/DeleteFieldModalState.d.ts +8 -5
- package/dist/types/state/DeleteFieldModalState.d.ts.map +1 -1
- package/dist/types/state/{DataExtensionStateBIReporter.d.ts → FieldOperationsBIReporter.d.ts} +4 -5
- package/dist/types/state/FieldOperationsBIReporter.d.ts.map +1 -0
- package/dist/types/state/ImportState/ImportState.d.ts +2 -0
- package/dist/types/state/ImportState/ImportState.d.ts.map +1 -1
- package/dist/types/state/formatPermissionsForBi.d.ts +7 -0
- package/dist/types/state/formatPermissionsForBi.d.ts.map +1 -0
- package/dist/types/types/FieldsSource.d.ts +116 -0
- package/dist/types/types/FieldsSource.d.ts.map +1 -0
- package/dist/types/types/Schema.d.ts +28 -11
- package/dist/types/types/Schema.d.ts.map +1 -1
- package/dist/types/types/SchemaSource.d.ts +60 -0
- package/dist/types/types/SchemaSource.d.ts.map +1 -0
- package/package.json +4 -4
- package/dist/cjs/state/DataExtensionStateBIReporter.js.map +0 -1
- package/dist/esm/state/DataExtensionStateBIReporter.js.map +0 -1
- package/dist/types/state/DataExtensionStateBIReporter.d.ts.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_mobx","require","_model","_ConditionalModalState","_types","exports","WritePolicy","_parseCsv","_rewriteCsv","_hubJobClient","_importJobPoller","_detectFieldType","_fieldEdit","COMPLETION_LINGER_MS","ID_FIELD_KEY","normalize","value","trim","toLowerCase","toFieldKey","header","words","split","filter","Boolean","length","map","word","index","charAt","slice","toUpperCase","join","uniqueFieldNameAndKey","usedNames","usedKeys","displayName","suffix","key","has","ImportState","constructor","props","_defineProperty2","default","ConditionalModalState","queryStatus","idle","OVERWRITE","succeeded","failed","fields","collectionId","backup","updateSchema","collection","importModalState","translate","errorHandler","showToast","downloadCsv","onJobError","_detectColumnType","detectColumnType","hubJobClient","createHubJobClient","httpClient","makeObservable","currentStep","observable","ref","importStatus","fileName","csvHeaders","csvRows","mappingByHeader","writePolicy","processedCount","totalCount","result","isBackingUp","isRestoring","hasParsedRows","computed","hasMappings","hasNoMappedData","selectedFieldIds","idMappedHeader","setWritePolicy","action","bound","onUploadContinue","goToUpload","setMapping","setNewFieldMapping","setNewFieldConfig","beginFieldEdit","applyFieldEdit","close","onFileSelected","startImport","reset","init","_cancelled","Object","values","some","mappedIndices","reduce","indices","push","row","Set","m","kind","fieldId","entry","entries","find","mapping","policy","canCreateNewField","_this$_abortControlle","_abortController","abort","restoreFn","_jobId","isSuccess","_this$_abortControlle2","terminateJob","error","console","_restoreBackup","clearResultAndMoveToStart","force","restoreController","AbortController","signal","runInAction","discardAndGoBack","discardChangesModal","open","modal","promise","discardAndClose","getDefaultMapping","headers","field","id","forEach","normalizedHeader","matched","fieldType","_columnValues","columnIndex","TYPE_SAMPLE_SIZE","applyParsedCsv","parsedCsv","rows","file","bytes","_readFileBytes","_showFileReadErrorToast","content","_decodeUtf8","_rejectFile","parseCsv","name","arrayBuffer","e","TextDecoder","fatal","decode","messageKey","_this$showToast","call","type","message","_this$showToast2","text","onClick","removeToastOnClick","_showPartialSuccessToast","_this$showToast3","String","imported","_downloadFailedRows","_this$downloadCsv","jobId","_fetchFailedRowIndices","failedRows","unparseCsv","cursor","_pagingMetadata$curso","logs","pagingMetadata","listMovementLogs","undefined","log","_exec","failure","sourceItemId","fileLine","Number","exec","isInteger","hasNext","cursors","next","indexOf","edit","config","_editingHeader","toFieldEdit","_runImportJob","resolvedMapping","csv","rewriteParsedCsvForImport","File","fileId","uploadFile","submitImportJob","destination","_destination","catch","job","pollImportJob","getJob","isCancelled","onProgress","polled","_applyJobProgress","status","JobStatus","FAILED","_job$error","assign","Error","code","response","data","details","applicationError","run","Promise","reject","wixDataCollection","progress","itemsSuccessful","itemsRejected","current","Math","min","_runBackup","restore","_lingerOnCompletion","resolve","setTimeout","_resolveFieldMapping","resolved","newFields","_mapping$displayName","baseName","add","backupFailed","loading","success"],"sources":["../../../../src/state/ImportState/ImportState.ts"],"sourcesContent":["import {\n action,\n computed,\n makeObservable,\n observable,\n runInAction,\n} from 'mobx';\nimport {\n queryStatus,\n ShowToast,\n TaskStatus,\n PatternsErrorHandler,\n} from '../../model';\nimport type { HttpClient } from '../../model/httpClient';\nimport { Translate, TranslationsKeys } from '../../services';\nimport { ModalState } from '../ModalState';\nimport { ConditionalModalState } from '../ConditionalModalState';\nimport { CreateExportAsyncJobRequest } from '@wix/bex-utils/@wix/ambassador-fedinfra-exportservice-v1-export-async-job/types';\nimport {\n JobStatus,\n WritePolicy,\n type Destination,\n type DataMovementJob,\n} from '@wix/bex-utils/@wix/ambassador-hub-v1-job/types';\nimport { ParseCsvResult, parseCsv, unparseCsv } from './parseCsv';\nimport { rewriteParsedCsvForImport } from './rewriteCsv';\nimport { createHubJobClient, HubJobClient } from './hubJobClient';\nimport { pollImportJob } from './importJobPoller';\nimport {\n detectColumnType,\n TYPE_SAMPLE_SIZE,\n type DetectColumnType,\n type NewFieldType,\n} from './detectFieldType';\nimport type { FieldSpec, NonReferenceField } from '../../types/Field';\nimport { toFieldEdit } from './fieldEdit';\n\nexport interface ImportCollection {\n clearResultAndMoveToStart(params?: { force?: boolean }): void;\n}\n\n/** Outcome of a server-side import job, derived from the job's progress. */\nexport interface ImportResult {\n succeeded: number;\n failed: number;\n}\n\nexport interface BackupResult {\n /**\n * Reverts the collection to its pre-import state. Called only when the user\n * cancels mid-import (matching the previous client-side behavior); a job\n * failure leaves partial rows in place and offers \"Try again\".\n *\n * Must fully revert to the snapshot taken before the import — including rows\n * the import overwrote in place. The default `writePolicy` is upsert (OVERWRITE\n * by `_id`), so it is NOT enough to delete newly-inserted ids; previously\n * existing rows may have been overwritten and must be restored to their prior\n * values.\n */\n restore(signal: AbortSignal): Promise<void>;\n}\n\n/**\n * Optional snapshot taken before the import runs, returning a `restore` used to\n * undo the import on cancel. See {@link BackupResult.restore} for the revert\n * contract under upsert.\n */\nexport type BackupFn = (signal: AbortSignal) => Promise<BackupResult | void>;\n\nexport type DownloadCsvFn = (content: string, fileName: string) => void;\n\n/**\n * Consumer hook for resolving a failed import job's message. An import runs\n * server-side, so a failure arrives on a 200 (the poll succeeds; the job\n * doesn't) with no HTTP error to carry the application error. Cairo hands the\n * consumer `run` — an operation that rejects with a synthetic, HTTP-error-shaped\n * error carrying the job's application error — and the consumer wraps it with\n * their own `withErrorHandler` + error-code map (their codes, their\n * translations), keeping the map coupled to the `withErrorHandler` call as\n * everywhere else (e.g. `fetchData`). The map is keyed by application-error code\n * (the v2 errorHandler shape, like `getExportAsyncJobErrors`):\n *\n * onJobError: (run) =>\n * errorHandler.withErrorHandler(run, {\n * [jobErrorCode]: (error) => ({ message: translate(...) }),\n * })\n *\n * `withErrorHandler` attaches the map to the error object and re-rejects it, so\n * the progress step resolves a consumer-specific message via `getResolvedError`.\n * When omitted, the error still surfaces but resolves to the generic message.\n */\nexport type OnImportJobError = (\n run: () => Promise<unknown>,\n) => Promise<unknown>;\n\nexport type ImportField = NonNullable<\n CreateExportAsyncJobRequest['fields']\n>[number];\n\n// `NewFieldType`, `detectColumnType`, etc. are re-exported from the package via\n// the `ImportState` barrel (`./index`), which also exports `./detectFieldType`.\n\n// Re-export the write-policy enum so consumers (and the cairo UI) reference it\n// from `@wix/bex-core` rather than the bundled ambassador path.\nexport { WritePolicy } from '@wix/bex-utils/@wix/ambassador-hub-v1-job/types';\n\n// Per-type configuration for a new field, captured from the \"Edit field\" editor\n// (CAIRO-4398). All optional — an unedited field carries none and is created\n// from detected defaults only. `displayName` is intentionally not here: the\n// (possibly user-overridden) name is deduped and surfaced as\n// `NewFieldDefinition.displayName`.\nexport interface NewFieldConfig {\n validation?: NonReferenceField['validation'];\n isPii?: boolean;\n helpText?: string;\n}\n\n// A new field to add to the collection schema during import. `key` is decided by\n// Cairo (derived from the column header — or the user's name override — deduped)\n// and is also the key the column's values are written under, so the consumer\n// must add the field under exactly this key. `config` carries any per-type\n// configuration the field editor produced; create the field with it.\nexport interface NewFieldDefinition {\n key: string;\n type: NewFieldType;\n displayName: string;\n config?: NewFieldConfig;\n}\n\n/**\n * Consumer-supplied callback that adds the given new fields to the collection\n * schema in a single call, before the rows are uploaded. Mirrors the cm-import\n * `beforeImport`/`updateSchema` flow: Cairo decides the fields (and their keys),\n * the consumer performs one schema mutation (e.g. `updateSchema(collectionId,\n * ...addField(key, config))`). Its presence is also the opt-in for the \"create\n * new field\" default — see `getDefaultMapping`.\n */\nexport type UpdateSchemaFn = (fields: NewFieldDefinition[]) => Promise<void>;\n\n/**\n * How a CSV column is mapped:\n * - `existing` — into an existing collection field by id\n * - `new` — into a new field created during import. `fieldType` is the detected\n * type, or the type the user picked in the field editor. `displayName` and\n * `config` are present only once the user edited the pending field via the\n * \"Edit field\" editor — `displayName` overrides the header-derived name and\n * `config` carries the per-type configuration.\n * - `null` — don't import (skip)\n */\nexport type ColumnMapping =\n | { kind: 'existing'; fieldId: string }\n | {\n kind: 'new';\n fieldType: NewFieldType;\n displayName?: string;\n config?: NewFieldConfig;\n }\n | null;\n\nexport interface ImportStateProps {\n fields: CreateExportAsyncJobRequest['fields'];\n /** Wix httpClient used to drive the Hub Job (data-movement) API. */\n httpClient: HttpClient;\n /** Destination data collection the import writes into. */\n collectionId: string;\n backup?: BackupFn;\n updateSchema?: UpdateSchemaFn;\n /**\n * Infers a new field's type from its column data. Defaults to the primitive\n * detector (number / date / boolean / url / text). `@wix/patterns` injects a\n * media-aware detector from `@wix/patterns-fields` (image / video / document /\n * audio) — that detection needs the media URI parser, which core can't depend\n * on.\n */\n detectColumnType?: DetectColumnType;\n collection: ImportCollection;\n importModalState: ModalState;\n translate: Translate;\n errorHandler: PatternsErrorHandler;\n showToast?: ShowToast;\n downloadCsv?: DownloadCsvFn;\n /** See {@link OnImportJobError}. */\n onJobError?: OnImportJobError;\n}\n\nexport type ImportStep = 'upload' | 'configuration' | 'progress';\n\n// How long to keep the completed progress bar (100%) on screen before closing\n// the modal on a clean import. Without it, an import of very few rows finishes\n// near-instantly and the modal appears to vanish without ever showing the bar\n// reaching completion.\nconst COMPLETION_LINGER_MS = 600;\n\n// The Wix Data collection's id field key. A CSV column mapped to this field lets\n// the user choose how rows that collide on `_id` are written (writePolicy).\nconst ID_FIELD_KEY = '_id';\n\nfunction normalize(value: string) {\n return value.trim().toLowerCase();\n}\n\n// camelCase key for a field created from a column header\n// (e.g. \"Product Name\" -> \"productName\").\nfunction toFieldKey(header: string): string {\n const words = header\n .trim()\n .split(/[^a-zA-Z0-9]+/)\n .filter(Boolean);\n if (words.length === 0) {\n return 'field';\n }\n return words\n .map((word, index) =>\n index === 0\n ? word.charAt(0).toLowerCase() + word.slice(1)\n : word.charAt(0).toUpperCase() + word.slice(1),\n )\n .join('');\n}\n\n// A display name + key for a field created from a column header, unique against\n// both `usedNames` (existing field display names + names already assigned to\n// earlier new columns) and `usedKeys` (existing field ids + keys already\n// assigned). Mirrors cm-import `generateFieldNameAndKey`: when the name or its\n// derived key collides, suffix the *display name* as `\"<header>-<n>\"` and\n// re-derive the key from it — so the created field's name and key are both\n// unique (otherwise two columns with the same header would create fields showing\n// the same name).\nfunction uniqueFieldNameAndKey(\n header: string,\n usedNames: Set<string>,\n usedKeys: Set<string>,\n): { displayName: string; key: string } {\n let displayName = header;\n for (let suffix = 1; ; suffix++) {\n const key = toFieldKey(displayName);\n if (!usedNames.has(displayName) && !usedKeys.has(key)) {\n return { displayName, key };\n }\n displayName = `${header}-${suffix}`;\n }\n}\n\nexport class ImportState {\n readonly fields: ImportField[];\n readonly collectionId: string;\n readonly backup?: BackupFn;\n readonly updateSchema?: UpdateSchemaFn;\n readonly collection: ImportCollection;\n readonly importModalState: ModalState;\n readonly translate: Translate;\n readonly errorHandler: PatternsErrorHandler;\n readonly showToast?: ShowToast;\n readonly downloadCsv?: DownloadCsvFn;\n readonly onJobError?: OnImportJobError;\n private readonly hubJobClient: HubJobClient;\n private readonly _detectColumnType: DetectColumnType;\n readonly discardChangesModal = new ConditionalModalState<\n 'goBack' | 'close'\n >();\n\n currentStep: ImportStep = 'upload';\n importStatus: TaskStatus<ImportResult, unknown> = {\n ...queryStatus.idle,\n };\n fileName = '';\n csvHeaders: string[] = [];\n csvRows: string[][] = [];\n mappingByHeader: Record<string, ColumnMapping> = {};\n // How rows that collide on `_id` are written. Only meaningful (and only sent\n // to the server) when a CSV column is mapped to the `_id` field — see\n // `idMappedHeader` and `_destination`. Defaults to the server default\n // (`OVERWRITE` = upsert by `_id`).\n //\n // Retention: the choice is deliberately kept while editing mappings within a\n // file — remapping `_id` away and back keeps the user's selection rather than\n // silently reverting it. It resets to the default only on a *new file* upload\n // (`applyParsedCsv`) or a full `reset()`.\n writePolicy: WritePolicy = WritePolicy.OVERWRITE;\n processedCount = 0;\n totalCount = 0;\n result: ImportResult = {\n succeeded: 0,\n failed: 0,\n };\n isBackingUp = false;\n isRestoring = false;\n private restoreFn: ((signal: AbortSignal) => Promise<void>) | null = null;\n private _cancelled = false;\n private _abortController: AbortController | null = null;\n // Id of the running data-movement job, set once submitted — used to cancel it\n // (`terminateJob`) if the user closes mid-import.\n private _jobId: string | null = null;\n // The column whose pending new field the field editor is currently editing.\n // Not observable — transient wiring between `beginFieldEdit` and the editor's\n // `applyFieldEdit` callback, never rendered.\n private _editingHeader: string | null = null;\n\n constructor(props: ImportStateProps) {\n this.fields = (props.fields ?? []) as ImportField[];\n this.collectionId = props.collectionId;\n this.backup = props.backup;\n this.updateSchema = props.updateSchema;\n this.collection = props.collection;\n this.importModalState = props.importModalState;\n this.translate = props.translate;\n this.errorHandler = props.errorHandler;\n this.showToast = props.showToast;\n this.downloadCsv = props.downloadCsv;\n this.onJobError = props.onJobError;\n this._detectColumnType = props.detectColumnType ?? detectColumnType;\n this.hubJobClient = createHubJobClient({\n httpClient: props.httpClient,\n errorHandler: props.errorHandler,\n });\n\n makeObservable(this, {\n currentStep: observable.ref,\n importStatus: observable.ref,\n fileName: observable.ref,\n csvHeaders: observable.ref,\n csvRows: observable.ref,\n mappingByHeader: observable.ref,\n writePolicy: observable.ref,\n processedCount: observable.ref,\n totalCount: observable.ref,\n result: observable.ref,\n isBackingUp: observable.ref,\n isRestoring: observable.ref,\n hasParsedRows: computed,\n hasMappings: computed,\n hasNoMappedData: computed,\n selectedFieldIds: computed,\n idMappedHeader: computed,\n setWritePolicy: action.bound,\n onUploadContinue: action.bound,\n goToUpload: action.bound,\n setMapping: action.bound,\n setNewFieldMapping: action.bound,\n setNewFieldConfig: action.bound,\n beginFieldEdit: action.bound,\n applyFieldEdit: action.bound,\n close: action.bound,\n onFileSelected: action.bound,\n startImport: action.bound,\n reset: action.bound,\n });\n }\n\n init() {\n return () => {\n // Unmounting mid-import stops the poll loop (it checks `_cancelled`) so it\n // doesn't run to terminal holding references. We deliberately do NOT abort\n // the AbortController: during a cancel-triggered restore it holds the\n // restore controller, and aborting it would cancel an in-progress restore.\n // The server-side job is also left running — an unmount isn't an explicit\n // user cancel.\n this._cancelled = true;\n };\n }\n\n get hasParsedRows() {\n return this.csvHeaders.length > 0 && this.csvRows.length > 0;\n }\n\n get hasMappings() {\n return Object.values(this.mappingByHeader).some((value) => value != null);\n }\n\n /**\n * True when there are mappings but none of the mapped columns contain any\n * data in any row (including the case of zero data rows). Drives the\n * non-blocking \"no rows found\" warning in the configuration step. Returns\n * false when nothing is mapped yet — that case is handled by the disabled\n * import button instead.\n */\n get hasNoMappedData(): boolean {\n if (!this.hasMappings) {\n return false;\n }\n\n const mappedIndices = this.csvHeaders.reduce<number[]>(\n (indices, header, index) => {\n if (this.mappingByHeader[header] != null) {\n indices.push(index);\n }\n return indices;\n },\n [],\n );\n\n return !this.csvRows.some((row) =>\n mappedIndices.some((index) => (row[index] ?? '').trim() !== ''),\n );\n }\n\n get selectedFieldIds(): Set<string> {\n return new Set(\n Object.values(this.mappingByHeader)\n .filter(\n (m): m is { kind: 'existing'; fieldId: string } =>\n m?.kind === 'existing',\n )\n .map((m) => m.fieldId),\n );\n }\n\n /**\n * The CSV header currently mapped to the collection's `_id` field, or `null`\n * when no column targets it. Drives both the \"When items share the same ID\"\n * control (only shown on this row) and whether `writePolicy` is sent at all —\n * with no `_id` mapped, every row is a fresh insert and collisions can't occur.\n */\n get idMappedHeader(): string | null {\n const entry = Object.entries(this.mappingByHeader).find(\n ([, mapping]) =>\n mapping?.kind === 'existing' && mapping.fieldId === ID_FIELD_KEY,\n );\n return entry ? entry[0] : null;\n }\n\n setWritePolicy(policy: WritePolicy) {\n this.writePolicy = policy;\n }\n\n /**\n * Whether columns may be mapped to a brand-new field created during import.\n * Driven purely by the presence of the `updateSchema` callback — providing the\n * capability is the opt-in (see `getDefaultMapping`). Never changes after\n * construction, so it isn't an observable.\n */\n get canCreateNewField(): boolean {\n return this.updateSchema != null;\n }\n\n reset() {\n this._abortController?.abort();\n this._abortController = null;\n this.currentStep = 'upload';\n this.importStatus = {\n ...queryStatus.idle,\n };\n this.fileName = '';\n this.csvHeaders = [];\n this.csvRows = [];\n this.mappingByHeader = {};\n this.writePolicy = WritePolicy.OVERWRITE;\n this.processedCount = 0;\n this.totalCount = 0;\n this.result = {\n succeeded: 0,\n failed: 0,\n };\n this.isBackingUp = false;\n this.isRestoring = false;\n this.restoreFn = null;\n this._cancelled = false;\n this._jobId = null;\n }\n\n async close() {\n // While on the progress step we treat close as a cancel — terminate the job\n // and restore the backup — UNLESS the import already succeeded. On the\n // success path `startImport` lingers ~600ms on the completed bar with the\n // step still 'progress'; closing during that window must NOT restore (it\n // would undo a clean import). A successful close just closes the modal and\n // lets the success path do its collection refresh.\n if (this.currentStep === 'progress' && !this.importStatus.isSuccess) {\n this._cancelled = true;\n this._abortController?.abort();\n\n // Stop the server-side job. It does not roll back rows already written —\n // that's what the backup restore below is for.\n if (this._jobId) {\n try {\n await this.hubJobClient.terminateJob(this._jobId);\n } catch (error) {\n console.error('Terminate import job failed', error);\n }\n }\n\n if (!this.isBackingUp) {\n await this._restoreBackup();\n }\n\n this.collection.clearResultAndMoveToStart({\n force: true,\n });\n }\n\n this.importModalState.close();\n }\n\n private async _restoreBackup() {\n const restoreFn = this.restoreFn;\n if (!restoreFn) {\n return;\n }\n\n const restoreController = new AbortController();\n this._abortController = restoreController;\n\n this.isRestoring = true;\n try {\n await restoreFn(restoreController.signal);\n } catch (error) {\n console.error('Restore failed', error);\n }\n runInAction(() => {\n this.isRestoring = false;\n this.restoreFn = null;\n });\n }\n\n goToUpload() {\n this.currentStep = 'upload';\n }\n\n async discardAndGoBack() {\n this.discardChangesModal.open('goBack');\n const { result } = await this.discardChangesModal.modal.promise();\n if (result === 'confirmed') {\n this.goToUpload();\n }\n }\n\n async discardAndClose() {\n this.discardChangesModal.open('close');\n const { result } = await this.discardChangesModal.modal.promise();\n if (result === 'confirmed') {\n this.close();\n }\n }\n\n onUploadContinue() {\n if (this.hasParsedRows) {\n this.currentStep = 'configuration';\n }\n }\n\n private getDefaultMapping(headers: string[]) {\n const mapping: Record<string, ColumnMapping> = {};\n const fields = this.fields.map((field) => ({\n id: field.id ?? '',\n header: field.header ?? '',\n }));\n\n headers.forEach((header, index) => {\n const normalizedHeader = normalize(header);\n const matched = fields.find(\n (field) =>\n normalize(field.id) === normalizedHeader ||\n normalize(field.header) === normalizedHeader,\n );\n\n if (matched?.id) {\n mapping[header] = { kind: 'existing', fieldId: matched.id };\n } else {\n // Unmatched columns default to creating a new field (type inferred from\n // the column's data) when the consumer supplied `updateSchema`;\n // otherwise they default to skip.\n mapping[header] = this.canCreateNewField\n ? {\n kind: 'new',\n fieldType: this._detectColumnType(this._columnValues(index)),\n }\n : null;\n }\n });\n\n return mapping;\n }\n\n // The column's values, capped at the detection sample size — detection only\n // looks at the first `TYPE_SAMPLE_SIZE` values, so avoid copying the whole\n // column (a wide CSV would otherwise allocate rows × columns strings).\n private _columnValues(columnIndex: number): string[] {\n return this.csvRows\n .slice(0, TYPE_SAMPLE_SIZE)\n .map((row) => row[columnIndex] ?? '');\n }\n\n private applyParsedCsv(fileName: string, parsedCsv: ParseCsvResult) {\n this.fileName = fileName;\n this.csvHeaders = parsedCsv.headers;\n this.csvRows = parsedCsv.rows;\n this.mappingByHeader = this.getDefaultMapping(parsedCsv.headers);\n // A new file is a fresh import: start from the default policy so a prior\n // file's Skip choice doesn't silently carry over (only the new-file path\n // resets — remapping `_id` within the same file keeps the user's choice).\n this.writePolicy = WritePolicy.OVERWRITE;\n this.currentStep = 'configuration';\n }\n\n async onFileSelected(file: File | null) {\n if (file == null) {\n return;\n }\n\n const bytes = await this._readFileBytes(file);\n if (bytes == null) {\n this._showFileReadErrorToast(file);\n return;\n }\n\n const content = this._decodeUtf8(bytes);\n if (content == null) {\n this._rejectFile(file, 'cairo.import.encodingFailed');\n return;\n }\n\n const parsedCsv = parseCsv(content);\n if ('code' in parsedCsv) {\n this._rejectFile(file, 'cairo.import.processFailed');\n return;\n }\n\n runInAction(() => {\n this.applyParsedCsv(file.name, parsedCsv);\n });\n }\n\n private async _readFileBytes(file: File): Promise<ArrayBuffer | null> {\n try {\n return await file.arrayBuffer();\n } catch (e) {\n console.error(e);\n return null;\n }\n }\n\n private _decodeUtf8(bytes: ArrayBuffer): string | null {\n try {\n // `fatal: true` throws on any byte sequence that isn't valid UTF-8,\n // so encoding is validated against the raw bytes before decoding —\n // unlike `File.text()`, which silently substitutes U+FFFD.\n return new TextDecoder('utf-8', { fatal: true }).decode(bytes);\n } catch (e) {\n console.error(e);\n return null;\n }\n }\n\n private _rejectFile(file: File, messageKey: TranslationsKeys) {\n runInAction(() => {\n this.fileName = file.name;\n this.csvHeaders = [];\n this.csvRows = [];\n this.mappingByHeader = {};\n this.currentStep = 'upload';\n });\n this.showToast?.({\n type: 'ERROR',\n message: this.translate(messageKey),\n });\n }\n\n private _showFileReadErrorToast(file: File) {\n this.showToast?.({\n type: 'ERROR',\n message: this.translate('cairo.import.fileReadFailed'),\n action: {\n text: this.translate('cairo.import.tryAgain'),\n onClick: () => this.onFileSelected(file),\n removeToastOnClick: true,\n },\n });\n }\n\n private _showPartialSuccessToast() {\n this.showToast?.({\n type: 'WARNING',\n message: this.translate('cairo.import.partialSuccessToast', {\n failed: String(this.result.failed),\n imported: String(this.result.succeeded),\n }),\n action: {\n text: this.translate('cairo.import.downloadFailedRows'),\n onClick: () => this._downloadFailedRows(),\n removeToastOnClick: true,\n },\n });\n }\n\n /**\n * Builds a plain, re-importable CSV of the rows the server rejected — the\n * original headers plus just the failed rows — and hands it to `downloadCsv`.\n * The failed rows come from the job's movement logs (which row failed), mapped\n * back to the parsed `csvRows` we still hold in memory.\n */\n private async _downloadFailedRows() {\n const jobId = this._jobId;\n if (!jobId) {\n return;\n }\n\n let indices: number[];\n try {\n indices = await this._fetchFailedRowIndices(jobId);\n } catch (error) {\n console.error('Fetching failed rows report failed', error);\n return;\n }\n\n const failedRows = indices\n .map((index) => this.csvRows[index])\n .filter((row): row is string[] => row != null);\n\n if (failedRows.length === 0) {\n return;\n }\n\n const content = unparseCsv(this.csvHeaders, failedRows);\n this.downloadCsv?.(content, `failed-${this.fileName || 'import.csv'}`);\n }\n\n // Pages through the job's movement logs and returns the `csvRows` indices of\n // the rows that failed. data-hub's CSV decoder\n // (wix-data-hub: packages/wix-data-hub-executor-c/src/plugins/formats/csv/\n // csv-binary-decoder.ts) parses with the `csv-parse` library (`columns: true`)\n // and sets `sourceItemId = \"row ${++index + 1}\"`, incrementing once **per\n // record** — not per physical line. So N is the 1-based record number with\n // the header consumed as columns: the first data record is `\"row 2\"` →\n // `csvRows[0]`, i.e. `csvRows[N - 2]`. Because `csv-parse` is RFC-4180,\n // quoted cells containing embedded newlines are a single record, so they do\n // NOT shift the numbering. Out-of-range indices are guarded below.\n private async _fetchFailedRowIndices(jobId: string): Promise<number[]> {\n const indices: number[] = [];\n let cursor: string | undefined;\n\n do {\n const { logs, pagingMetadata } = await this.hubJobClient.listMovementLogs(\n jobId,\n cursor ? { cursor } : undefined,\n );\n\n for (const log of logs ?? []) {\n if (!log.failure || log.sourceItemId == null) {\n continue;\n }\n const fileLine = Number(/\\d+/.exec(log.sourceItemId)?.[0]);\n const index = fileLine - 2;\n if (\n Number.isInteger(index) &&\n index >= 0 &&\n index < this.csvRows.length\n ) {\n indices.push(index);\n }\n }\n\n cursor =\n (pagingMetadata?.hasNext && pagingMetadata.cursors?.next) || undefined;\n } while (cursor);\n\n return indices;\n }\n\n setMapping(header: string, fieldId: string | null) {\n this.mappingByHeader = {\n ...this.mappingByHeader,\n [header]: fieldId == null ? null : { kind: 'existing', fieldId },\n };\n }\n\n setNewFieldMapping(header: string) {\n const index = this.csvHeaders.indexOf(header);\n const fieldType =\n index >= 0 ? this._detectColumnType(this._columnValues(index)) : 'text';\n this.mappingByHeader = {\n ...this.mappingByHeader,\n [header]: { kind: 'new', fieldType },\n };\n }\n\n /**\n * Persists the result of the \"Edit field\" editor for a column's pending new\n * field: the (possibly overridden) type, an optional display-name override,\n * and the per-type configuration. No-op if the column isn't currently mapped\n * to a new field.\n */\n setNewFieldConfig(\n header: string,\n edit: {\n fieldType: NewFieldType;\n displayName?: string;\n config?: NewFieldConfig;\n },\n ) {\n const mapping = this.mappingByHeader[header];\n if (mapping?.kind !== 'new') {\n return;\n }\n this.mappingByHeader = {\n ...this.mappingByHeader,\n [header]: {\n kind: 'new',\n fieldType: edit.fieldType,\n ...(edit.displayName != null && { displayName: edit.displayName }),\n ...(edit.config && { config: edit.config }),\n },\n };\n }\n\n /**\n * Marks which column's pending new field the field editor is currently\n * editing, so a later `applyFieldEdit` (the editor's `onSubmit`) knows where to\n * write the result.\n */\n beginFieldEdit(header: string) {\n this._editingHeader = header;\n }\n\n /**\n * `onSubmit` handler for the field editor: maps the edited field spec into the\n * column being edited (set via `beginFieldEdit`). No-op if nothing is being\n * edited.\n */\n applyFieldEdit(field: FieldSpec) {\n if (this._editingHeader == null) {\n return;\n }\n this.setNewFieldConfig(this._editingHeader, toFieldEdit(field));\n }\n\n /**\n * Runs the server-side import: align the CSV to the resolved field keys,\n * upload it, submit a data-movement job, then poll until terminal. Throws on\n * a failed job so `startImport` surfaces the error state; partial success is\n * reported via `result.failed` and the partial toast.\n */\n private async _runImportJob(\n resolvedMapping: Record<string, string | null>,\n ): Promise<ImportResult> {\n const csv = rewriteParsedCsvForImport(\n this.csvHeaders,\n this.csvRows,\n resolvedMapping,\n );\n const file = new File([csv], this.fileName || 'import.csv', {\n type: 'text/csv',\n });\n\n const fileId = await this.hubJobClient.uploadFile(file);\n if (this._cancelled) {\n return this.result;\n }\n\n const jobId = await this.hubJobClient.submitImportJob({\n fileId,\n name: this.fileName,\n destination: this._destination(),\n });\n runInAction(() => {\n this._jobId = jobId;\n });\n if (this._cancelled) {\n // The user cancelled while `submitImportJob` was in flight, so `close()`\n // saw no `_jobId` and couldn't terminate it. Terminate it here, otherwise\n // the job keeps importing server-side after cancel (and would overwrite a\n // restored backup).\n await this.hubJobClient.terminateJob(jobId).catch(() => undefined);\n return this.result;\n }\n\n const job = await pollImportJob(\n (id) => this.hubJobClient.getJob(id),\n jobId,\n {\n isCancelled: () => this._cancelled,\n onProgress: (polled) => this._applyJobProgress(polled),\n },\n );\n\n // `null` means cancelled mid-poll — leave whatever progress we have.\n if (!job) {\n return this.result;\n }\n\n if (job.status === JobStatus.FAILED) {\n // The job ran server-side, so a failure arrives on a 200 (the poll\n // succeeded; the job didn't) with no HTTP error to carry the application\n // error. Build a synthetic, HTTP-error-shaped error (the error handler\n // reads the code from `response.data.details.applicationError`) and hand\n // the throwing operation to the consumer's `onJobError` so THEY wrap it\n // with their own `withErrorHandler` + error-code map — `job.error` is the\n // consumer's application error (their import business logic), so only they\n // can map its codes, and the map stays coupled to the `withErrorHandler`\n // call as everywhere else (e.g. `fetchData`). The map is attached to the\n // error object, which the progress step resolves via `getResolvedError`.\n // Without a handler the same error still throws, falling back to the\n // generic message.\n const error = Object.assign(\n new Error(`ImportJob.${job.error?.code ?? 'failed'}`),\n { response: { data: { details: { applicationError: job.error } } } },\n );\n const run = (): Promise<unknown> => Promise.reject(error);\n\n if (this.onJobError) {\n // The consumer wraps `run` with `withErrorHandler`; it re-rejects with\n // `error` (now carrying their map), which propagates from here.\n await this.onJobError(run);\n }\n throw error;\n }\n\n this._applyJobProgress(job);\n return this.result;\n }\n\n // Destination: the consumer's Wix Data collection. `writePolicy` is sent only\n // when a CSV column is mapped to `_id` (the only case collisions can occur);\n // otherwise it's omitted and the server applies its default (upsert by `_id`).\n private _destination(): Destination {\n return {\n wixDataCollection: {\n collectionId: this.collectionId,\n ...(this.idMappedHeader != null && { writePolicy: this.writePolicy }),\n },\n };\n }\n\n private _applyJobProgress(job: DataMovementJob) {\n const progress = job.progress;\n const succeeded = progress?.itemsSuccessful ?? 0;\n const failed = progress?.itemsRejected ?? 0;\n const current = progress?.current ?? succeeded + failed;\n\n // `totalCount` is fixed up front in `startImport` from the CSV row count\n // (one uploaded row per CSV row); polling only advances `processedCount`.\n runInAction(() => {\n this.processedCount = Math.min(current, this.totalCount);\n this.result = { succeeded, failed };\n });\n }\n\n private async _runBackup(): Promise<boolean> {\n const backup = this.backup;\n if (!backup) {\n return false;\n }\n\n try {\n const result = await backup(this._abortController!.signal);\n if (this._cancelled) {\n return true;\n }\n if (result?.restore) {\n this.restoreFn = result.restore;\n }\n } catch (error) {\n if (this._cancelled) {\n return true;\n }\n runInAction(() => {\n this.isBackingUp = false;\n this.importStatus = {\n ...queryStatus.error,\n error,\n };\n });\n return true;\n }\n\n runInAction(() => {\n this.isBackingUp = false;\n });\n return false;\n }\n\n private _lingerOnCompletion() {\n return new Promise<void>((resolve) =>\n setTimeout(resolve, COMPLETION_LINGER_MS),\n );\n }\n\n /**\n * Resolves every column to the final destination key used in the upload\n * payload: an existing field id, a new field's (Cairo-decided) key, or `null`\n * to skip. All new fields are added to the schema in a single `updateSchema`\n * call before the rows upload — mirroring the cm-import `beforeImport` flow.\n * `updateSchema` may throw — `startImport` surfaces that as the error state.\n */\n private async _resolveFieldMapping(): Promise<Record<string, string | null>> {\n const resolved: Record<string, string | null> = {};\n const newFields: NewFieldDefinition[] = [];\n // Seed with existing field ids/display names so derived keys and names never\n // collide with them or with each other.\n const usedKeys = new Set(\n this.fields.map((field) => field.id).filter((id): id is string => !!id),\n );\n const usedNames = new Set(\n this.fields\n .map((field) => field.header)\n .filter((header): header is string => !!header),\n );\n\n for (const header of this.csvHeaders) {\n const mapping = this.mappingByHeader[header];\n\n if (mapping == null) {\n resolved[header] = null;\n } else if (mapping.kind === 'existing') {\n resolved[header] = mapping.fieldId;\n } else if (this.updateSchema) {\n // The user's name override (from the field editor) seeds the unique\n // name/key derivation; otherwise fall back to the column header.\n const baseName = mapping.displayName?.trim() || header;\n const { displayName, key } = uniqueFieldNameAndKey(\n baseName,\n usedNames,\n usedKeys,\n );\n usedKeys.add(key);\n usedNames.add(displayName);\n newFields.push({\n key,\n type: mapping.fieldType,\n displayName,\n ...(mapping.config && { config: mapping.config }),\n });\n resolved[header] = key;\n } else {\n // \"new\" mapping without an `updateSchema` callback — nothing to map into.\n resolved[header] = null;\n }\n }\n\n if (newFields.length > 0 && this.updateSchema) {\n await this.updateSchema(newFields);\n }\n\n return resolved;\n }\n\n async startImport() {\n if (!this.hasMappings) {\n return;\n }\n\n this._cancelled = false;\n this._abortController = new AbortController();\n\n // One uploaded row per CSV row (the rewrite drops columns, not rows), so the\n // total is known up front from the parsed CSV and stays fixed through polling.\n const totalCount = this.csvRows.length;\n\n runInAction(() => {\n this.currentStep = 'progress';\n this.totalCount = totalCount;\n this.processedCount = 0;\n this.isBackingUp = !!this.backup;\n // Clear any error/result from a previous attempt so \"Try again\" starts\n // from a clean slate (e.g. after a backup failure).\n this.importStatus = { ...queryStatus.idle };\n this.result = {\n succeeded: 0,\n failed: 0,\n };\n this._jobId = null;\n });\n\n const backupFailed = await this._runBackup();\n if (backupFailed) {\n return;\n }\n if (this._cancelled) {\n return;\n }\n\n // Create any new fields and resolve every column to its destination key\n // before uploading. A creation failure surfaces as the error state with a\n // \"Try again\" CTA, like an upload/job failure.\n let resolvedMapping: Record<string, string | null>;\n try {\n resolvedMapping = await this._resolveFieldMapping();\n } catch (error) {\n runInAction(() => {\n this.importStatus = {\n ...queryStatus.error,\n error,\n };\n });\n return;\n }\n if (this._cancelled) {\n return;\n }\n\n const promise = this._runImportJob(resolvedMapping);\n\n this.importStatus = {\n ...queryStatus.loading,\n promise,\n };\n\n try {\n await promise;\n if (this._cancelled) {\n return;\n }\n\n runInAction(() => {\n this.importStatus = {\n ...queryStatus.success,\n data: this.result,\n };\n });\n\n // On a clean import, hold the completed (100%) progress bar on screen\n // briefly so the completion is perceptible even for very few rows. Skip\n // the wait when there are failed rows — that path closes and surfaces a\n // toast instead.\n if (this.result.failed === 0) {\n await this._lingerOnCompletion();\n if (this._cancelled) {\n return;\n }\n }\n\n runInAction(() => {\n // Rows the server rejected are reported via a toast (the downloadable\n // failed-rows report is added by the failed-rows-report task).\n if (this.result.failed > 0) {\n this._showPartialSuccessToast();\n }\n\n this.importModalState.close();\n this.collection.clearResultAndMoveToStart({ force: true });\n });\n } catch (error) {\n runInAction(() => {\n this.importStatus = {\n ...queryStatus.error,\n error,\n };\n });\n }\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":["_mobx","require","_model","_ConditionalModalState","_types","exports","WritePolicy","_parseCsv","_rewriteCsv","_hubJobClient","_importJobPoller","_detectFieldType","_fieldEdit","COMPLETION_LINGER_MS","ID_FIELD_KEY","normalize","value","trim","toLowerCase","toFieldKey","header","words","split","filter","Boolean","length","map","word","index","charAt","slice","toUpperCase","join","uniqueFieldNameAndKey","usedNames","usedKeys","displayName","suffix","key","has","ImportState","constructor","props","_defineProperty2","default","ConditionalModalState","queryStatus","idle","OVERWRITE","succeeded","failed","fields","collectionId","backup","updateSchema","collection","importModalState","translate","errorHandler","showToast","downloadCsv","onJobError","_detectColumnType","detectColumnType","hubJobClient","createHubJobClient","httpClient","makeObservable","currentStep","observable","ref","importStatus","fileName","csvHeaders","csvRows","orderedHeaders","mappingByHeader","writePolicy","processedCount","totalCount","result","isBackingUp","isRestoring","hasParsedRows","computed","hasMappings","hasNoMappedData","selectedFieldIds","idMappedHeader","setWritePolicy","action","bound","onUploadContinue","goToUpload","setMapping","setNewFieldMapping","setNewFieldConfig","beginFieldEdit","applyFieldEdit","close","onFileSelected","startImport","reset","init","_cancelled","Object","values","some","mappedIndices","reduce","indices","push","row","Set","m","kind","fieldId","entry","entries","find","mapping","policy","canCreateNewField","_this$_abortControlle","_abortController","abort","restoreFn","_jobId","isSuccess","_this$_abortControlle2","terminateJob","error","console","_restoreBackup","clearResultAndMoveToStart","force","restoreController","AbortController","signal","runInAction","discardAndGoBack","discardChangesModal","open","modal","promise","discardAndClose","getDefaultMapping","headers","field","id","forEach","normalizedHeader","matched","fieldType","_columnValues","columnIndex","TYPE_SAMPLE_SIZE","_orderHeadersWithIdFirst","idHeader","applyParsedCsv","parsedCsv","rows","file","bytes","_readFileBytes","_showFileReadErrorToast","content","_decodeUtf8","_rejectFile","parseCsv","name","arrayBuffer","e","TextDecoder","fatal","decode","messageKey","_this$showToast","call","type","message","_this$showToast2","text","onClick","removeToastOnClick","_showPartialSuccessToast","_this$showToast3","String","imported","_downloadFailedRows","_this$downloadCsv","jobId","_fetchFailedRowIndices","failedRows","unparseCsv","cursor","_pagingMetadata$curso","logs","pagingMetadata","listMovementLogs","undefined","log","_exec","failure","sourceItemId","fileLine","Number","exec","isInteger","hasNext","cursors","next","indexOf","edit","config","_editingHeader","toFieldEdit","_runImportJob","resolvedMapping","csv","rewriteParsedCsvForImport","File","fileId","uploadFile","submitImportJob","destination","_destination","catch","job","pollImportJob","getJob","isCancelled","onProgress","polled","_applyJobProgress","status","JobStatus","FAILED","_job$error","assign","Error","code","response","data","details","applicationError","run","Promise","reject","wixDataCollection","progress","itemsSuccessful","itemsRejected","current","Math","min","_runBackup","restore","_lingerOnCompletion","resolve","setTimeout","_resolveFieldMapping","resolved","newFields","_mapping$displayName","baseName","add","backupFailed","loading","success"],"sources":["../../../../src/state/ImportState/ImportState.ts"],"sourcesContent":["import {\n action,\n computed,\n makeObservable,\n observable,\n runInAction,\n} from 'mobx';\nimport {\n queryStatus,\n ShowToast,\n TaskStatus,\n PatternsErrorHandler,\n} from '../../model';\nimport type { HttpClient } from '../../model/httpClient';\nimport { Translate, TranslationsKeys } from '../../services';\nimport { ModalState } from '../ModalState';\nimport { ConditionalModalState } from '../ConditionalModalState';\nimport { CreateExportAsyncJobRequest } from '@wix/bex-utils/@wix/ambassador-fedinfra-exportservice-v1-export-async-job/types';\nimport {\n JobStatus,\n WritePolicy,\n type Destination,\n type DataMovementJob,\n} from '@wix/bex-utils/@wix/ambassador-hub-v1-job/types';\nimport { ParseCsvResult, parseCsv, unparseCsv } from './parseCsv';\nimport { rewriteParsedCsvForImport } from './rewriteCsv';\nimport { createHubJobClient, HubJobClient } from './hubJobClient';\nimport { pollImportJob } from './importJobPoller';\nimport {\n detectColumnType,\n TYPE_SAMPLE_SIZE,\n type DetectColumnType,\n type NewFieldType,\n} from './detectFieldType';\nimport type { FieldSpec, NonReferenceField } from '../../types/Field';\nimport { toFieldEdit } from './fieldEdit';\n\nexport interface ImportCollection {\n clearResultAndMoveToStart(params?: { force?: boolean }): void;\n}\n\n/** Outcome of a server-side import job, derived from the job's progress. */\nexport interface ImportResult {\n succeeded: number;\n failed: number;\n}\n\nexport interface BackupResult {\n /**\n * Reverts the collection to its pre-import state. Called only when the user\n * cancels mid-import (matching the previous client-side behavior); a job\n * failure leaves partial rows in place and offers \"Try again\".\n *\n * Must fully revert to the snapshot taken before the import — including rows\n * the import overwrote in place. The default `writePolicy` is upsert (OVERWRITE\n * by `_id`), so it is NOT enough to delete newly-inserted ids; previously\n * existing rows may have been overwritten and must be restored to their prior\n * values.\n */\n restore(signal: AbortSignal): Promise<void>;\n}\n\n/**\n * Optional snapshot taken before the import runs, returning a `restore` used to\n * undo the import on cancel. See {@link BackupResult.restore} for the revert\n * contract under upsert.\n */\nexport type BackupFn = (signal: AbortSignal) => Promise<BackupResult | void>;\n\nexport type DownloadCsvFn = (content: string, fileName: string) => void;\n\n/**\n * Consumer hook for resolving a failed import job's message. An import runs\n * server-side, so a failure arrives on a 200 (the poll succeeds; the job\n * doesn't) with no HTTP error to carry the application error. Cairo hands the\n * consumer `run` — an operation that rejects with a synthetic, HTTP-error-shaped\n * error carrying the job's application error — and the consumer wraps it with\n * their own `withErrorHandler` + error-code map (their codes, their\n * translations), keeping the map coupled to the `withErrorHandler` call as\n * everywhere else (e.g. `fetchData`). The map is keyed by application-error code\n * (the v2 errorHandler shape, like `getExportAsyncJobErrors`):\n *\n * onJobError: (run) =>\n * errorHandler.withErrorHandler(run, {\n * [jobErrorCode]: (error) => ({ message: translate(...) }),\n * })\n *\n * `withErrorHandler` attaches the map to the error object and re-rejects it, so\n * the progress step resolves a consumer-specific message via `getResolvedError`.\n * When omitted, the error still surfaces but resolves to the generic message.\n */\nexport type OnImportJobError = (\n run: () => Promise<unknown>,\n) => Promise<unknown>;\n\nexport type ImportField = NonNullable<\n CreateExportAsyncJobRequest['fields']\n>[number];\n\n// `NewFieldType`, `detectColumnType`, etc. are re-exported from the package via\n// the `ImportState` barrel (`./index`), which also exports `./detectFieldType`.\n\n// Re-export the write-policy enum so consumers (and the cairo UI) reference it\n// from `@wix/bex-core` rather than the bundled ambassador path.\nexport { WritePolicy } from '@wix/bex-utils/@wix/ambassador-hub-v1-job/types';\n\n// Per-type configuration for a new field, captured from the \"Edit field\" editor\n// (CAIRO-4398). All optional — an unedited field carries none and is created\n// from detected defaults only. `displayName` is intentionally not here: the\n// (possibly user-overridden) name is deduped and surfaced as\n// `NewFieldDefinition.displayName`.\nexport interface NewFieldConfig {\n validation?: NonReferenceField['validation'];\n isPii?: boolean;\n helpText?: string;\n}\n\n// A new field to add to the collection schema during import. `key` is decided by\n// Cairo (derived from the column header — or the user's name override — deduped)\n// and is also the key the column's values are written under, so the consumer\n// must add the field under exactly this key. `config` carries any per-type\n// configuration the field editor produced; create the field with it.\nexport interface NewFieldDefinition {\n key: string;\n type: NewFieldType;\n displayName: string;\n config?: NewFieldConfig;\n}\n\n/**\n * Consumer-supplied callback that adds the given new fields to the collection\n * schema in a single call, before the rows are uploaded. Mirrors the cm-import\n * `beforeImport`/`updateSchema` flow: Cairo decides the fields (and their keys),\n * the consumer performs one schema mutation (e.g. `updateSchema(collectionId,\n * ...addField(key, config))`). Its presence is also the opt-in for the \"create\n * new field\" default — see `getDefaultMapping`.\n */\nexport type UpdateSchemaFn = (fields: NewFieldDefinition[]) => Promise<void>;\n\n/**\n * How a CSV column is mapped:\n * - `existing` — into an existing collection field by id\n * - `new` — into a new field created during import. `fieldType` is the detected\n * type, or the type the user picked in the field editor. `displayName` and\n * `config` are present only once the user edited the pending field via the\n * \"Edit field\" editor — `displayName` overrides the header-derived name and\n * `config` carries the per-type configuration.\n * - `null` — don't import (skip)\n */\nexport type ColumnMapping =\n | { kind: 'existing'; fieldId: string }\n | {\n kind: 'new';\n fieldType: NewFieldType;\n displayName?: string;\n config?: NewFieldConfig;\n }\n | null;\n\nexport interface ImportStateProps {\n fields: CreateExportAsyncJobRequest['fields'];\n /** Wix httpClient used to drive the Hub Job (data-movement) API. */\n httpClient: HttpClient;\n /** Destination data collection the import writes into. */\n collectionId: string;\n backup?: BackupFn;\n updateSchema?: UpdateSchemaFn;\n /**\n * Infers a new field's type from its column data. Defaults to the primitive\n * detector (number / date / boolean / url / text). `@wix/patterns` injects a\n * media-aware detector from `@wix/patterns-fields` (image / video / document /\n * audio) — that detection needs the media URI parser, which core can't depend\n * on.\n */\n detectColumnType?: DetectColumnType;\n collection: ImportCollection;\n importModalState: ModalState;\n translate: Translate;\n errorHandler: PatternsErrorHandler;\n showToast?: ShowToast;\n downloadCsv?: DownloadCsvFn;\n /** See {@link OnImportJobError}. */\n onJobError?: OnImportJobError;\n}\n\nexport type ImportStep = 'upload' | 'configuration' | 'progress';\n\n// How long to keep the completed progress bar (100%) on screen before closing\n// the modal on a clean import. Without it, an import of very few rows finishes\n// near-instantly and the modal appears to vanish without ever showing the bar\n// reaching completion.\nconst COMPLETION_LINGER_MS = 600;\n\n// The Wix Data collection's id field key. A CSV column mapped to this field lets\n// the user choose how rows that collide on `_id` are written (writePolicy).\nconst ID_FIELD_KEY = '_id';\n\nfunction normalize(value: string) {\n return value.trim().toLowerCase();\n}\n\n// camelCase key for a field created from a column header\n// (e.g. \"Product Name\" -> \"productName\").\nfunction toFieldKey(header: string): string {\n const words = header\n .trim()\n .split(/[^a-zA-Z0-9]+/)\n .filter(Boolean);\n if (words.length === 0) {\n return 'field';\n }\n return words\n .map((word, index) =>\n index === 0\n ? word.charAt(0).toLowerCase() + word.slice(1)\n : word.charAt(0).toUpperCase() + word.slice(1),\n )\n .join('');\n}\n\n// A display name + key for a field created from a column header, unique against\n// both `usedNames` (existing field display names + names already assigned to\n// earlier new columns) and `usedKeys` (existing field ids + keys already\n// assigned). Mirrors cm-import `generateFieldNameAndKey`: when the name or its\n// derived key collides, suffix the *display name* as `\"<header>-<n>\"` and\n// re-derive the key from it — so the created field's name and key are both\n// unique (otherwise two columns with the same header would create fields showing\n// the same name).\nfunction uniqueFieldNameAndKey(\n header: string,\n usedNames: Set<string>,\n usedKeys: Set<string>,\n): { displayName: string; key: string } {\n let displayName = header;\n for (let suffix = 1; ; suffix++) {\n const key = toFieldKey(displayName);\n if (!usedNames.has(displayName) && !usedKeys.has(key)) {\n return { displayName, key };\n }\n displayName = `${header}-${suffix}`;\n }\n}\n\nexport class ImportState {\n readonly fields: ImportField[];\n readonly collectionId: string;\n readonly backup?: BackupFn;\n readonly updateSchema?: UpdateSchemaFn;\n readonly collection: ImportCollection;\n readonly importModalState: ModalState;\n readonly translate: Translate;\n readonly errorHandler: PatternsErrorHandler;\n readonly showToast?: ShowToast;\n readonly downloadCsv?: DownloadCsvFn;\n readonly onJobError?: OnImportJobError;\n private readonly hubJobClient: HubJobClient;\n private readonly _detectColumnType: DetectColumnType;\n readonly discardChangesModal = new ConditionalModalState<\n 'goBack' | 'close'\n >();\n\n currentStep: ImportStep = 'upload';\n importStatus: TaskStatus<ImportResult, unknown> = {\n ...queryStatus.idle,\n };\n fileName = '';\n csvHeaders: string[] = [];\n csvRows: string[][] = [];\n // Header display order for the configuration step, snapshotted when the file\n // is parsed. The column auto-mapped to `_id` floats to the top (CAIRO-4418);\n // the order then stays fixed while the user edits mappings, so clearing or\n // remapping the `_id` column can't reorder the row under the user's cursor.\n // Recomputed only on a new file (`applyParsedCsv`) or a full `reset()`.\n orderedHeaders: string[] = [];\n mappingByHeader: Record<string, ColumnMapping> = {};\n // How rows that collide on `_id` are written. Only meaningful (and only sent\n // to the server) when a CSV column is mapped to the `_id` field — see\n // `idMappedHeader` and `_destination`. Defaults to the server default\n // (`OVERWRITE` = upsert by `_id`).\n //\n // Retention: the choice is deliberately kept while editing mappings within a\n // file — remapping `_id` away and back keeps the user's selection rather than\n // silently reverting it. It resets to the default only on a *new file* upload\n // (`applyParsedCsv`) or a full `reset()`.\n writePolicy: WritePolicy = WritePolicy.OVERWRITE;\n processedCount = 0;\n totalCount = 0;\n result: ImportResult = {\n succeeded: 0,\n failed: 0,\n };\n isBackingUp = false;\n isRestoring = false;\n private restoreFn: ((signal: AbortSignal) => Promise<void>) | null = null;\n private _cancelled = false;\n private _abortController: AbortController | null = null;\n // Id of the running data-movement job, set once submitted — used to cancel it\n // (`terminateJob`) if the user closes mid-import.\n private _jobId: string | null = null;\n // The column whose pending new field the field editor is currently editing.\n // Not observable — transient wiring between `beginFieldEdit` and the editor's\n // `applyFieldEdit` callback, never rendered.\n private _editingHeader: string | null = null;\n\n constructor(props: ImportStateProps) {\n this.fields = (props.fields ?? []) as ImportField[];\n this.collectionId = props.collectionId;\n this.backup = props.backup;\n this.updateSchema = props.updateSchema;\n this.collection = props.collection;\n this.importModalState = props.importModalState;\n this.translate = props.translate;\n this.errorHandler = props.errorHandler;\n this.showToast = props.showToast;\n this.downloadCsv = props.downloadCsv;\n this.onJobError = props.onJobError;\n this._detectColumnType = props.detectColumnType ?? detectColumnType;\n this.hubJobClient = createHubJobClient({\n httpClient: props.httpClient,\n errorHandler: props.errorHandler,\n });\n\n makeObservable(this, {\n currentStep: observable.ref,\n importStatus: observable.ref,\n fileName: observable.ref,\n csvHeaders: observable.ref,\n csvRows: observable.ref,\n orderedHeaders: observable.ref,\n mappingByHeader: observable.ref,\n writePolicy: observable.ref,\n processedCount: observable.ref,\n totalCount: observable.ref,\n result: observable.ref,\n isBackingUp: observable.ref,\n isRestoring: observable.ref,\n hasParsedRows: computed,\n hasMappings: computed,\n hasNoMappedData: computed,\n selectedFieldIds: computed,\n idMappedHeader: computed,\n setWritePolicy: action.bound,\n onUploadContinue: action.bound,\n goToUpload: action.bound,\n setMapping: action.bound,\n setNewFieldMapping: action.bound,\n setNewFieldConfig: action.bound,\n beginFieldEdit: action.bound,\n applyFieldEdit: action.bound,\n close: action.bound,\n onFileSelected: action.bound,\n startImport: action.bound,\n reset: action.bound,\n });\n }\n\n init() {\n return () => {\n // Unmounting mid-import stops the poll loop (it checks `_cancelled`) so it\n // doesn't run to terminal holding references. We deliberately do NOT abort\n // the AbortController: during a cancel-triggered restore it holds the\n // restore controller, and aborting it would cancel an in-progress restore.\n // The server-side job is also left running — an unmount isn't an explicit\n // user cancel.\n this._cancelled = true;\n };\n }\n\n get hasParsedRows() {\n return this.csvHeaders.length > 0 && this.csvRows.length > 0;\n }\n\n get hasMappings() {\n return Object.values(this.mappingByHeader).some((value) => value != null);\n }\n\n /**\n * True when there are mappings but none of the mapped columns contain any\n * data in any row (including the case of zero data rows). Drives the\n * non-blocking \"no rows found\" warning in the configuration step. Returns\n * false when nothing is mapped yet — that case is handled by the disabled\n * import button instead.\n */\n get hasNoMappedData(): boolean {\n if (!this.hasMappings) {\n return false;\n }\n\n const mappedIndices = this.csvHeaders.reduce<number[]>(\n (indices, header, index) => {\n if (this.mappingByHeader[header] != null) {\n indices.push(index);\n }\n return indices;\n },\n [],\n );\n\n return !this.csvRows.some((row) =>\n mappedIndices.some((index) => (row[index] ?? '').trim() !== ''),\n );\n }\n\n get selectedFieldIds(): Set<string> {\n return new Set(\n Object.values(this.mappingByHeader)\n .filter(\n (m): m is { kind: 'existing'; fieldId: string } =>\n m?.kind === 'existing',\n )\n .map((m) => m.fieldId),\n );\n }\n\n /**\n * The CSV header currently mapped to the collection's `_id` field, or `null`\n * when no column targets it. Drives both the \"When items share the same ID\"\n * control (only shown on this row) and whether `writePolicy` is sent at all —\n * with no `_id` mapped, every row is a fresh insert and collisions can't occur.\n */\n get idMappedHeader(): string | null {\n const entry = Object.entries(this.mappingByHeader).find(\n ([, mapping]) =>\n mapping?.kind === 'existing' && mapping.fieldId === ID_FIELD_KEY,\n );\n return entry ? entry[0] : null;\n }\n\n setWritePolicy(policy: WritePolicy) {\n this.writePolicy = policy;\n }\n\n /**\n * Whether columns may be mapped to a brand-new field created during import.\n * Driven purely by the presence of the `updateSchema` callback — providing the\n * capability is the opt-in (see `getDefaultMapping`). Never changes after\n * construction, so it isn't an observable.\n */\n get canCreateNewField(): boolean {\n return this.updateSchema != null;\n }\n\n reset() {\n this._abortController?.abort();\n this._abortController = null;\n this.currentStep = 'upload';\n this.importStatus = {\n ...queryStatus.idle,\n };\n this.fileName = '';\n this.csvHeaders = [];\n this.csvRows = [];\n this.orderedHeaders = [];\n this.mappingByHeader = {};\n this.writePolicy = WritePolicy.OVERWRITE;\n this.processedCount = 0;\n this.totalCount = 0;\n this.result = {\n succeeded: 0,\n failed: 0,\n };\n this.isBackingUp = false;\n this.isRestoring = false;\n this.restoreFn = null;\n this._cancelled = false;\n this._jobId = null;\n }\n\n async close() {\n // While on the progress step we treat close as a cancel — terminate the job\n // and restore the backup — UNLESS the import already succeeded. On the\n // success path `startImport` lingers ~600ms on the completed bar with the\n // step still 'progress'; closing during that window must NOT restore (it\n // would undo a clean import). A successful close just closes the modal and\n // lets the success path do its collection refresh.\n if (this.currentStep === 'progress' && !this.importStatus.isSuccess) {\n this._cancelled = true;\n this._abortController?.abort();\n\n // Stop the server-side job. It does not roll back rows already written —\n // that's what the backup restore below is for.\n if (this._jobId) {\n try {\n await this.hubJobClient.terminateJob(this._jobId);\n } catch (error) {\n console.error('Terminate import job failed', error);\n }\n }\n\n if (!this.isBackingUp) {\n await this._restoreBackup();\n }\n\n this.collection.clearResultAndMoveToStart({\n force: true,\n });\n }\n\n this.importModalState.close();\n }\n\n private async _restoreBackup() {\n const restoreFn = this.restoreFn;\n if (!restoreFn) {\n return;\n }\n\n const restoreController = new AbortController();\n this._abortController = restoreController;\n\n this.isRestoring = true;\n try {\n await restoreFn(restoreController.signal);\n } catch (error) {\n console.error('Restore failed', error);\n }\n runInAction(() => {\n this.isRestoring = false;\n this.restoreFn = null;\n });\n }\n\n goToUpload() {\n this.currentStep = 'upload';\n }\n\n async discardAndGoBack() {\n this.discardChangesModal.open('goBack');\n const { result } = await this.discardChangesModal.modal.promise();\n if (result === 'confirmed') {\n this.goToUpload();\n }\n }\n\n async discardAndClose() {\n this.discardChangesModal.open('close');\n const { result } = await this.discardChangesModal.modal.promise();\n if (result === 'confirmed') {\n this.close();\n }\n }\n\n onUploadContinue() {\n if (this.hasParsedRows) {\n this.currentStep = 'configuration';\n }\n }\n\n private getDefaultMapping(headers: string[]) {\n const mapping: Record<string, ColumnMapping> = {};\n const fields = this.fields.map((field) => ({\n id: field.id ?? '',\n header: field.header ?? '',\n }));\n\n headers.forEach((header, index) => {\n const normalizedHeader = normalize(header);\n const matched = fields.find(\n (field) =>\n normalize(field.id) === normalizedHeader ||\n normalize(field.header) === normalizedHeader,\n );\n\n if (matched?.id) {\n mapping[header] = { kind: 'existing', fieldId: matched.id };\n } else {\n // Unmatched columns default to creating a new field (type inferred from\n // the column's data) when the consumer supplied `updateSchema`;\n // otherwise they default to skip.\n mapping[header] = this.canCreateNewField\n ? {\n kind: 'new',\n fieldType: this._detectColumnType(this._columnValues(index)),\n }\n : null;\n }\n });\n\n return mapping;\n }\n\n // The column's values, capped at the detection sample size — detection only\n // looks at the first `TYPE_SAMPLE_SIZE` values, so avoid copying the whole\n // column (a wide CSV would otherwise allocate rows × columns strings).\n private _columnValues(columnIndex: number): string[] {\n return this.csvRows\n .slice(0, TYPE_SAMPLE_SIZE)\n .map((row) => row[columnIndex] ?? '');\n }\n\n // Puts the `_id`-mapped column first (CAIRO-4418), preserving CSV order for the\n // rest. Returns a fresh array so the snapshot doesn't alias `csvHeaders`.\n private _orderHeadersWithIdFirst(headers: string[]): string[] {\n const idHeader = this.idMappedHeader;\n return idHeader != null\n ? [idHeader, ...headers.filter((header) => header !== idHeader)]\n : [...headers];\n }\n\n private applyParsedCsv(fileName: string, parsedCsv: ParseCsvResult) {\n this.fileName = fileName;\n this.csvHeaders = parsedCsv.headers;\n this.csvRows = parsedCsv.rows;\n this.mappingByHeader = this.getDefaultMapping(parsedCsv.headers);\n // Snapshot the row order for this file with the auto-mapped `_id` column\n // first. Reads `idMappedHeader`, so it must run after `mappingByHeader` is\n // set. Kept stable until the next file so mapping edits don't reorder rows.\n this.orderedHeaders = this._orderHeadersWithIdFirst(parsedCsv.headers);\n // A new file is a fresh import: start from the default policy so a prior\n // file's Skip choice doesn't silently carry over (only the new-file path\n // resets — remapping `_id` within the same file keeps the user's choice).\n this.writePolicy = WritePolicy.OVERWRITE;\n this.currentStep = 'configuration';\n }\n\n async onFileSelected(file: File | null) {\n if (file == null) {\n return;\n }\n\n const bytes = await this._readFileBytes(file);\n if (bytes == null) {\n this._showFileReadErrorToast(file);\n return;\n }\n\n const content = this._decodeUtf8(bytes);\n if (content == null) {\n this._rejectFile(file, 'cairo.import.encodingFailed');\n return;\n }\n\n const parsedCsv = parseCsv(content);\n if ('code' in parsedCsv) {\n this._rejectFile(file, 'cairo.import.processFailed');\n return;\n }\n\n runInAction(() => {\n this.applyParsedCsv(file.name, parsedCsv);\n });\n }\n\n private async _readFileBytes(file: File): Promise<ArrayBuffer | null> {\n try {\n return await file.arrayBuffer();\n } catch (e) {\n console.error(e);\n return null;\n }\n }\n\n private _decodeUtf8(bytes: ArrayBuffer): string | null {\n try {\n // `fatal: true` throws on any byte sequence that isn't valid UTF-8,\n // so encoding is validated against the raw bytes before decoding —\n // unlike `File.text()`, which silently substitutes U+FFFD.\n return new TextDecoder('utf-8', { fatal: true }).decode(bytes);\n } catch (e) {\n console.error(e);\n return null;\n }\n }\n\n private _rejectFile(file: File, messageKey: TranslationsKeys) {\n runInAction(() => {\n this.fileName = file.name;\n this.csvHeaders = [];\n this.csvRows = [];\n this.orderedHeaders = [];\n this.mappingByHeader = {};\n this.currentStep = 'upload';\n });\n this.showToast?.({\n type: 'ERROR',\n message: this.translate(messageKey),\n });\n }\n\n private _showFileReadErrorToast(file: File) {\n this.showToast?.({\n type: 'ERROR',\n message: this.translate('cairo.import.fileReadFailed'),\n action: {\n text: this.translate('cairo.import.tryAgain'),\n onClick: () => this.onFileSelected(file),\n removeToastOnClick: true,\n },\n });\n }\n\n private _showPartialSuccessToast() {\n this.showToast?.({\n type: 'WARNING',\n message: this.translate('cairo.import.partialSuccessToast', {\n failed: String(this.result.failed),\n imported: String(this.result.succeeded),\n }),\n action: {\n text: this.translate('cairo.import.downloadFailedRows'),\n onClick: () => this._downloadFailedRows(),\n removeToastOnClick: true,\n },\n });\n }\n\n /**\n * Builds a plain, re-importable CSV of the rows the server rejected — the\n * original headers plus just the failed rows — and hands it to `downloadCsv`.\n * The failed rows come from the job's movement logs (which row failed), mapped\n * back to the parsed `csvRows` we still hold in memory.\n */\n private async _downloadFailedRows() {\n const jobId = this._jobId;\n if (!jobId) {\n return;\n }\n\n let indices: number[];\n try {\n indices = await this._fetchFailedRowIndices(jobId);\n } catch (error) {\n console.error('Fetching failed rows report failed', error);\n return;\n }\n\n const failedRows = indices\n .map((index) => this.csvRows[index])\n .filter((row): row is string[] => row != null);\n\n if (failedRows.length === 0) {\n return;\n }\n\n const content = unparseCsv(this.csvHeaders, failedRows);\n this.downloadCsv?.(content, `failed-${this.fileName || 'import.csv'}`);\n }\n\n // Pages through the job's movement logs and returns the `csvRows` indices of\n // the rows that failed. data-hub's CSV decoder\n // (wix-data-hub: packages/wix-data-hub-executor-c/src/plugins/formats/csv/\n // csv-binary-decoder.ts) parses with the `csv-parse` library (`columns: true`)\n // and sets `sourceItemId = \"row ${++index + 1}\"`, incrementing once **per\n // record** — not per physical line. So N is the 1-based record number with\n // the header consumed as columns: the first data record is `\"row 2\"` →\n // `csvRows[0]`, i.e. `csvRows[N - 2]`. Because `csv-parse` is RFC-4180,\n // quoted cells containing embedded newlines are a single record, so they do\n // NOT shift the numbering. Out-of-range indices are guarded below.\n private async _fetchFailedRowIndices(jobId: string): Promise<number[]> {\n const indices: number[] = [];\n let cursor: string | undefined;\n\n do {\n const { logs, pagingMetadata } = await this.hubJobClient.listMovementLogs(\n jobId,\n cursor ? { cursor } : undefined,\n );\n\n for (const log of logs ?? []) {\n if (!log.failure || log.sourceItemId == null) {\n continue;\n }\n const fileLine = Number(/\\d+/.exec(log.sourceItemId)?.[0]);\n const index = fileLine - 2;\n if (\n Number.isInteger(index) &&\n index >= 0 &&\n index < this.csvRows.length\n ) {\n indices.push(index);\n }\n }\n\n cursor =\n (pagingMetadata?.hasNext && pagingMetadata.cursors?.next) || undefined;\n } while (cursor);\n\n return indices;\n }\n\n setMapping(header: string, fieldId: string | null) {\n this.mappingByHeader = {\n ...this.mappingByHeader,\n [header]: fieldId == null ? null : { kind: 'existing', fieldId },\n };\n }\n\n setNewFieldMapping(header: string) {\n const index = this.csvHeaders.indexOf(header);\n const fieldType =\n index >= 0 ? this._detectColumnType(this._columnValues(index)) : 'text';\n this.mappingByHeader = {\n ...this.mappingByHeader,\n [header]: { kind: 'new', fieldType },\n };\n }\n\n /**\n * Persists the result of the \"Edit field\" editor for a column's pending new\n * field: the (possibly overridden) type, an optional display-name override,\n * and the per-type configuration. No-op if the column isn't currently mapped\n * to a new field.\n */\n setNewFieldConfig(\n header: string,\n edit: {\n fieldType: NewFieldType;\n displayName?: string;\n config?: NewFieldConfig;\n },\n ) {\n const mapping = this.mappingByHeader[header];\n if (mapping?.kind !== 'new') {\n return;\n }\n this.mappingByHeader = {\n ...this.mappingByHeader,\n [header]: {\n kind: 'new',\n fieldType: edit.fieldType,\n ...(edit.displayName != null && { displayName: edit.displayName }),\n ...(edit.config && { config: edit.config }),\n },\n };\n }\n\n /**\n * Marks which column's pending new field the field editor is currently\n * editing, so a later `applyFieldEdit` (the editor's `onSubmit`) knows where to\n * write the result.\n */\n beginFieldEdit(header: string) {\n this._editingHeader = header;\n }\n\n /**\n * `onSubmit` handler for the field editor: maps the edited field spec into the\n * column being edited (set via `beginFieldEdit`). No-op if nothing is being\n * edited.\n */\n applyFieldEdit(field: FieldSpec) {\n if (this._editingHeader == null) {\n return;\n }\n this.setNewFieldConfig(this._editingHeader, toFieldEdit(field));\n }\n\n /**\n * Runs the server-side import: align the CSV to the resolved field keys,\n * upload it, submit a data-movement job, then poll until terminal. Throws on\n * a failed job so `startImport` surfaces the error state; partial success is\n * reported via `result.failed` and the partial toast.\n */\n private async _runImportJob(\n resolvedMapping: Record<string, string | null>,\n ): Promise<ImportResult> {\n const csv = rewriteParsedCsvForImport(\n this.csvHeaders,\n this.csvRows,\n resolvedMapping,\n );\n const file = new File([csv], this.fileName || 'import.csv', {\n type: 'text/csv',\n });\n\n const fileId = await this.hubJobClient.uploadFile(file);\n if (this._cancelled) {\n return this.result;\n }\n\n const jobId = await this.hubJobClient.submitImportJob({\n fileId,\n name: this.fileName,\n destination: this._destination(),\n });\n runInAction(() => {\n this._jobId = jobId;\n });\n if (this._cancelled) {\n // The user cancelled while `submitImportJob` was in flight, so `close()`\n // saw no `_jobId` and couldn't terminate it. Terminate it here, otherwise\n // the job keeps importing server-side after cancel (and would overwrite a\n // restored backup).\n await this.hubJobClient.terminateJob(jobId).catch(() => undefined);\n return this.result;\n }\n\n const job = await pollImportJob(\n (id) => this.hubJobClient.getJob(id),\n jobId,\n {\n isCancelled: () => this._cancelled,\n onProgress: (polled) => this._applyJobProgress(polled),\n },\n );\n\n // `null` means cancelled mid-poll — leave whatever progress we have.\n if (!job) {\n return this.result;\n }\n\n if (job.status === JobStatus.FAILED) {\n // The job ran server-side, so a failure arrives on a 200 (the poll\n // succeeded; the job didn't) with no HTTP error to carry the application\n // error. Build a synthetic, HTTP-error-shaped error (the error handler\n // reads the code from `response.data.details.applicationError`) and hand\n // the throwing operation to the consumer's `onJobError` so THEY wrap it\n // with their own `withErrorHandler` + error-code map — `job.error` is the\n // consumer's application error (their import business logic), so only they\n // can map its codes, and the map stays coupled to the `withErrorHandler`\n // call as everywhere else (e.g. `fetchData`). The map is attached to the\n // error object, which the progress step resolves via `getResolvedError`.\n // Without a handler the same error still throws, falling back to the\n // generic message.\n const error = Object.assign(\n new Error(`ImportJob.${job.error?.code ?? 'failed'}`),\n { response: { data: { details: { applicationError: job.error } } } },\n );\n const run = (): Promise<unknown> => Promise.reject(error);\n\n if (this.onJobError) {\n // The consumer wraps `run` with `withErrorHandler`; it re-rejects with\n // `error` (now carrying their map), which propagates from here.\n await this.onJobError(run);\n }\n throw error;\n }\n\n this._applyJobProgress(job);\n return this.result;\n }\n\n // Destination: the consumer's Wix Data collection. `writePolicy` is sent only\n // when a CSV column is mapped to `_id` (the only case collisions can occur);\n // otherwise it's omitted and the server applies its default (upsert by `_id`).\n private _destination(): Destination {\n return {\n wixDataCollection: {\n collectionId: this.collectionId,\n ...(this.idMappedHeader != null && { writePolicy: this.writePolicy }),\n },\n };\n }\n\n private _applyJobProgress(job: DataMovementJob) {\n const progress = job.progress;\n const succeeded = progress?.itemsSuccessful ?? 0;\n const failed = progress?.itemsRejected ?? 0;\n const current = progress?.current ?? succeeded + failed;\n\n // `totalCount` is fixed up front in `startImport` from the CSV row count\n // (one uploaded row per CSV row); polling only advances `processedCount`.\n runInAction(() => {\n this.processedCount = Math.min(current, this.totalCount);\n this.result = { succeeded, failed };\n });\n }\n\n private async _runBackup(): Promise<boolean> {\n const backup = this.backup;\n if (!backup) {\n return false;\n }\n\n try {\n const result = await backup(this._abortController!.signal);\n if (this._cancelled) {\n return true;\n }\n if (result?.restore) {\n this.restoreFn = result.restore;\n }\n } catch (error) {\n if (this._cancelled) {\n return true;\n }\n runInAction(() => {\n this.isBackingUp = false;\n this.importStatus = {\n ...queryStatus.error,\n error,\n };\n });\n return true;\n }\n\n runInAction(() => {\n this.isBackingUp = false;\n });\n return false;\n }\n\n private _lingerOnCompletion() {\n return new Promise<void>((resolve) =>\n setTimeout(resolve, COMPLETION_LINGER_MS),\n );\n }\n\n /**\n * Resolves every column to the final destination key used in the upload\n * payload: an existing field id, a new field's (Cairo-decided) key, or `null`\n * to skip. All new fields are added to the schema in a single `updateSchema`\n * call before the rows upload — mirroring the cm-import `beforeImport` flow.\n * `updateSchema` may throw — `startImport` surfaces that as the error state.\n */\n private async _resolveFieldMapping(): Promise<Record<string, string | null>> {\n const resolved: Record<string, string | null> = {};\n const newFields: NewFieldDefinition[] = [];\n // Seed with existing field ids/display names so derived keys and names never\n // collide with them or with each other.\n const usedKeys = new Set(\n this.fields.map((field) => field.id).filter((id): id is string => !!id),\n );\n const usedNames = new Set(\n this.fields\n .map((field) => field.header)\n .filter((header): header is string => !!header),\n );\n\n for (const header of this.csvHeaders) {\n const mapping = this.mappingByHeader[header];\n\n if (mapping == null) {\n resolved[header] = null;\n } else if (mapping.kind === 'existing') {\n resolved[header] = mapping.fieldId;\n } else if (this.updateSchema) {\n // The user's name override (from the field editor) seeds the unique\n // name/key derivation; otherwise fall back to the column header.\n const baseName = mapping.displayName?.trim() || header;\n const { displayName, key } = uniqueFieldNameAndKey(\n baseName,\n usedNames,\n usedKeys,\n );\n usedKeys.add(key);\n usedNames.add(displayName);\n newFields.push({\n key,\n type: mapping.fieldType,\n displayName,\n ...(mapping.config && { config: mapping.config }),\n });\n resolved[header] = key;\n } else {\n // \"new\" mapping without an `updateSchema` callback — nothing to map into.\n resolved[header] = null;\n }\n }\n\n if (newFields.length > 0 && this.updateSchema) {\n await this.updateSchema(newFields);\n }\n\n return resolved;\n }\n\n async startImport() {\n if (!this.hasMappings) {\n return;\n }\n\n this._cancelled = false;\n this._abortController = new AbortController();\n\n // One uploaded row per CSV row (the rewrite drops columns, not rows), so the\n // total is known up front from the parsed CSV and stays fixed through polling.\n const totalCount = this.csvRows.length;\n\n runInAction(() => {\n this.currentStep = 'progress';\n this.totalCount = totalCount;\n this.processedCount = 0;\n this.isBackingUp = !!this.backup;\n // Clear any error/result from a previous attempt so \"Try again\" starts\n // from a clean slate (e.g. after a backup failure).\n this.importStatus = { ...queryStatus.idle };\n this.result = {\n succeeded: 0,\n failed: 0,\n };\n this._jobId = null;\n });\n\n const backupFailed = await this._runBackup();\n if (backupFailed) {\n return;\n }\n if (this._cancelled) {\n return;\n }\n\n // Create any new fields and resolve every column to its destination key\n // before uploading. A creation failure surfaces as the error state with a\n // \"Try again\" CTA, like an upload/job failure.\n let resolvedMapping: Record<string, string | null>;\n try {\n resolvedMapping = await this._resolveFieldMapping();\n } catch (error) {\n runInAction(() => {\n this.importStatus = {\n ...queryStatus.error,\n error,\n };\n });\n return;\n }\n if (this._cancelled) {\n return;\n }\n\n const promise = this._runImportJob(resolvedMapping);\n\n this.importStatus = {\n ...queryStatus.loading,\n promise,\n };\n\n try {\n await promise;\n if (this._cancelled) {\n return;\n }\n\n runInAction(() => {\n this.importStatus = {\n ...queryStatus.success,\n data: this.result,\n };\n });\n\n // On a clean import, hold the completed (100%) progress bar on screen\n // briefly so the completion is perceptible even for very few rows. Skip\n // the wait when there are failed rows — that path closes and surfaces a\n // toast instead.\n if (this.result.failed === 0) {\n await this._lingerOnCompletion();\n if (this._cancelled) {\n return;\n }\n }\n\n runInAction(() => {\n // Rows the server rejected are reported via a toast (the downloadable\n // failed-rows report is added by the failed-rows-report task).\n if (this.result.failed > 0) {\n this._showPartialSuccessToast();\n }\n\n this.importModalState.close();\n this.collection.clearResultAndMoveToStart({ force: true });\n });\n } catch (error) {\n runInAction(() => {\n this.importStatus = {\n ...queryStatus.error,\n error,\n };\n });\n }\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -533,4 +533,78 @@ describe('ImportState writePolicy (id-collision handling)', () => {
|
|
|
533
533
|
}));
|
|
534
534
|
});
|
|
535
535
|
});
|
|
536
|
+
describe('ImportState orderedHeaders (row order stability)', () => {
|
|
537
|
+
beforeEach(() => {
|
|
538
|
+
jest.useRealTimers();
|
|
539
|
+
});
|
|
540
|
+
|
|
541
|
+
// Parse a CSV whose `ID` column auto-maps to `_id` (a field with that id
|
|
542
|
+
// exists), so the `_id` row floats to the top of the ordered list.
|
|
543
|
+
async function parseWithIdColumn(state) {
|
|
544
|
+
const csv = 'Name,ID,Handle\nApple,id-1,a\nPear,id-2,p\n';
|
|
545
|
+
const file = {
|
|
546
|
+
name: 'data.csv',
|
|
547
|
+
arrayBuffer: async () => new _util.TextEncoder().encode(csv).buffer
|
|
548
|
+
};
|
|
549
|
+
await state.onFileSelected(file);
|
|
550
|
+
}
|
|
551
|
+
it('floats the `_id`-mapped column to the top for a freshly parsed file', async () => {
|
|
552
|
+
const {
|
|
553
|
+
state
|
|
554
|
+
} = setup({}, {
|
|
555
|
+
fields: [{
|
|
556
|
+
id: '_id',
|
|
557
|
+
header: 'ID'
|
|
558
|
+
}]
|
|
559
|
+
});
|
|
560
|
+
await parseWithIdColumn(state);
|
|
561
|
+
expect(state.idMappedHeader).toBe('ID');
|
|
562
|
+
expect(state.orderedHeaders).toEqual(['ID', 'Name', 'Handle']);
|
|
563
|
+
});
|
|
564
|
+
it('keeps row order stable when the `_id` mapping is cleared and re-added', async () => {
|
|
565
|
+
const {
|
|
566
|
+
state
|
|
567
|
+
} = setup({}, {
|
|
568
|
+
fields: [{
|
|
569
|
+
id: '_id',
|
|
570
|
+
header: 'ID'
|
|
571
|
+
}]
|
|
572
|
+
});
|
|
573
|
+
await parseWithIdColumn(state);
|
|
574
|
+
|
|
575
|
+
// Clearing the `_id` dropdown must not reorder the row under the cursor:
|
|
576
|
+
// the snapshot stays fixed even though `idMappedHeader` becomes null.
|
|
577
|
+
state.setMapping('ID', null);
|
|
578
|
+
expect(state.idMappedHeader).toBeNull();
|
|
579
|
+
expect(state.orderedHeaders).toEqual(['ID', 'Name', 'Handle']);
|
|
580
|
+
|
|
581
|
+
// Re-mapping `_id` also leaves the order untouched.
|
|
582
|
+
state.setMapping('ID', '_id');
|
|
583
|
+
expect(state.idMappedHeader).toBe('ID');
|
|
584
|
+
expect(state.orderedHeaders).toEqual(['ID', 'Name', 'Handle']);
|
|
585
|
+
});
|
|
586
|
+
it('re-snapshots the order for a new file and clears it on reset', async () => {
|
|
587
|
+
const {
|
|
588
|
+
state
|
|
589
|
+
} = setup({}, {
|
|
590
|
+
fields: [{
|
|
591
|
+
id: '_id',
|
|
592
|
+
header: 'ID'
|
|
593
|
+
}]
|
|
594
|
+
});
|
|
595
|
+
await parseWithIdColumn(state);
|
|
596
|
+
expect(state.orderedHeaders).toEqual(['ID', 'Name', 'Handle']);
|
|
597
|
+
|
|
598
|
+
// A file with no `_id` column keeps plain CSV order.
|
|
599
|
+
const csv = 'First,Second\n1,2\n';
|
|
600
|
+
const file = {
|
|
601
|
+
name: 'other.csv',
|
|
602
|
+
arrayBuffer: async () => new _util.TextEncoder().encode(csv).buffer
|
|
603
|
+
};
|
|
604
|
+
await state.onFileSelected(file);
|
|
605
|
+
expect(state.orderedHeaders).toEqual(['First', 'Second']);
|
|
606
|
+
state.reset();
|
|
607
|
+
expect(state.orderedHeaders).toEqual([]);
|
|
608
|
+
});
|
|
609
|
+
});
|
|
536
610
|
//# sourceMappingURL=ImportState.engine.spec.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_util","require","_mobx","_ImportState","_types","_hubJobClient","globalScope","global","TextEncoder","TextDecoder","jest","mock","COMPLETED_JOB","id","status","JobStatus","COMPLETED","progress","itemsSuccessful","itemsRejected","total","current","setup","clientOverrides","extraProps","client","uploadFile","fn","_file","submitImportJob","getJob","terminateJob","undefined","listMovementLogs","createHubJobClient","mockReturnValue","importModalState","close","collection","clearResultAndMoveToStart","showToast","downloadCsv","translate","key","params","JSON","stringify","props","fields","header","collectionId","httpClient","request","errorHandler","withErrorHandler","state","ImportState","runInAction","fileName","csvHeaders","csvRows","mappingByHeader","Name","kind","fieldId","describe","beforeEach","useRealTimers","it","startImport","expect","toHaveBeenCalledTimes","calls","toBeInstanceOf","File","toHaveBeenCalledWith","fileId","name","destination","wixDataCollection","result","toEqual","succeeded","failed","importStatus","toBe","toHaveBeenCalled","force","PARTIALLY_SUCCESSFUL","objectContaining","type","logs","sourceItemId","failure","code","description","pagingMetadata","hasNext","Notes","toast","action","onClick","content","toContain","not","_error$response","FAILED","error","response","data","details","applicationError","_error$response2","onJobError","run","mockImplementation","IN_PROGRESS","dispose","init","restoreFn","mockResolvedValue","backup","restore","flush","Promise","resolve","setTimeout","promise","isSuccess","currentStep","seedIdMapping","ID","idMappedHeader","toBeNull","writePolicy","WritePolicy","OVERWRITE","setWritePolicy","SKIP_EXISTING","reset","csv","file","arrayBuffer","encode","buffer","onFileSelected","setMapping"],"sources":["../../../../../src/state/ImportState/__tests__/ImportState.engine.spec.ts"],"sourcesContent":["import { TextDecoder, TextEncoder } from 'util';\nimport { runInAction } from 'mobx';\n\n// The jsdom test env doesn't expose these globals, but `onFileSelected` decodes\n// the uploaded bytes with `TextDecoder` (and the test encodes CSV with\n// `TextEncoder`). Polyfill from Node's `util`.\nconst globalScope = global as unknown as {\n TextEncoder: typeof TextEncoder;\n TextDecoder: typeof TextDecoder;\n};\nglobalScope.TextEncoder = globalScope.TextEncoder ?? TextEncoder;\nglobalScope.TextDecoder = globalScope.TextDecoder ?? TextDecoder;\nimport {\n ImportState,\n ImportStateProps,\n ImportCollection,\n} from '../ImportState';\nimport {\n JobStatus,\n WritePolicy,\n type DataMovementJob,\n} from '@wix/bex-utils/@wix/ambassador-hub-v1-job/types';\nimport { createHubJobClient, HubJobClient } from '../hubJobClient';\n\njest.mock('../hubJobClient');\n\nconst COMPLETED_JOB: DataMovementJob = {\n id: 'job-1',\n status: JobStatus.COMPLETED,\n progress: { itemsSuccessful: 2, itemsRejected: 0, total: 2, current: 2 },\n};\n\nfunction setup(\n clientOverrides: Record<string, jest.Mock> = {},\n extraProps: Partial<ImportStateProps> = {},\n) {\n const client = {\n uploadFile: jest.fn(async (_file: File) => 'file-1'),\n submitImportJob: jest.fn(async () => 'job-1'),\n getJob: jest.fn(async () => COMPLETED_JOB),\n terminateJob: jest.fn(async () => undefined),\n listMovementLogs: jest.fn(),\n ...clientOverrides,\n };\n (createHubJobClient as jest.Mock).mockReturnValue(\n client as unknown as HubJobClient,\n );\n\n const importModalState = { close: jest.fn() };\n const collection: ImportCollection = {\n clearResultAndMoveToStart: jest.fn(),\n };\n const showToast = jest.fn();\n const downloadCsv = jest.fn();\n const translate = (key: string, params?: Record<string, string>) =>\n params ? `${key}:${JSON.stringify(params)}` : key;\n\n const props: ImportStateProps = {\n fields: [{ id: 'name', header: 'Name' }],\n collectionId: 'Movies',\n httpClient: {\n request: jest.fn(),\n } as unknown as ImportStateProps['httpClient'],\n collection,\n importModalState:\n importModalState as unknown as ImportStateProps['importModalState'],\n translate: translate as unknown as ImportStateProps['translate'],\n errorHandler: {\n withErrorHandler: (fn: () => unknown) => fn(),\n } as unknown as ImportStateProps['errorHandler'],\n showToast: showToast as unknown as ImportStateProps['showToast'],\n downloadCsv,\n ...extraProps,\n };\n\n const state = new ImportState(props);\n\n // Seed a parsed CSV mapped to an existing field.\n runInAction(() => {\n state.fileName = 'data.csv';\n state.csvHeaders = ['Name'];\n state.csvRows = [['Apple'], ['Pear']];\n state.mappingByHeader = { Name: { kind: 'existing', fieldId: 'name' } };\n });\n\n return {\n state,\n client,\n importModalState,\n collection,\n showToast,\n downloadCsv,\n };\n}\n\ndescribe('ImportState engine (data-hub job)', () => {\n beforeEach(() => {\n // The success path awaits a real setTimeout (completion linger); make sure\n // timers are real even if the preset defaults to fake ones.\n jest.useRealTimers();\n });\n\n it('uploads the aligned file, submits a job, and reports success', async () => {\n const { state, client, importModalState, collection } = setup();\n\n await state.startImport();\n\n expect(client.uploadFile).toHaveBeenCalledTimes(1);\n expect(client.uploadFile.mock.calls[0][0]).toBeInstanceOf(File);\n\n expect(client.submitImportJob).toHaveBeenCalledWith({\n fileId: 'file-1',\n name: 'data.csv',\n destination: { wixDataCollection: { collectionId: 'Movies' } },\n });\n\n expect(state.result).toEqual({ succeeded: 2, failed: 0 });\n expect(state.importStatus.status).toBe('success');\n expect(importModalState.close).toHaveBeenCalled();\n expect(collection.clearResultAndMoveToStart).toHaveBeenCalledWith({\n force: true,\n });\n });\n\n it('shows a partial-success toast when some rows are rejected', async () => {\n const { state, showToast, importModalState } = setup({\n getJob: jest.fn(\n async () =>\n ({\n id: 'job-1',\n status: JobStatus.PARTIALLY_SUCCESSFUL,\n progress: {\n itemsSuccessful: 1,\n itemsRejected: 1,\n total: 2,\n current: 2,\n },\n } as DataMovementJob),\n ),\n });\n\n await state.startImport();\n\n expect(state.result).toEqual({ succeeded: 1, failed: 1 });\n expect(showToast).toHaveBeenCalledWith(\n expect.objectContaining({ type: 'WARNING' }),\n );\n expect(importModalState.close).toHaveBeenCalled();\n });\n\n it('maps the failed \"row N\" by record (unaffected by an embedded-newline cell)', async () => {\n const { state, downloadCsv, showToast } = setup({\n getJob: jest.fn(\n async () =>\n ({\n id: 'job-1',\n status: JobStatus.PARTIALLY_SUCCESSFUL,\n progress: { itemsSuccessful: 2, itemsRejected: 1 },\n } as DataMovementJob),\n ),\n // data-hub numbers records (csv-parse, RFC-4180): the 3rd data record is\n // \"row 4\" regardless of the multi-line cell in the 1st record.\n listMovementLogs: jest.fn(async () => ({\n logs: [\n { sourceItemId: 'row 4', failure: { code: 'x', description: 'y' } },\n ],\n pagingMetadata: { hasNext: false },\n })),\n });\n\n // Row 0 has a quoted embedded newline; the failed record is row 2 (Mango).\n runInAction(() => {\n state.fileName = 'data.csv';\n state.csvHeaders = ['Name', 'Notes'];\n state.csvRows = [\n ['Apple', 'line1\\nline2'],\n ['Pear', 'ok'],\n ['Mango', 'bad'],\n ];\n state.mappingByHeader = {\n Name: { kind: 'existing', fieldId: 'name' },\n Notes: { kind: 'existing', fieldId: 'notes' },\n };\n });\n\n await state.startImport();\n const toast = showToast.mock.calls[0][0];\n await toast.action.onClick();\n\n // \"row 4\" → csvRows[2] (Mango), NOT shifted by the embedded newline in row 0.\n const [content] = downloadCsv.mock.calls[0];\n expect(content).toContain('Mango');\n expect(content).not.toContain('Apple');\n });\n\n it('downloads a re-importable CSV of the failed rows from the partial toast action', async () => {\n const { state, client, showToast, downloadCsv } = setup({\n getJob: jest.fn(\n async () =>\n ({\n id: 'job-1',\n status: JobStatus.PARTIALLY_SUCCESSFUL,\n progress: { itemsSuccessful: 1, itemsRejected: 1 },\n } as DataMovementJob),\n ),\n // csvRows[1] (the \"Pear\" row) failed → file line 3 → \"row 3\".\n listMovementLogs: jest.fn(async () => ({\n logs: [\n { sourceItemId: 'row 3', failure: { code: 'bad', description: 'x' } },\n ],\n pagingMetadata: { hasNext: false },\n })),\n });\n\n await state.startImport();\n\n // Trigger the toast's download action.\n const toast = showToast.mock.calls[0][0];\n await toast.action.onClick();\n\n expect(client.listMovementLogs).toHaveBeenCalledWith('job-1', undefined);\n // Original headers + only the failed row, ready to fix and re-upload.\n expect(downloadCsv).toHaveBeenCalledWith('Name\\r\\nPear', 'failed-data.csv');\n });\n\n it('surfaces an error state with an application-error-shaped error when the job fails', async () => {\n const { state, importModalState, collection } = setup({\n getJob: jest.fn(\n async () =>\n ({\n id: 'job-1',\n status: JobStatus.FAILED,\n error: { code: 'import_failed', description: 'Bad rows' },\n } as DataMovementJob),\n ),\n });\n\n await state.startImport();\n\n expect(state.importStatus.status).toBe('error');\n // HTTP-error-shaped so the UI resolves the message via\n // errorHandler.getResolvedError rather than reading the raw server string.\n // The handler reads the code from `response.data.details.applicationError`.\n const error = state.importStatus.error as {\n response?: {\n data?: { details?: { applicationError?: { code?: string } } };\n };\n };\n expect(error.response?.data?.details?.applicationError?.code).toBe(\n 'import_failed',\n );\n expect(importModalState.close).not.toHaveBeenCalled();\n expect(collection.clearResultAndMoveToStart).not.toHaveBeenCalled();\n });\n\n it('hands a failed job to onJobError, which surfaces the wrapped error', async () => {\n // Wiring only: the consumer forwards `run` to their withErrorHandler exactly\n // as documented, and the error it re-rejects is the one surfaced to the UI\n // (with the application-error-shaped code intact). End-to-end resolution\n // against the real error handler is covered in the cairo\n // Table.importButton spec, which has a real errorHandler instance.\n // Mirror `(run) => errorHandler.withErrorHandler(run, errorCodesMap)`;\n // a passthrough stub, so this just runs `run` and re-rejects.\n const withErrorHandler = (fn: () => Promise<unknown>) => fn();\n const onJobError = jest.fn((run: () => Promise<unknown>) =>\n withErrorHandler(run),\n );\n\n const { state } = setup(\n {\n getJob: jest.fn(\n async () =>\n ({\n id: 'job-1',\n status: JobStatus.FAILED,\n error: { code: 'duplicate_key', description: 'Bad rows' },\n } as DataMovementJob),\n ),\n },\n { onJobError },\n );\n\n await state.startImport();\n\n expect(onJobError).toHaveBeenCalledTimes(1);\n expect(typeof onJobError.mock.calls[0][0]).toBe('function');\n expect(state.importStatus.status).toBe('error');\n const error = state.importStatus.error as {\n response?: {\n data?: { details?: { applicationError?: { code?: string } } };\n };\n };\n expect(error.response?.data?.details?.applicationError?.code).toBe(\n 'duplicate_key',\n );\n });\n\n it('terminates the job when closed mid-import', async () => {\n const { state, client, importModalState } = setup();\n // Cancel during the first poll, before the job is terminal.\n client.getJob.mockImplementation(async () => {\n await state.close();\n return { id: 'job-1', status: JobStatus.IN_PROGRESS };\n });\n\n await state.startImport();\n\n expect(client.terminateJob).toHaveBeenCalledWith('job-1');\n expect(importModalState.close).toHaveBeenCalled();\n });\n\n it('terminates the job when cancelled while submitImportJob is in flight', async () => {\n const { state, client } = setup();\n // The user cancels while submit is still in flight: close() runs before\n // _jobId is set (so it can't terminate), then submit resolves.\n client.submitImportJob.mockImplementation(async () => {\n await state.close();\n return 'job-1';\n });\n\n await state.startImport();\n\n // The late-cancel path must terminate the orphaned job, and polling never starts.\n expect(client.terminateJob).toHaveBeenCalledWith('job-1');\n expect(client.getJob).not.toHaveBeenCalled();\n });\n\n it('aborts the poll loop when disposed (unmounted) mid-import', async () => {\n const { state, client } = setup();\n const dispose = state.init();\n // Simulate the component unmounting during the first poll.\n client.getJob.mockImplementation(async () => {\n dispose();\n return { id: 'job-1', status: JobStatus.IN_PROGRESS };\n });\n\n await state.startImport();\n\n // Without the disposer the loop would keep polling the IN_PROGRESS job\n // forever; it must stop after the first fetch.\n expect(client.getJob).toHaveBeenCalledTimes(1);\n });\n\n it('does not restore when closed during the success completion linger', async () => {\n const restoreFn = jest.fn().mockResolvedValue(undefined);\n const { state, importModalState, collection } = setup(\n {},\n { backup: async () => ({ restore: restoreFn }) },\n );\n\n // A 0ms macrotask drains the pending async chain without firing the 600ms\n // linger timer.\n const flush = () => new Promise((resolve) => setTimeout(resolve, 0));\n\n const promise = state.startImport();\n // Run backup → upload → submit → poll (terminal) → success, parking on the\n // 600ms completion linger (still on the 'progress' step) without firing it.\n await flush();\n await flush();\n await flush();\n\n expect(state.importStatus.isSuccess).toBe(true);\n expect(state.currentStep).toBe('progress');\n\n // User closes the modal mid-linger.\n await state.close();\n await promise;\n\n // A successful import must not be reverted; the modal closes and the\n // collection refreshes.\n expect(restoreFn).not.toHaveBeenCalled();\n expect(importModalState.close).toHaveBeenCalled();\n expect(collection.clearResultAndMoveToStart).toHaveBeenCalledWith({\n force: true,\n });\n });\n});\n\ndescribe('ImportState writePolicy (id-collision handling)', () => {\n beforeEach(() => {\n jest.useRealTimers();\n });\n\n // Seed a CSV column mapped to the `_id` field so collisions are possible.\n function seedIdMapping(state: ImportState) {\n runInAction(() => {\n state.fileName = 'data.csv';\n state.csvHeaders = ['ID', 'Name'];\n state.csvRows = [\n ['1', 'Apple'],\n ['2', 'Pear'],\n ];\n state.mappingByHeader = {\n ID: { kind: 'existing', fieldId: '_id' },\n Name: { kind: 'existing', fieldId: 'name' },\n };\n });\n }\n\n it('exposes the header mapped to `_id` via idMappedHeader', () => {\n const { state } = setup();\n expect(state.idMappedHeader).toBeNull();\n\n seedIdMapping(state);\n expect(state.idMappedHeader).toBe('ID');\n });\n\n it('omits writePolicy when no column is mapped to `_id`', async () => {\n const { state, client } = setup();\n\n await state.startImport();\n\n expect(client.submitImportJob).toHaveBeenCalledWith(\n expect.objectContaining({\n destination: { wixDataCollection: { collectionId: 'Movies' } },\n }),\n );\n });\n\n it('sends the default OVERWRITE policy when a column maps to `_id`', async () => {\n const { state, client } = setup();\n seedIdMapping(state);\n\n await state.startImport();\n\n expect(client.submitImportJob).toHaveBeenCalledWith(\n expect.objectContaining({\n destination: {\n wixDataCollection: {\n collectionId: 'Movies',\n writePolicy: WritePolicy.OVERWRITE,\n },\n },\n }),\n );\n });\n\n it('sends SKIP_EXISTING after the user switches the policy', async () => {\n const { state, client } = setup();\n seedIdMapping(state);\n state.setWritePolicy(WritePolicy.SKIP_EXISTING);\n\n await state.startImport();\n\n expect(client.submitImportJob).toHaveBeenCalledWith(\n expect.objectContaining({\n destination: {\n wixDataCollection: {\n collectionId: 'Movies',\n writePolicy: WritePolicy.SKIP_EXISTING,\n },\n },\n }),\n );\n });\n\n it('resets the policy back to OVERWRITE', () => {\n const { state } = setup();\n state.setWritePolicy(WritePolicy.SKIP_EXISTING);\n expect(state.writePolicy).toBe(WritePolicy.SKIP_EXISTING);\n\n state.reset();\n expect(state.writePolicy).toBe(WritePolicy.OVERWRITE);\n });\n\n it('resets the policy to OVERWRITE when a new file is uploaded mid-session', async () => {\n const { state } = setup();\n seedIdMapping(state);\n // The user switched to Skip for the first file.\n state.setWritePolicy(WritePolicy.SKIP_EXISTING);\n expect(state.writePolicy).toBe(WritePolicy.SKIP_EXISTING);\n\n // Uploading a different CSV in the same modal session must start from the\n // documented default — otherwise the prior Skip silently carries over and\n // rows with a colliding `_id` are skipped instead of updated.\n const csv = 'ID,Name\\nid-9,Zed\\n';\n const file = {\n name: 'file-b.csv',\n arrayBuffer: async () => new TextEncoder().encode(csv).buffer,\n } as unknown as File;\n await state.onFileSelected(file);\n\n expect(state.writePolicy).toBe(WritePolicy.OVERWRITE);\n });\n\n it('keeps the chosen policy when the `_id` mapping is removed and re-added', () => {\n const { state } = setup();\n seedIdMapping(state);\n state.setWritePolicy(WritePolicy.SKIP_EXISTING);\n\n // Remap the ID column away: the control hides and the destination drops\n // writePolicy, but the user's choice is intentionally retained (editing\n // mappings within a file never resets it — only a new file does).\n state.setMapping('ID', null);\n expect(state.idMappedHeader).toBeNull();\n expect(state.writePolicy).toBe(WritePolicy.SKIP_EXISTING);\n\n // Map `_id` again — the prior choice is still in effect.\n state.setMapping('ID', '_id');\n expect(state.idMappedHeader).toBe('ID');\n expect(state.writePolicy).toBe(WritePolicy.SKIP_EXISTING);\n });\n\n it('omits writePolicy when the `_id` column is remapped away mid-session', async () => {\n const { state, client } = setup();\n seedIdMapping(state);\n state.setWritePolicy(WritePolicy.SKIP_EXISTING);\n // No column maps to `_id` anymore → no collisions possible → omit it.\n state.setMapping('ID', null);\n\n await state.startImport();\n\n expect(client.submitImportJob).toHaveBeenCalledWith(\n expect.objectContaining({\n destination: { wixDataCollection: { collectionId: 'Movies' } },\n }),\n );\n });\n});\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":["_util","require","_mobx","_ImportState","_types","_hubJobClient","globalScope","global","TextEncoder","TextDecoder","jest","mock","COMPLETED_JOB","id","status","JobStatus","COMPLETED","progress","itemsSuccessful","itemsRejected","total","current","setup","clientOverrides","extraProps","client","uploadFile","fn","_file","submitImportJob","getJob","terminateJob","undefined","listMovementLogs","createHubJobClient","mockReturnValue","importModalState","close","collection","clearResultAndMoveToStart","showToast","downloadCsv","translate","key","params","JSON","stringify","props","fields","header","collectionId","httpClient","request","errorHandler","withErrorHandler","state","ImportState","runInAction","fileName","csvHeaders","csvRows","mappingByHeader","Name","kind","fieldId","describe","beforeEach","useRealTimers","it","startImport","expect","toHaveBeenCalledTimes","calls","toBeInstanceOf","File","toHaveBeenCalledWith","fileId","name","destination","wixDataCollection","result","toEqual","succeeded","failed","importStatus","toBe","toHaveBeenCalled","force","PARTIALLY_SUCCESSFUL","objectContaining","type","logs","sourceItemId","failure","code","description","pagingMetadata","hasNext","Notes","toast","action","onClick","content","toContain","not","_error$response","FAILED","error","response","data","details","applicationError","_error$response2","onJobError","run","mockImplementation","IN_PROGRESS","dispose","init","restoreFn","mockResolvedValue","backup","restore","flush","Promise","resolve","setTimeout","promise","isSuccess","currentStep","seedIdMapping","ID","idMappedHeader","toBeNull","writePolicy","WritePolicy","OVERWRITE","setWritePolicy","SKIP_EXISTING","reset","csv","file","arrayBuffer","encode","buffer","onFileSelected","setMapping","parseWithIdColumn","orderedHeaders"],"sources":["../../../../../src/state/ImportState/__tests__/ImportState.engine.spec.ts"],"sourcesContent":["import { TextDecoder, TextEncoder } from 'util';\nimport { runInAction } from 'mobx';\n\n// The jsdom test env doesn't expose these globals, but `onFileSelected` decodes\n// the uploaded bytes with `TextDecoder` (and the test encodes CSV with\n// `TextEncoder`). Polyfill from Node's `util`.\nconst globalScope = global as unknown as {\n TextEncoder: typeof TextEncoder;\n TextDecoder: typeof TextDecoder;\n};\nglobalScope.TextEncoder = globalScope.TextEncoder ?? TextEncoder;\nglobalScope.TextDecoder = globalScope.TextDecoder ?? TextDecoder;\nimport {\n ImportState,\n ImportStateProps,\n ImportCollection,\n} from '../ImportState';\nimport {\n JobStatus,\n WritePolicy,\n type DataMovementJob,\n} from '@wix/bex-utils/@wix/ambassador-hub-v1-job/types';\nimport { createHubJobClient, HubJobClient } from '../hubJobClient';\n\njest.mock('../hubJobClient');\n\nconst COMPLETED_JOB: DataMovementJob = {\n id: 'job-1',\n status: JobStatus.COMPLETED,\n progress: { itemsSuccessful: 2, itemsRejected: 0, total: 2, current: 2 },\n};\n\nfunction setup(\n clientOverrides: Record<string, jest.Mock> = {},\n extraProps: Partial<ImportStateProps> = {},\n) {\n const client = {\n uploadFile: jest.fn(async (_file: File) => 'file-1'),\n submitImportJob: jest.fn(async () => 'job-1'),\n getJob: jest.fn(async () => COMPLETED_JOB),\n terminateJob: jest.fn(async () => undefined),\n listMovementLogs: jest.fn(),\n ...clientOverrides,\n };\n (createHubJobClient as jest.Mock).mockReturnValue(\n client as unknown as HubJobClient,\n );\n\n const importModalState = { close: jest.fn() };\n const collection: ImportCollection = {\n clearResultAndMoveToStart: jest.fn(),\n };\n const showToast = jest.fn();\n const downloadCsv = jest.fn();\n const translate = (key: string, params?: Record<string, string>) =>\n params ? `${key}:${JSON.stringify(params)}` : key;\n\n const props: ImportStateProps = {\n fields: [{ id: 'name', header: 'Name' }],\n collectionId: 'Movies',\n httpClient: {\n request: jest.fn(),\n } as unknown as ImportStateProps['httpClient'],\n collection,\n importModalState:\n importModalState as unknown as ImportStateProps['importModalState'],\n translate: translate as unknown as ImportStateProps['translate'],\n errorHandler: {\n withErrorHandler: (fn: () => unknown) => fn(),\n } as unknown as ImportStateProps['errorHandler'],\n showToast: showToast as unknown as ImportStateProps['showToast'],\n downloadCsv,\n ...extraProps,\n };\n\n const state = new ImportState(props);\n\n // Seed a parsed CSV mapped to an existing field.\n runInAction(() => {\n state.fileName = 'data.csv';\n state.csvHeaders = ['Name'];\n state.csvRows = [['Apple'], ['Pear']];\n state.mappingByHeader = { Name: { kind: 'existing', fieldId: 'name' } };\n });\n\n return {\n state,\n client,\n importModalState,\n collection,\n showToast,\n downloadCsv,\n };\n}\n\ndescribe('ImportState engine (data-hub job)', () => {\n beforeEach(() => {\n // The success path awaits a real setTimeout (completion linger); make sure\n // timers are real even if the preset defaults to fake ones.\n jest.useRealTimers();\n });\n\n it('uploads the aligned file, submits a job, and reports success', async () => {\n const { state, client, importModalState, collection } = setup();\n\n await state.startImport();\n\n expect(client.uploadFile).toHaveBeenCalledTimes(1);\n expect(client.uploadFile.mock.calls[0][0]).toBeInstanceOf(File);\n\n expect(client.submitImportJob).toHaveBeenCalledWith({\n fileId: 'file-1',\n name: 'data.csv',\n destination: { wixDataCollection: { collectionId: 'Movies' } },\n });\n\n expect(state.result).toEqual({ succeeded: 2, failed: 0 });\n expect(state.importStatus.status).toBe('success');\n expect(importModalState.close).toHaveBeenCalled();\n expect(collection.clearResultAndMoveToStart).toHaveBeenCalledWith({\n force: true,\n });\n });\n\n it('shows a partial-success toast when some rows are rejected', async () => {\n const { state, showToast, importModalState } = setup({\n getJob: jest.fn(\n async () =>\n ({\n id: 'job-1',\n status: JobStatus.PARTIALLY_SUCCESSFUL,\n progress: {\n itemsSuccessful: 1,\n itemsRejected: 1,\n total: 2,\n current: 2,\n },\n } as DataMovementJob),\n ),\n });\n\n await state.startImport();\n\n expect(state.result).toEqual({ succeeded: 1, failed: 1 });\n expect(showToast).toHaveBeenCalledWith(\n expect.objectContaining({ type: 'WARNING' }),\n );\n expect(importModalState.close).toHaveBeenCalled();\n });\n\n it('maps the failed \"row N\" by record (unaffected by an embedded-newline cell)', async () => {\n const { state, downloadCsv, showToast } = setup({\n getJob: jest.fn(\n async () =>\n ({\n id: 'job-1',\n status: JobStatus.PARTIALLY_SUCCESSFUL,\n progress: { itemsSuccessful: 2, itemsRejected: 1 },\n } as DataMovementJob),\n ),\n // data-hub numbers records (csv-parse, RFC-4180): the 3rd data record is\n // \"row 4\" regardless of the multi-line cell in the 1st record.\n listMovementLogs: jest.fn(async () => ({\n logs: [\n { sourceItemId: 'row 4', failure: { code: 'x', description: 'y' } },\n ],\n pagingMetadata: { hasNext: false },\n })),\n });\n\n // Row 0 has a quoted embedded newline; the failed record is row 2 (Mango).\n runInAction(() => {\n state.fileName = 'data.csv';\n state.csvHeaders = ['Name', 'Notes'];\n state.csvRows = [\n ['Apple', 'line1\\nline2'],\n ['Pear', 'ok'],\n ['Mango', 'bad'],\n ];\n state.mappingByHeader = {\n Name: { kind: 'existing', fieldId: 'name' },\n Notes: { kind: 'existing', fieldId: 'notes' },\n };\n });\n\n await state.startImport();\n const toast = showToast.mock.calls[0][0];\n await toast.action.onClick();\n\n // \"row 4\" → csvRows[2] (Mango), NOT shifted by the embedded newline in row 0.\n const [content] = downloadCsv.mock.calls[0];\n expect(content).toContain('Mango');\n expect(content).not.toContain('Apple');\n });\n\n it('downloads a re-importable CSV of the failed rows from the partial toast action', async () => {\n const { state, client, showToast, downloadCsv } = setup({\n getJob: jest.fn(\n async () =>\n ({\n id: 'job-1',\n status: JobStatus.PARTIALLY_SUCCESSFUL,\n progress: { itemsSuccessful: 1, itemsRejected: 1 },\n } as DataMovementJob),\n ),\n // csvRows[1] (the \"Pear\" row) failed → file line 3 → \"row 3\".\n listMovementLogs: jest.fn(async () => ({\n logs: [\n { sourceItemId: 'row 3', failure: { code: 'bad', description: 'x' } },\n ],\n pagingMetadata: { hasNext: false },\n })),\n });\n\n await state.startImport();\n\n // Trigger the toast's download action.\n const toast = showToast.mock.calls[0][0];\n await toast.action.onClick();\n\n expect(client.listMovementLogs).toHaveBeenCalledWith('job-1', undefined);\n // Original headers + only the failed row, ready to fix and re-upload.\n expect(downloadCsv).toHaveBeenCalledWith('Name\\r\\nPear', 'failed-data.csv');\n });\n\n it('surfaces an error state with an application-error-shaped error when the job fails', async () => {\n const { state, importModalState, collection } = setup({\n getJob: jest.fn(\n async () =>\n ({\n id: 'job-1',\n status: JobStatus.FAILED,\n error: { code: 'import_failed', description: 'Bad rows' },\n } as DataMovementJob),\n ),\n });\n\n await state.startImport();\n\n expect(state.importStatus.status).toBe('error');\n // HTTP-error-shaped so the UI resolves the message via\n // errorHandler.getResolvedError rather than reading the raw server string.\n // The handler reads the code from `response.data.details.applicationError`.\n const error = state.importStatus.error as {\n response?: {\n data?: { details?: { applicationError?: { code?: string } } };\n };\n };\n expect(error.response?.data?.details?.applicationError?.code).toBe(\n 'import_failed',\n );\n expect(importModalState.close).not.toHaveBeenCalled();\n expect(collection.clearResultAndMoveToStart).not.toHaveBeenCalled();\n });\n\n it('hands a failed job to onJobError, which surfaces the wrapped error', async () => {\n // Wiring only: the consumer forwards `run` to their withErrorHandler exactly\n // as documented, and the error it re-rejects is the one surfaced to the UI\n // (with the application-error-shaped code intact). End-to-end resolution\n // against the real error handler is covered in the cairo\n // Table.importButton spec, which has a real errorHandler instance.\n // Mirror `(run) => errorHandler.withErrorHandler(run, errorCodesMap)`;\n // a passthrough stub, so this just runs `run` and re-rejects.\n const withErrorHandler = (fn: () => Promise<unknown>) => fn();\n const onJobError = jest.fn((run: () => Promise<unknown>) =>\n withErrorHandler(run),\n );\n\n const { state } = setup(\n {\n getJob: jest.fn(\n async () =>\n ({\n id: 'job-1',\n status: JobStatus.FAILED,\n error: { code: 'duplicate_key', description: 'Bad rows' },\n } as DataMovementJob),\n ),\n },\n { onJobError },\n );\n\n await state.startImport();\n\n expect(onJobError).toHaveBeenCalledTimes(1);\n expect(typeof onJobError.mock.calls[0][0]).toBe('function');\n expect(state.importStatus.status).toBe('error');\n const error = state.importStatus.error as {\n response?: {\n data?: { details?: { applicationError?: { code?: string } } };\n };\n };\n expect(error.response?.data?.details?.applicationError?.code).toBe(\n 'duplicate_key',\n );\n });\n\n it('terminates the job when closed mid-import', async () => {\n const { state, client, importModalState } = setup();\n // Cancel during the first poll, before the job is terminal.\n client.getJob.mockImplementation(async () => {\n await state.close();\n return { id: 'job-1', status: JobStatus.IN_PROGRESS };\n });\n\n await state.startImport();\n\n expect(client.terminateJob).toHaveBeenCalledWith('job-1');\n expect(importModalState.close).toHaveBeenCalled();\n });\n\n it('terminates the job when cancelled while submitImportJob is in flight', async () => {\n const { state, client } = setup();\n // The user cancels while submit is still in flight: close() runs before\n // _jobId is set (so it can't terminate), then submit resolves.\n client.submitImportJob.mockImplementation(async () => {\n await state.close();\n return 'job-1';\n });\n\n await state.startImport();\n\n // The late-cancel path must terminate the orphaned job, and polling never starts.\n expect(client.terminateJob).toHaveBeenCalledWith('job-1');\n expect(client.getJob).not.toHaveBeenCalled();\n });\n\n it('aborts the poll loop when disposed (unmounted) mid-import', async () => {\n const { state, client } = setup();\n const dispose = state.init();\n // Simulate the component unmounting during the first poll.\n client.getJob.mockImplementation(async () => {\n dispose();\n return { id: 'job-1', status: JobStatus.IN_PROGRESS };\n });\n\n await state.startImport();\n\n // Without the disposer the loop would keep polling the IN_PROGRESS job\n // forever; it must stop after the first fetch.\n expect(client.getJob).toHaveBeenCalledTimes(1);\n });\n\n it('does not restore when closed during the success completion linger', async () => {\n const restoreFn = jest.fn().mockResolvedValue(undefined);\n const { state, importModalState, collection } = setup(\n {},\n { backup: async () => ({ restore: restoreFn }) },\n );\n\n // A 0ms macrotask drains the pending async chain without firing the 600ms\n // linger timer.\n const flush = () => new Promise((resolve) => setTimeout(resolve, 0));\n\n const promise = state.startImport();\n // Run backup → upload → submit → poll (terminal) → success, parking on the\n // 600ms completion linger (still on the 'progress' step) without firing it.\n await flush();\n await flush();\n await flush();\n\n expect(state.importStatus.isSuccess).toBe(true);\n expect(state.currentStep).toBe('progress');\n\n // User closes the modal mid-linger.\n await state.close();\n await promise;\n\n // A successful import must not be reverted; the modal closes and the\n // collection refreshes.\n expect(restoreFn).not.toHaveBeenCalled();\n expect(importModalState.close).toHaveBeenCalled();\n expect(collection.clearResultAndMoveToStart).toHaveBeenCalledWith({\n force: true,\n });\n });\n});\n\ndescribe('ImportState writePolicy (id-collision handling)', () => {\n beforeEach(() => {\n jest.useRealTimers();\n });\n\n // Seed a CSV column mapped to the `_id` field so collisions are possible.\n function seedIdMapping(state: ImportState) {\n runInAction(() => {\n state.fileName = 'data.csv';\n state.csvHeaders = ['ID', 'Name'];\n state.csvRows = [\n ['1', 'Apple'],\n ['2', 'Pear'],\n ];\n state.mappingByHeader = {\n ID: { kind: 'existing', fieldId: '_id' },\n Name: { kind: 'existing', fieldId: 'name' },\n };\n });\n }\n\n it('exposes the header mapped to `_id` via idMappedHeader', () => {\n const { state } = setup();\n expect(state.idMappedHeader).toBeNull();\n\n seedIdMapping(state);\n expect(state.idMappedHeader).toBe('ID');\n });\n\n it('omits writePolicy when no column is mapped to `_id`', async () => {\n const { state, client } = setup();\n\n await state.startImport();\n\n expect(client.submitImportJob).toHaveBeenCalledWith(\n expect.objectContaining({\n destination: { wixDataCollection: { collectionId: 'Movies' } },\n }),\n );\n });\n\n it('sends the default OVERWRITE policy when a column maps to `_id`', async () => {\n const { state, client } = setup();\n seedIdMapping(state);\n\n await state.startImport();\n\n expect(client.submitImportJob).toHaveBeenCalledWith(\n expect.objectContaining({\n destination: {\n wixDataCollection: {\n collectionId: 'Movies',\n writePolicy: WritePolicy.OVERWRITE,\n },\n },\n }),\n );\n });\n\n it('sends SKIP_EXISTING after the user switches the policy', async () => {\n const { state, client } = setup();\n seedIdMapping(state);\n state.setWritePolicy(WritePolicy.SKIP_EXISTING);\n\n await state.startImport();\n\n expect(client.submitImportJob).toHaveBeenCalledWith(\n expect.objectContaining({\n destination: {\n wixDataCollection: {\n collectionId: 'Movies',\n writePolicy: WritePolicy.SKIP_EXISTING,\n },\n },\n }),\n );\n });\n\n it('resets the policy back to OVERWRITE', () => {\n const { state } = setup();\n state.setWritePolicy(WritePolicy.SKIP_EXISTING);\n expect(state.writePolicy).toBe(WritePolicy.SKIP_EXISTING);\n\n state.reset();\n expect(state.writePolicy).toBe(WritePolicy.OVERWRITE);\n });\n\n it('resets the policy to OVERWRITE when a new file is uploaded mid-session', async () => {\n const { state } = setup();\n seedIdMapping(state);\n // The user switched to Skip for the first file.\n state.setWritePolicy(WritePolicy.SKIP_EXISTING);\n expect(state.writePolicy).toBe(WritePolicy.SKIP_EXISTING);\n\n // Uploading a different CSV in the same modal session must start from the\n // documented default — otherwise the prior Skip silently carries over and\n // rows with a colliding `_id` are skipped instead of updated.\n const csv = 'ID,Name\\nid-9,Zed\\n';\n const file = {\n name: 'file-b.csv',\n arrayBuffer: async () => new TextEncoder().encode(csv).buffer,\n } as unknown as File;\n await state.onFileSelected(file);\n\n expect(state.writePolicy).toBe(WritePolicy.OVERWRITE);\n });\n\n it('keeps the chosen policy when the `_id` mapping is removed and re-added', () => {\n const { state } = setup();\n seedIdMapping(state);\n state.setWritePolicy(WritePolicy.SKIP_EXISTING);\n\n // Remap the ID column away: the control hides and the destination drops\n // writePolicy, but the user's choice is intentionally retained (editing\n // mappings within a file never resets it — only a new file does).\n state.setMapping('ID', null);\n expect(state.idMappedHeader).toBeNull();\n expect(state.writePolicy).toBe(WritePolicy.SKIP_EXISTING);\n\n // Map `_id` again — the prior choice is still in effect.\n state.setMapping('ID', '_id');\n expect(state.idMappedHeader).toBe('ID');\n expect(state.writePolicy).toBe(WritePolicy.SKIP_EXISTING);\n });\n\n it('omits writePolicy when the `_id` column is remapped away mid-session', async () => {\n const { state, client } = setup();\n seedIdMapping(state);\n state.setWritePolicy(WritePolicy.SKIP_EXISTING);\n // No column maps to `_id` anymore → no collisions possible → omit it.\n state.setMapping('ID', null);\n\n await state.startImport();\n\n expect(client.submitImportJob).toHaveBeenCalledWith(\n expect.objectContaining({\n destination: { wixDataCollection: { collectionId: 'Movies' } },\n }),\n );\n });\n});\n\ndescribe('ImportState orderedHeaders (row order stability)', () => {\n beforeEach(() => {\n jest.useRealTimers();\n });\n\n // Parse a CSV whose `ID` column auto-maps to `_id` (a field with that id\n // exists), so the `_id` row floats to the top of the ordered list.\n async function parseWithIdColumn(state: ImportState) {\n const csv = 'Name,ID,Handle\\nApple,id-1,a\\nPear,id-2,p\\n';\n const file = {\n name: 'data.csv',\n arrayBuffer: async () => new TextEncoder().encode(csv).buffer,\n } as unknown as File;\n await state.onFileSelected(file);\n }\n\n it('floats the `_id`-mapped column to the top for a freshly parsed file', async () => {\n const { state } = setup({}, { fields: [{ id: '_id', header: 'ID' }] });\n\n await parseWithIdColumn(state);\n\n expect(state.idMappedHeader).toBe('ID');\n expect(state.orderedHeaders).toEqual(['ID', 'Name', 'Handle']);\n });\n\n it('keeps row order stable when the `_id` mapping is cleared and re-added', async () => {\n const { state } = setup({}, { fields: [{ id: '_id', header: 'ID' }] });\n await parseWithIdColumn(state);\n\n // Clearing the `_id` dropdown must not reorder the row under the cursor:\n // the snapshot stays fixed even though `idMappedHeader` becomes null.\n state.setMapping('ID', null);\n expect(state.idMappedHeader).toBeNull();\n expect(state.orderedHeaders).toEqual(['ID', 'Name', 'Handle']);\n\n // Re-mapping `_id` also leaves the order untouched.\n state.setMapping('ID', '_id');\n expect(state.idMappedHeader).toBe('ID');\n expect(state.orderedHeaders).toEqual(['ID', 'Name', 'Handle']);\n });\n\n it('re-snapshots the order for a new file and clears it on reset', async () => {\n const { state } = setup({}, { fields: [{ id: '_id', header: 'ID' }] });\n await parseWithIdColumn(state);\n expect(state.orderedHeaders).toEqual(['ID', 'Name', 'Handle']);\n\n // A file with no `_id` column keeps plain CSV order.\n const csv = 'First,Second\\n1,2\\n';\n const file = {\n name: 'other.csv',\n arrayBuffer: async () => new TextEncoder().encode(csv).buffer,\n } as unknown as File;\n await state.onFileSelected(file);\n expect(state.orderedHeaders).toEqual(['First', 'Second']);\n\n state.reset();\n expect(state.orderedHeaders).toEqual([]);\n });\n});\n"],"mappings":"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","ignoreList":[]}
|