@cristianmpx/react-import-sheet-headless 1.0.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/LICENSE.md +21 -0
- package/README.md +148 -0
- package/dist/chunk-3O6T2NOG.js +2 -0
- package/dist/chunk-3O6T2NOG.js.map +1 -0
- package/dist/chunk-77DDFTT3.js +2 -0
- package/dist/chunk-77DDFTT3.js.map +1 -0
- package/dist/chunk-BCDDC5UG.js +2 -0
- package/dist/chunk-BCDDC5UG.js.map +1 -0
- package/dist/chunk-J2IHY56K.js +2 -0
- package/dist/chunk-J2IHY56K.js.map +1 -0
- package/dist/chunk-UCBBDF6X.js +2 -0
- package/dist/chunk-UCBBDF6X.js.map +1 -0
- package/dist/chunk-WLNB3X2R.js +2 -0
- package/dist/chunk-WLNB3X2R.js.map +1 -0
- package/dist/chunk-XTSACACJ.js +2 -0
- package/dist/chunk-XTSACACJ.js.map +1 -0
- package/dist/chunk-YETPLYYC.js +2 -0
- package/dist/chunk-YETPLYYC.js.map +1 -0
- package/dist/csv-parser-3IGEDABE.js +2 -0
- package/dist/csv-parser-3IGEDABE.js.map +1 -0
- package/dist/csv-parser-ML7A4LF4.js +2 -0
- package/dist/csv-parser-ML7A4LF4.js.map +1 -0
- package/dist/edit.worker.d.ts +5 -0
- package/dist/edit.worker.js +2 -0
- package/dist/edit.worker.js.map +1 -0
- package/dist/index.d.ts +403 -0
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -0
- package/dist/parser.worker.d.ts +2 -0
- package/dist/parser.worker.js +2 -0
- package/dist/parser.worker.js.map +1 -0
- package/dist/sanitizer.worker.d.ts +2 -0
- package/dist/sanitizer.worker.js +2 -0
- package/dist/sanitizer.worker.js.map +1 -0
- package/dist/transform.worker.d.ts +5 -0
- package/dist/transform.worker.js +2 -0
- package/dist/transform.worker.js.map +1 -0
- package/dist/validator.worker.d.ts +5 -0
- package/dist/validator.worker.js +2 -0
- package/dist/validator.worker.js.map +1 -0
- package/package.json +86 -0
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,403 @@
|
|
|
1
|
+
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
|
+
import { ReactNode } from 'react';
|
|
3
|
+
|
|
4
|
+
type RegistryLevel = 'cell' | 'row' | 'table';
|
|
5
|
+
interface RegistryEntry<T extends (...args: unknown[]) => unknown> {
|
|
6
|
+
readonly fn: T;
|
|
7
|
+
readonly type: RegistryLevel;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
declare class Registry<T extends (...args: unknown[]) => unknown> {
|
|
11
|
+
private entries;
|
|
12
|
+
register(name: string, fn: T, options: {
|
|
13
|
+
type: RegistryLevel;
|
|
14
|
+
}): void;
|
|
15
|
+
get(name: string): RegistryEntry<T> | undefined;
|
|
16
|
+
getByType(type: RegistryLevel): Array<{
|
|
17
|
+
name: string;
|
|
18
|
+
entry: RegistryEntry<T>;
|
|
19
|
+
}>;
|
|
20
|
+
has(name: string): boolean;
|
|
21
|
+
clear(): void;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
type SheetErrorLevel = 'error' | 'warning' | 'fatal' | 'info';
|
|
25
|
+
interface SheetError {
|
|
26
|
+
readonly code: string;
|
|
27
|
+
readonly params?: Readonly<Record<string, unknown>>;
|
|
28
|
+
readonly level?: SheetErrorLevel;
|
|
29
|
+
readonly message?: string;
|
|
30
|
+
readonly rowIndex?: number;
|
|
31
|
+
readonly cellKey?: string;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
type ParserEngine = 'xlsx' | 'csv' | 'auto';
|
|
35
|
+
|
|
36
|
+
type RawSheetCellValue = string | number | boolean | Date | null;
|
|
37
|
+
interface RawSheetCell {
|
|
38
|
+
readonly key: string;
|
|
39
|
+
readonly value: RawSheetCellValue;
|
|
40
|
+
}
|
|
41
|
+
interface RawSheetRow {
|
|
42
|
+
readonly index: number;
|
|
43
|
+
readonly cells: readonly RawSheetCell[];
|
|
44
|
+
}
|
|
45
|
+
interface BaseSheet<TRow> {
|
|
46
|
+
readonly name: string;
|
|
47
|
+
readonly filesize: number;
|
|
48
|
+
readonly documentHash: string;
|
|
49
|
+
readonly rowsCount?: number;
|
|
50
|
+
readonly headersCount?: number;
|
|
51
|
+
readonly headers: readonly string[];
|
|
52
|
+
readonly rows: readonly TRow[];
|
|
53
|
+
}
|
|
54
|
+
interface RawParseResult {
|
|
55
|
+
readonly sheets: Readonly<Record<string, RawSheet>>;
|
|
56
|
+
readonly parserMeta?: Readonly<{
|
|
57
|
+
encoding?: string;
|
|
58
|
+
delimiter?: string;
|
|
59
|
+
}>;
|
|
60
|
+
}
|
|
61
|
+
type RawSheet = BaseSheet<RawSheetRow>;
|
|
62
|
+
|
|
63
|
+
type FieldValueType = 'number' | 'string' | 'bool' | 'date';
|
|
64
|
+
type FieldInputType = 'input' | 'checkbox';
|
|
65
|
+
type ValidatorOrWithParams = string | {
|
|
66
|
+
readonly name: string;
|
|
67
|
+
readonly params?: Readonly<Record<string, unknown>>;
|
|
68
|
+
};
|
|
69
|
+
interface SheetLayoutField {
|
|
70
|
+
readonly name: string;
|
|
71
|
+
readonly description?: string;
|
|
72
|
+
readonly example?: string;
|
|
73
|
+
readonly validators?: readonly ValidatorOrWithParams[];
|
|
74
|
+
readonly sanitizers?: readonly ValidatorOrWithParams[];
|
|
75
|
+
readonly transformations?: readonly ValidatorOrWithParams[];
|
|
76
|
+
readonly valueType?: FieldValueType;
|
|
77
|
+
readonly inputType?: FieldInputType;
|
|
78
|
+
readonly required?: boolean;
|
|
79
|
+
}
|
|
80
|
+
interface SheetLayout {
|
|
81
|
+
readonly name: string;
|
|
82
|
+
readonly version: string | number;
|
|
83
|
+
readonly description?: string;
|
|
84
|
+
readonly sheetValidators?: readonly ValidatorOrWithParams[];
|
|
85
|
+
readonly sheetSanitizers?: readonly ValidatorOrWithParams[];
|
|
86
|
+
readonly rowValidators?: readonly ValidatorOrWithParams[];
|
|
87
|
+
readonly rowSanitizers?: readonly ValidatorOrWithParams[];
|
|
88
|
+
readonly rowTransformations?: readonly ValidatorOrWithParams[];
|
|
89
|
+
readonly sheetTransformations?: readonly ValidatorOrWithParams[];
|
|
90
|
+
readonly fields: Readonly<Record<string, SheetLayoutField>>;
|
|
91
|
+
}
|
|
92
|
+
interface SheetLayoutRef {
|
|
93
|
+
readonly name: string;
|
|
94
|
+
readonly version: string | number;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
interface ValidatedCell {
|
|
98
|
+
readonly key: string;
|
|
99
|
+
readonly value: unknown;
|
|
100
|
+
readonly errors: readonly SheetError[];
|
|
101
|
+
}
|
|
102
|
+
interface ValidatedRow {
|
|
103
|
+
readonly index: number;
|
|
104
|
+
readonly errors: readonly SheetError[];
|
|
105
|
+
readonly cells: readonly ValidatedCell[];
|
|
106
|
+
}
|
|
107
|
+
interface Sheet extends BaseSheet<ValidatedRow> {
|
|
108
|
+
readonly sheetLayout: SheetLayoutRef;
|
|
109
|
+
readonly mimetype?: string;
|
|
110
|
+
readonly extension?: string;
|
|
111
|
+
readonly errors: readonly SheetError[];
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
interface PipelineMetricsTimings {
|
|
115
|
+
readonly parse: number;
|
|
116
|
+
readonly sanitize: number;
|
|
117
|
+
readonly validate: number;
|
|
118
|
+
readonly transform: number;
|
|
119
|
+
}
|
|
120
|
+
interface PipelineMetricsPercentages {
|
|
121
|
+
readonly parse: number;
|
|
122
|
+
readonly sanitize: number;
|
|
123
|
+
readonly validate: number;
|
|
124
|
+
readonly transform: number;
|
|
125
|
+
readonly overhead?: number;
|
|
126
|
+
}
|
|
127
|
+
interface PipelineMetrics {
|
|
128
|
+
readonly timings: PipelineMetricsTimings;
|
|
129
|
+
readonly percentages?: PipelineMetricsPercentages;
|
|
130
|
+
readonly totalMs: number;
|
|
131
|
+
readonly isSlow: boolean;
|
|
132
|
+
readonly parseTime: string;
|
|
133
|
+
readonly sanitizeTime: string;
|
|
134
|
+
readonly validateTime: string;
|
|
135
|
+
readonly transformTime: string;
|
|
136
|
+
readonly totalTime: string;
|
|
137
|
+
readonly efficiency: string;
|
|
138
|
+
readonly rowCount: number;
|
|
139
|
+
readonly overheadMs?: number;
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
interface ChangeLogEntryCellEdit {
|
|
143
|
+
readonly type: 'cell_edit';
|
|
144
|
+
readonly rowIndex: number;
|
|
145
|
+
readonly cellKey: string;
|
|
146
|
+
readonly value: unknown;
|
|
147
|
+
readonly previousValue?: unknown;
|
|
148
|
+
readonly timestamp: number;
|
|
149
|
+
}
|
|
150
|
+
interface ChangeLogEntryRowRemove {
|
|
151
|
+
readonly type: 'row_remove';
|
|
152
|
+
readonly rowIndex: number;
|
|
153
|
+
readonly timestamp: number;
|
|
154
|
+
}
|
|
155
|
+
type ChangeLogEntry = ChangeLogEntryCellEdit | ChangeLogEntryRowRemove;
|
|
156
|
+
declare function formatChangeLogAsText(entries: readonly ChangeLogEntry[]): string;
|
|
157
|
+
|
|
158
|
+
interface EditCellParams {
|
|
159
|
+
readonly rowIndex: number;
|
|
160
|
+
readonly cellKey: string;
|
|
161
|
+
readonly value: unknown;
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
interface PaginatedResult<TRow> {
|
|
165
|
+
readonly page: number;
|
|
166
|
+
readonly pageSize: number;
|
|
167
|
+
readonly totalCount: number;
|
|
168
|
+
readonly totalPages: number;
|
|
169
|
+
readonly rows: readonly TRow[];
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
interface ConvertedSheetCell {
|
|
173
|
+
readonly key: string;
|
|
174
|
+
readonly value: RawSheetCellValue;
|
|
175
|
+
}
|
|
176
|
+
interface ConvertedSheetRow {
|
|
177
|
+
readonly index: number;
|
|
178
|
+
readonly cells: readonly ConvertedSheetCell[];
|
|
179
|
+
}
|
|
180
|
+
type ConvertedSheet = BaseSheet<ConvertedSheetRow>;
|
|
181
|
+
|
|
182
|
+
interface SanitizedSheetCell {
|
|
183
|
+
readonly key: string;
|
|
184
|
+
readonly value: RawSheetCellValue;
|
|
185
|
+
}
|
|
186
|
+
interface SanitizedSheetRow {
|
|
187
|
+
readonly index: number;
|
|
188
|
+
readonly cells: readonly SanitizedSheetCell[];
|
|
189
|
+
}
|
|
190
|
+
type SanitizedSheet = BaseSheet<SanitizedSheetRow>;
|
|
191
|
+
|
|
192
|
+
type ImporterStatus = 'idle' | 'loading' | 'parsing' | 'validating' | 'transforming' | 'success' | 'error' | 'cancelled';
|
|
193
|
+
interface ConvertResultData {
|
|
194
|
+
readonly headersFound: readonly string[];
|
|
195
|
+
readonly mismatches: readonly {
|
|
196
|
+
expected: string;
|
|
197
|
+
found: string | null;
|
|
198
|
+
message?: string;
|
|
199
|
+
}[];
|
|
200
|
+
readonly columnOrder: readonly string[];
|
|
201
|
+
readonly headerToFieldMap: Readonly<Record<string, string>>;
|
|
202
|
+
}
|
|
203
|
+
interface ImporterState {
|
|
204
|
+
readonly file: File | null;
|
|
205
|
+
readonly rawData: RawSheet | null;
|
|
206
|
+
readonly documentHash: string | null;
|
|
207
|
+
readonly status: ImporterStatus;
|
|
208
|
+
readonly result: Sheet | null;
|
|
209
|
+
readonly convertedSheet: ConvertedSheet | null;
|
|
210
|
+
readonly sanitizedSheet: SanitizedSheet | null;
|
|
211
|
+
readonly convertResultData: ConvertResultData | null;
|
|
212
|
+
readonly metrics: PipelineMetrics | null;
|
|
213
|
+
readonly changeLog: readonly ChangeLogEntry[];
|
|
214
|
+
readonly submitDone: boolean;
|
|
215
|
+
}
|
|
216
|
+
declare const IMPORTER_PROGRESS_EVENT = "importer-progress";
|
|
217
|
+
declare const IMPORTER_ABORTED_EVENT = "importer-aborted";
|
|
218
|
+
interface ImporterProgressDetail {
|
|
219
|
+
readonly phase?: string;
|
|
220
|
+
readonly globalPercent?: number;
|
|
221
|
+
readonly localPercent?: number;
|
|
222
|
+
readonly currentRow?: number;
|
|
223
|
+
readonly totalRows?: number;
|
|
224
|
+
readonly rowsProcessed?: number;
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
interface ImporterProviderProps {
|
|
228
|
+
children: ReactNode;
|
|
229
|
+
layout?: SheetLayout | null;
|
|
230
|
+
engine?: ParserEngine | null;
|
|
231
|
+
persist?: boolean;
|
|
232
|
+
persistKey?: string;
|
|
233
|
+
onSubmit?: ((rows: Record<string, unknown>[]) => void) | null;
|
|
234
|
+
submitKeyMap?: Readonly<Record<string, string>> | null;
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
declare function ImporterProvider({ children, layout: layoutProp, engine: engineProp, persist, persistKey, onSubmit, submitKeyMap, }: ImporterProviderProps): react_jsx_runtime.JSX.Element;
|
|
238
|
+
|
|
239
|
+
interface UseImporterOptions {
|
|
240
|
+
layout?: SheetLayout | null;
|
|
241
|
+
engine?: ParserEngine | null;
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
declare function useImporter(options?: UseImporterOptions): {
|
|
245
|
+
processFile: (file: File) => void;
|
|
246
|
+
registerValidator: (name: string, fn: (...args: unknown[]) => unknown, options: {
|
|
247
|
+
type: RegistryLevel;
|
|
248
|
+
}) => void;
|
|
249
|
+
registerSanitizer: (name: string, fn: (...args: unknown[]) => unknown, options: {
|
|
250
|
+
type: RegistryLevel;
|
|
251
|
+
}) => void;
|
|
252
|
+
registerTransform: (name: string, fn: (...args: unknown[]) => unknown, options: {
|
|
253
|
+
type: RegistryLevel;
|
|
254
|
+
}) => void;
|
|
255
|
+
abort: () => void;
|
|
256
|
+
metrics: PipelineMetrics | null;
|
|
257
|
+
submit: () => void;
|
|
258
|
+
canSubmit: boolean;
|
|
259
|
+
submitDone: boolean;
|
|
260
|
+
};
|
|
261
|
+
|
|
262
|
+
declare function useImportSheet(): {
|
|
263
|
+
startFullImport: () => Promise<RawParseResult>;
|
|
264
|
+
};
|
|
265
|
+
|
|
266
|
+
interface ConvertOptions {
|
|
267
|
+
readonly caseSensitive?: boolean;
|
|
268
|
+
readonly normalizer?: (header: string) => string;
|
|
269
|
+
readonly fuzzyHeaders?: boolean;
|
|
270
|
+
readonly fuzzyThreshold?: number;
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
interface ColumnMismatch {
|
|
274
|
+
readonly expected: string;
|
|
275
|
+
readonly found: string | null;
|
|
276
|
+
readonly message?: string;
|
|
277
|
+
readonly required?: boolean;
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
interface ConvertMismatchData {
|
|
281
|
+
readonly kind: 'mismatch';
|
|
282
|
+
readonly headersFound: readonly string[];
|
|
283
|
+
readonly mismatches: readonly ColumnMismatch[];
|
|
284
|
+
readonly columnOrder: readonly string[];
|
|
285
|
+
readonly headerToFieldMap: Readonly<Record<string, string>>;
|
|
286
|
+
readonly layoutError?: boolean;
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
interface ConvertResult extends ConvertMismatchData {
|
|
290
|
+
reorderColumns: (fieldNames: string[]) => void;
|
|
291
|
+
renameColumn: (fileHeader: string, layoutFieldName: string) => void;
|
|
292
|
+
applyMapping: () => ConvertResultApplyResult;
|
|
293
|
+
}
|
|
294
|
+
type ConvertResultApplyResult = {
|
|
295
|
+
kind: 'success';
|
|
296
|
+
sheet: ConvertedSheet;
|
|
297
|
+
} | {
|
|
298
|
+
kind: 'mismatch';
|
|
299
|
+
result: ConvertMismatchData;
|
|
300
|
+
};
|
|
301
|
+
|
|
302
|
+
declare function useConvert(): {
|
|
303
|
+
convert: (options?: ConvertOptions) => void;
|
|
304
|
+
convertedSheet: ConvertedSheet | null;
|
|
305
|
+
convertResult: ConvertResult | null;
|
|
306
|
+
};
|
|
307
|
+
|
|
308
|
+
interface ConvertSuccess {
|
|
309
|
+
readonly kind: 'success';
|
|
310
|
+
readonly sheet: ConvertedSheet;
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
declare function useImporterStatus(): {
|
|
314
|
+
status: ImporterStatus;
|
|
315
|
+
progressEventTarget: EventTarget;
|
|
316
|
+
};
|
|
317
|
+
|
|
318
|
+
declare function useSheetData(): {
|
|
319
|
+
sheet: Sheet | null;
|
|
320
|
+
errors: SheetError[];
|
|
321
|
+
toObjects: <T>(mapRow: (row: ValidatedRow) => T) => T[];
|
|
322
|
+
toObjectsWithKeyMap: (keyMap: Readonly<Record<string, string>>) => Record<string, unknown>[];
|
|
323
|
+
};
|
|
324
|
+
|
|
325
|
+
interface UseSheetEditorOptions {
|
|
326
|
+
page?: number;
|
|
327
|
+
pageSize?: number;
|
|
328
|
+
debounceMs?: number;
|
|
329
|
+
}
|
|
330
|
+
declare function useSheetEditor(options?: UseSheetEditorOptions): {
|
|
331
|
+
sheet: Sheet | null;
|
|
332
|
+
editCell: (params: EditCellParams) => void | Promise<void>;
|
|
333
|
+
removeRow: (rowIndex: number) => void;
|
|
334
|
+
pageData: PaginatedResult<ValidatedRow>;
|
|
335
|
+
totalPages: number;
|
|
336
|
+
isReady: boolean;
|
|
337
|
+
canEdit: boolean;
|
|
338
|
+
changeLog: readonly ChangeLogEntry[];
|
|
339
|
+
changeLogAsText: string;
|
|
340
|
+
};
|
|
341
|
+
|
|
342
|
+
type ViewFilterMode = 'all' | 'errors-only';
|
|
343
|
+
interface UseSheetViewOptions {
|
|
344
|
+
page?: number;
|
|
345
|
+
defaultPageSize?: number;
|
|
346
|
+
filterMode?: ViewFilterMode;
|
|
347
|
+
}
|
|
348
|
+
|
|
349
|
+
interface ExportOptions {
|
|
350
|
+
includeHeaders?: boolean;
|
|
351
|
+
csvSeparator?: string;
|
|
352
|
+
filename?: string;
|
|
353
|
+
formatDatesForExport?: boolean;
|
|
354
|
+
}
|
|
355
|
+
|
|
356
|
+
interface ViewCounts {
|
|
357
|
+
readonly totalRows: number;
|
|
358
|
+
readonly rowsWithErrors: number;
|
|
359
|
+
readonly totalErrors: number;
|
|
360
|
+
}
|
|
361
|
+
|
|
362
|
+
interface UseSheetViewReturn<TRow = ValidatedRow> {
|
|
363
|
+
sheet: Sheet | null;
|
|
364
|
+
getPaginatedResult: (page?: number, pageSize?: number) => PaginatedResult<TRow>;
|
|
365
|
+
paginatedRows: readonly TRow[];
|
|
366
|
+
page: number;
|
|
367
|
+
setPage: (page: number) => void;
|
|
368
|
+
pageSize: number;
|
|
369
|
+
totalRows: number;
|
|
370
|
+
/** 1-based page; returns slice for that page. */
|
|
371
|
+
getRows: (page: number, limit: number) => TRow[];
|
|
372
|
+
rowsWithErrors: readonly TRow[];
|
|
373
|
+
counts: ViewCounts;
|
|
374
|
+
editCell: (params: EditCellParams) => void | Promise<void>;
|
|
375
|
+
removeRow: (rowIndex: number) => void;
|
|
376
|
+
changeLog: readonly ChangeLogEntry[];
|
|
377
|
+
changeLogAsText: string;
|
|
378
|
+
exportToCSV: (options?: ExportOptions) => string | Blob | Promise<string | Blob>;
|
|
379
|
+
exportToJSON: (options?: ExportOptions) => string | Blob | Promise<string | Blob>;
|
|
380
|
+
downloadCSV: (options?: ExportOptions & {
|
|
381
|
+
filename?: string;
|
|
382
|
+
}) => void | Promise<void>;
|
|
383
|
+
downloadJSON: (options?: ExportOptions & {
|
|
384
|
+
filename?: string;
|
|
385
|
+
}) => void | Promise<void>;
|
|
386
|
+
hasRecoverableSession: boolean;
|
|
387
|
+
recoverSession: () => Promise<void>;
|
|
388
|
+
clearPersistedState: () => Promise<void>;
|
|
389
|
+
}
|
|
390
|
+
|
|
391
|
+
declare function useSheetView(options?: UseSheetViewOptions): UseSheetViewReturn<ValidatedRow>;
|
|
392
|
+
|
|
393
|
+
declare function useImporterEventTarget(): {
|
|
394
|
+
progressEventTarget: EventTarget;
|
|
395
|
+
subscribeToProgress: (callback: (detail: ImporterProgressDetail) => void) => () => void;
|
|
396
|
+
};
|
|
397
|
+
declare function useImporterProgressSubscription(callback: (detail: ImporterProgressDetail) => void): void;
|
|
398
|
+
|
|
399
|
+
declare function hasValidationErrors(sheet: Sheet | null): boolean;
|
|
400
|
+
|
|
401
|
+
declare function getCellValue(row: ValidatedRow, key: string): unknown;
|
|
402
|
+
|
|
403
|
+
export { type BaseSheet, type ChangeLogEntry, type ChangeLogEntryCellEdit, type ChangeLogEntryRowRemove, type ColumnMismatch, type ConvertMismatchData, type ConvertOptions, type ConvertResult, type ConvertResultApplyResult, type ConvertResultData, type ConvertSuccess, type ConvertedSheet, type EditCellParams, type ExportOptions, type FieldInputType, type FieldValueType, IMPORTER_ABORTED_EVENT, IMPORTER_PROGRESS_EVENT, ImporterProvider as ImportProvider, type ImporterProgressDetail, ImporterProvider, type ImporterProviderProps, type ImporterState, type ImporterStatus, type PaginatedResult, type ParserEngine, type PipelineMetrics, type PipelineMetricsPercentages, type PipelineMetricsTimings, type RawParseResult, type RawSheet, type RawSheetCell, type RawSheetCellValue, type RawSheetRow, Registry, type RegistryEntry, type RegistryLevel, type Sheet, type SheetError, type SheetErrorLevel, type SheetLayout, type SheetLayoutField, type SheetLayoutRef, type UseImporterOptions, type UseSheetViewOptions, type UseSheetViewReturn, type ValidatedCell, type ValidatedRow, type ValidatorOrWithParams, type ViewCounts, type ViewFilterMode, formatChangeLogAsText, getCellValue, hasValidationErrors, useConvert, useImportSheet, useImporter, useImporterEventTarget, useImporterProgressSubscription, useImporterStatus, useSheetData, useSheetEditor, useSheetView };
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import{a as Q,b as he,c as ye}from"./chunk-UCBBDF6X.js";import{a as V}from"./chunk-YETPLYYC.js";import{useEffect as tt,useMemo as F,useRef as be,useState as re}from"react";var k="react-import-sheet-persist",Z="react-import-sheet-session";import{createContext as $e}from"react";var N=$e(null);var ge={file:null,rawData:null,documentHash:null,status:"idle",result:null,convertedSheet:null,sanitizedSheet:null,convertResultData:null,metrics:null,changeLog:[],submitDone:!1};import{useCallback as T,useMemo as Ge}from"react";function _(t){return t<.01&&t>=0?"0.00ms":t<1?`${(t*1e3).toFixed(2)}\u03BCs`:`${t.toFixed(2)}ms`}function ee(t,e,r){let s=t.parse+t.sanitize+t.validate+t.transform,o=s>2e3,i=`${(e>0?s/e:0).toFixed(4)}ms/row`,n;if(s>0){let u=r??0,c=s+u;n={parse:t.parse/c*100,sanitize:t.sanitize/c*100,validate:t.validate/c*100,transform:t.transform/c*100,overhead:c>0?u/c*100:0}}return{timings:{...t},percentages:n,totalMs:s,isSlow:o,parseTime:_(t.parse),sanitizeTime:_(t.sanitize),validateTime:_(t.validate),transformTime:_(t.transform),totalTime:_(s),efficiency:i,rowCount:e,...r!==void 0&&r>=0?{overheadMs:r}:{}}}function U(t){let e=[];for(let r of t)if(r.type==="cell_edit"){let s=r.previousValue!==void 0?` (previous: ${String(r.previousValue)})`:"";e.push(`Row ${r.rowIndex+1}, cell "${r.cellKey}": set to ${JSON.stringify(r.value)}${s}`)}else e.push(`Row ${r.rowIndex+1}: removed`);return e.join(`
|
|
2
|
+
`)}var O="importer-progress",B="importer-aborted";import{useCallback as P}from"react";function q(t){let{setState:e,setLayoutState:r,setEngineState:s}=t,o=P(d=>{e(f=>({...f,file:d}))},[e]),a=P(d=>{e(f=>({...f,rawData:d}))},[e]),i=P(d=>{e(f=>({...f,documentHash:d}))},[e]),n=P(d=>{e(f=>({...f,status:d}))},[e]),u=P(d=>{e(f=>({...f,result:d}))},[e]),c=P(d=>{e(f=>({...f,convertedSheet:d,convertResultData:null}))},[e]),p=P(d=>{e(f=>({...f,sanitizedSheet:d}))},[e]),S=P(d=>{e(f=>({...f,convertResultData:typeof d=="function"?d(f.convertResultData):d,convertedSheet:typeof d=="function"?f.convertedSheet:null}))},[e]),l=P(d=>{e(f=>({...f,metrics:d}))},[e]),m=P(d=>{e(f=>({...f,submitDone:d}))},[e]),y=P(d=>{r(d)},[r]),x=P(d=>{s(d)},[s]);return{setLayout:y,setEngine:x,setFile:o,setRawData:a,setDocumentHash:i,setStatus:n,setResult:u,setConvertedSheet:c,setSanitizedSheet:p,setConvertResultData:S,setMetrics:l,setSubmitDone:m}}var Ye={parse:0,sanitize:0,validate:0,transform:0};function Se(t){let{setState:e,setLayoutState:r,setEngineState:s,progressEventTarget:o,validatorRegistry:a,sanitizerRegistry:i,transformRegistry:n,activeWorkerRef:u,phaseTimingsRef:c}=t,p=q({setState:e,setLayoutState:r,setEngineState:s}),S=T(h=>{o.dispatchEvent(new CustomEvent(O,{detail:h}))},[o]),l=T(h=>{u.current=h},[u]),m=T(()=>{let h=u.current;h&&(h.terminate(),u.current=null),e(R=>({...R,status:"cancelled"})),o.dispatchEvent(new CustomEvent(B))},[u,o,e]),y=T((h,R)=>{c.current={...c.current,[h]:R}},[c]),x=T(h=>{let R={...c.current},v=ee(R,h);p.setMetrics(v)},[c,p]),d=T(h=>{e(R=>({...R,changeLog:[...R.changeLog,h]}))},[e]),f=T(h=>{c.current={...Ye},e(R=>({...R,file:h,status:"loading",rawData:null,documentHash:null,result:null,convertedSheet:null,sanitizedSheet:null,convertResultData:null,metrics:null,changeLog:[],submitDone:!1}))},[c,e]),b=T((h,R,v)=>{a.register(h,R,v)},[a]),C=T((h,R,v)=>{i.register(h,R,v)},[i]),g=T((h,R,v)=>{n.register(h,R,v)},[n]);return Ge(()=>({...p,addChangeLogEntry:d,setPhaseTiming:y,finalizeMetrics:x,processFile:f,registerValidator:b,registerSanitizer:C,registerTransform:g,abort:m,dispatchProgress:S,setActiveWorker:l}),[p,d,y,x,f,b,C,g,m,S,l])}import{useCallback as Ee,useEffect as Pe,useRef as Qe,useState as Ze}from"react";function te(){return new Promise((t,e)=>{let r=indexedDB.open("react-import-sheet-db",1);r.onerror=()=>e(r.error),r.onsuccess=()=>t(r.result),r.onupgradeneeded=()=>{r.result.createObjectStore(k,{keyPath:"key"})}})}async function we(t,e){let r=await te();return new Promise((s,o)=>{let a=r.transaction(k,"readwrite"),i=a.objectStore(k),n={key:t,...e},u=i.put(n);u.onsuccess=()=>s(),u.onerror=()=>o(u.error),a.oncomplete=()=>r.close()})}async function xe(t){let e=await te();return new Promise((r,s)=>{let i=e.transaction(k,"readonly").objectStore(k).get(t);i.onsuccess=()=>{e.close();let n=i.result;if(n==null){r(null);return}let u=n.savedAt;if(Date.now()-u>6048e5){r(null);return}let{key:c,...p}=n;r(p)},i.onerror=()=>s(i.error)})}async function ve(t){let e=await te();return new Promise((r,s)=>{let o=e.transaction(k,"readwrite"),i=o.objectStore(k).delete(t);i.onsuccess=()=>r(),i.onerror=()=>s(i.error),o.oncomplete=()=>e.close()})}var et=2500;function Ce(t,e,r,s,o,a,i){let[n,u]=Ze(null),c=Qe(null);Pe(()=>{t&&xe(e).then(l=>{l&&(l.layoutVersion!=null&&i!=null&&String(l.layoutVersion)!==String(i)||u(l))})},[t,e,i]),Pe(()=>{if(!(!t||!r||!s))return c.current&&clearTimeout(c.current),c.current=setTimeout(()=>{c.current=null;let l={rawData:r,sheet:s,savedAt:Date.now(),layoutVersion:i??void 0,stateSchemaVersion:1};we(e,l).catch(()=>{})},et),()=>{c.current&&clearTimeout(c.current)}},[t,e,r,s,i]);let p=Ee(async()=>{if(!t)return;let l=n;l&&(o(l.rawData),a(l.sheet),u(null))},[t,n,o,a]),S=Ee(async()=>{t&&(await ve(e),u(null))},[t,e]);return{hasRecoverableSession:t&&n!=null,recoverSession:p,clearPersistedState:S}}import{jsx as rt}from"react/jsx-runtime";function oe({children:t,layout:e,engine:r,persist:s=!1,persistKey:o=Z,onSubmit:a=null,submitKeyMap:i=null}){let[n,u]=re(ge),[c,p]=re(e??null),[S,l]=re(r??null),m=F(()=>new EventTarget,[]),y=F(()=>new V,[]),x=F(()=>new V,[]),d=F(()=>new V,[]),f=be(null),b=be({parse:0,sanitize:0,validate:0,transform:0}),C=q({setState:u,setLayoutState:p,setEngineState:l}),g=Ce(s,o,n.rawData,n.result,C.setRawData,C.setResult,c?.version??null),h=Se({setState:u,setLayoutState:p,setEngineState:l,progressEventTarget:m,validatorRegistry:y,sanitizerRegistry:x,transformRegistry:d,activeWorkerRef:f,phaseTimingsRef:b});tt(()=>()=>{let v=f.current;v&&(v.terminate(),f.current=null)},[]);let R=F(()=>({...n,layout:c,engine:S,progressEventTarget:m,...h,onSubmit:a??null,submitKeyMap:i??null,persist:s,persistKey:o,hasRecoverableSession:g.hasRecoverableSession,recoverSession:g.recoverSession,clearPersistedState:g.clearPersistedState}),[n,c,S,m,a,i,h,s,o,g.hasRecoverableSession,g.recoverSession,g.clearPersistedState]);return rt(N.Provider,{value:R,children:t})}import{useContext as ot}from"react";function w(){let t=ot(N);if(t===null)throw new Error("useImporter must be used within an ImporterProvider");return t}import{useCallback as nt,useEffect as Te,useMemo as Ie}from"react";function A(t){return t.rows.filter(e=>e.errors.length>0)}function H(t){return t?K(t).totalErrors>0:!1}function K(t){let e=t.rows.length,r=A(t),s=t.errors.length+t.rows.reduce((o,a)=>o+a.errors.length+a.cells.reduce((i,n)=>i+n.errors.length,0),0);return{totalRows:e,rowsWithErrors:r.length,totalErrors:s}}function ne(t,e){return t.cells.find(s=>s.key===e)?.value}function se(t,e){return t.map(e)}function W(t,e){return t?t.rows.map(r=>{let s={};for(let[o,a]of Object.entries(e))s[a]=ne(r,o);return s}):[]}function st(t){return t.rows.map(e=>e.cells.reduce((r,s)=>({...r,[s.key]:s.value}),{}))}function ke(t={}){let e=w(),{layout:r,engine:s}=t;Te(()=>{r!==void 0&&e.setLayout(r)},[e,r]),Te(()=>{s!==void 0&&e.setEngine(s)},[e,s]);let o=Ie(()=>!!(e.result&&e.status==="success"&&!e.submitDone&&!H(e.result)),[e.result,e.status,e.submitDone]),a=nt(()=>{if(!e.result||e.submitDone||H(e.result)||!e.onSubmit)return;let i=e.submitKeyMap?W(e.result,e.submitKeyMap):st(e.result);e.onSubmit(i),e.setSubmitDone(!0)},[e]);return Ie(()=>({processFile:e.processFile,registerValidator:e.registerValidator,registerSanitizer:e.registerSanitizer,registerTransform:e.registerTransform,abort:e.abort,metrics:e.metrics,submit:a,canSubmit:o,submitDone:e.submitDone}),[e.processFile,e.registerValidator,e.registerSanitizer,e.registerTransform,e.abort,e.metrics,a,o,e.submitDone])}import{useCallback as ut,useEffect as ct}from"react";import{useCallback as Me,useEffect as it,useRef as at,useState as lt}from"react";import*as J from"comlink";function je(){return new URL("./parser.worker.js",import.meta.url).href}function Oe(){let{setActiveWorker:t,dispatchProgress:e}=w(),[r,s]=lt(null),o=at(null);it(()=>{let n=new Worker(je(),{type:"module"});o.current=n,t(n);let u=J.wrap(n);return queueMicrotask(()=>s(u)),()=>{n.terminate(),o.current=null,t(null)}},[t]);let a=Me(async(n,u={})=>{if(!r)throw new Error("Parser worker not ready");return r.load(n,u)},[r]),i=Me(async n=>{if(!r)throw new Error("Parser worker not ready");let u=n?J.proxy(n):void 0;return r.parseAll(u)},[r]);return{load:a,parseAll:i,dispatchProgress:e,isReady:!!r}}function Le(t){let e=Object.keys(t.sheets);return e.length===0?null:t.sheets[e[0]??""]??null}function De(){let t=w(),{load:e,parseAll:r,isReady:s}=Oe();return ct(()=>{let{file:a,status:i,engine:n}=t;!s||!a||i!=="loading"||e(a,{maxRows:10,fileName:a.name,engine:n??void 0}).then(u=>{if(!Le(u)){t.setStatus("error");return}let p=u.sheets[Object.keys(u.sheets)[0]??""];if(!p){t.setStatus("error");return}t.setRawData(p),t.setDocumentHash(p.documentHash),t.setStatus("success")}).catch(()=>{t.setStatus("error")})},[s,t.file,t.status,t.setRawData,t.setDocumentHash,t.setStatus,e]),{startFullImport:ut(()=>{let{file:a}=t;if(!a)return Promise.reject(new Error("No file loaded"));t.setStatus("loading");let i=performance.now();return r(n=>t.dispatchProgress(n)).then(n=>{let u=performance.now();if(t.setPhaseTiming("parse",u-i),!Le(n))return t.setStatus("error"),n;let p=n.sheets[Object.keys(n.sheets)[0]??""];return p?(t.setRawData(p),t.setDocumentHash(p.documentHash),t.setStatus("success"),n):(t.setStatus("error"),n)})},[t,r])}}import{useCallback as G,useMemo as Fe}from"react";function ie(t,e,r,s){let o=[...r],a=new Map;t.headers.forEach((n,u)=>a.set(n,u));let i=t.rows.map(n=>{let u=r.map(c=>{let p=s[c],S=p!=null?(()=>{let l=a.get(p);return l==null?null:n.cells[l]?.value??null})():null;return{key:c,value:S??null}});return{index:n.index,cells:u}});return{name:t.name,filesize:t.filesize,documentHash:t.documentHash,rowsCount:t.rowsCount,headersCount:t.headersCount,headers:o,rows:i}}function Ve(t){return t.trim().toLowerCase().normalize("NFD").replace(/\p{Diacritic}/gu,"")}function pt(t,e){if(t.length===0)return e.length;if(e.length===0)return t.length;let r=Array.from({length:e.length+1},(s,o)=>o);for(let s=1;s<=t.length;s++){let o=[s];for(let a=1;a<=e.length;a++){let i=t[s-1]===e[a-1]?0:1;o[a]=Math.min(o[a-1]+1,r[a]+1,r[a-1]+i)}r=o}return r[e.length]}function mt(t,e){let r=Ve(t),s=Ve(e),o=r.length>=s.length?r:s,a=r.length<s.length?r:s;if(o.length===0)return 1;let i=pt(o,a);return(o.length-i)/o.length}var dt=.8;function _e(t,e,r={}){let s=r.threshold??dt,o=[];for(let u of e)for(let c of t){let p=mt(u,c);p>=s&&o.push({key:u,header:c,score:p})}o.sort((u,c)=>c.score-u.score);let a=new Set,i=new Set,n={};for(let u of e)n[u]=null;for(let{key:u,header:c,score:p}of o)a.has(u)||i.has(c)||(n[u]=c,a.add(u),i.add(c));return e.map(u=>({key:u,matchedHeader:n[u]??null}))}function ft(t,e){let r=t.trim();return e?r:r.toLowerCase()}function ae(t,e,r={},s={}){let o=s.caseSensitive??!1,a=s.normalizer??(l=>ft(l,o)),i=Object.keys(e.fields),n=t.headers,u=new Map;for(let l of n)u.set(a(l),l);let c={},p=new Set;for(let[l,m]of Object.entries(r))i.includes(m)&&(c[m]=n.includes(l)?l:null,c[m]&&p.add(l));for(let l of i){if(c[l]!=null)continue;let m=a(l),y=u.get(m);y!=null&&!p.has(y)?(c[l]=y,p.add(y)):c[l]=null}if(s.fuzzyHeaders===!0){let l=i.filter(d=>c[d]==null),m=n.filter(d=>!p.has(d)),y=s.fuzzyThreshold??.8,x=_e(m,l,{threshold:y});for(let{key:d,matchedHeader:f}of x)f!=null&&!p.has(f)&&(c[d]=f,p.add(f))}let S=[];for(let l of i)if(c[l]==null){let x=e.fields[l]?.required!==!1;S.push({expected:l,found:null,message:`Column '${l}' not found in file`,required:x})}return{fieldToHeader:c,mismatches:S}}function $(t,e,r={},s){let o=Object.keys(e.fields),a=s?.columnOrder?.length?s.columnOrder:o,i=s?.headerToFieldMap??{},{fieldToHeader:n,mismatches:u}=ae(t,e,i,r),p=o.filter(m=>e.fields[m]?.required!==!1).every(m=>n[m]!=null);if(u.length===0||p)return{kind:"success",sheet:ie(t,e,a,n)};let l=u.some(m=>m.required===!0);return{kind:"mismatch",headersFound:[...t.headers],mismatches:u,columnOrder:[...a],headerToFieldMap:{...i},layoutError:l}}function Y(){let t=w(),{rawData:e,layout:r,convertedSheet:s,convertResultData:o,setConvertedSheet:a,setConvertResultData:i}=t,n=G(l=>{if(!e||!r)return;let m=$(e,r,l,o??void 0);m.kind==="success"?a(m.sheet):i({headersFound:m.headersFound,mismatches:m.mismatches,columnOrder:m.columnOrder,headerToFieldMap:m.headerToFieldMap})},[e,r,o,a,i]),u=G(()=>{if(!e||!r||!o)return;let l=$(e,r,{},{columnOrder:o.columnOrder,headerToFieldMap:o.headerToFieldMap});return l.kind==="success"?(a(l.sheet),{kind:"success",sheet:l.sheet}):(i({headersFound:l.headersFound,mismatches:l.mismatches,columnOrder:l.columnOrder,headerToFieldMap:l.headerToFieldMap}),{kind:"mismatch",result:l})},[e,r,o,a,i]),c=G(l=>{i(m=>m&&{...m,columnOrder:l})},[i]),p=G((l,m)=>{i(y=>y&&{...y,headerToFieldMap:{...y.headerToFieldMap,[l]:m}})},[i]),S=Fe(()=>o?{kind:"mismatch",headersFound:o.headersFound,mismatches:o.mismatches,columnOrder:[...o.columnOrder],headerToFieldMap:{...o.headerToFieldMap},reorderColumns:c,renameColumn:p,applyMapping:()=>u()??{kind:"mismatch",result:{...o,kind:"mismatch"}}}:null,[o,c,p,u]);return Fe(()=>({convert:n,convertedSheet:s,convertResult:S}),[n,s,S])}import{useMemo as ht}from"react";function Ae(){let t=w();return ht(()=>({status:t.status,progressEventTarget:t.progressEventTarget}),[t.status,t.progressEventTarget])}import{useCallback as He,useMemo as We}from"react";function ze(){let e=w().result,r=We(()=>e?[...e.errors]:[],[e]),s=He(a=>e?se(e.rows,a):[],[e]),o=He(a=>W(e,a),[e]);return We(()=>({sheet:e,errors:r,toObjects:s,toObjectsWithKeyMap:o}),[e,r,s,o])}import{useCallback as ue,useMemo as ce,useRef as wt}from"react";import{useCallback as yt,useEffect as gt,useRef as St,useState as Rt}from"react";import*as Ue from"comlink";function Ne(){return new URL("./edit.worker.js",import.meta.url).href}function Be(){let[t,e]=Rt(null),r=St(null);return gt(()=>{let o=new Worker(Ne(),{type:"module"});r.current=o;let a=Ue.wrap(o);return queueMicrotask(()=>e(a)),()=>{o.terminate(),r.current=null}},[]),{runEdit:yt(async(o,a,i,n,u,c)=>{if(!t)throw new Error("Edit worker not ready");return t.runEdit(o,a,i,n,u,c??{})},[t]),isReady:!!t}}function qe(t,e,r){return le(t.rows,e,r)}function le(t,e,r){let s=t.length,o=r<=0?0:Math.max(1,Math.ceil(s/r)),a=Math.max(1,Math.min(e,o)),i=(a-1)*r,n=Math.min(i+r,s),u=t.slice(i,n);return{page:a,pageSize:r,totalCount:s,totalPages:o,rows:u}}function X(t={}){let{result:e,setResult:r,layout:s,changeLog:o,addChangeLogEntry:a,submitDone:i}=w(),{runEdit:n,isReady:u}=Be(),c=!i,{page:p=1,pageSize:S=25,debounceMs:l}=t,m=wt(null),y=ce(()=>e?qe(e,p,S):{page:1,pageSize:S,totalCount:0,totalPages:0,rows:[]},[e,p,S]),x=y.totalPages,d=ue(g=>{if(!e||!s||i)return Promise.resolve();let h=Q(e,g.rowIndex)&&he(Q(e,g.rowIndex),g.cellKey)?.value;return n(e,s,g.rowIndex,g.cellKey,g.value).then(R=>{r(R),queueMicrotask(()=>{let v={type:"cell_edit",rowIndex:g.rowIndex,cellKey:g.cellKey,value:g.value,previousValue:h,timestamp:Date.now()};a(v)})})},[e,s,i,n,r,a]),f=ue(g=>{if(l!=null&&l>0){m.current&&clearTimeout(m.current),m.current=setTimeout(()=>{m.current=null,d(g)},l);return}return d(g)},[l,d]),b=ue(g=>{if(!e||i)return;let h=ye(e,g);r(h),queueMicrotask(()=>{let R={type:"row_remove",rowIndex:g,timestamp:Date.now()};a(R)})},[e,i,r,a]),C=ce(()=>U(o),[o]);return ce(()=>({sheet:e,editCell:f,removeRow:b,pageData:y,totalPages:x,isReady:u,canEdit:c,changeLog:o,changeLogAsText:C}),[e,f,b,y,x,u,c,o,C])}import{useCallback as D,useMemo as z,useState as Et}from"react";function Ke(t,e){return t.includes(e)||t.includes('"')||t.includes(`
|
|
3
|
+
`)||t.includes("\r")?'"'+t.replace(/"/g,'""')+'"':t}function xt(t,e){return t==null?"":t instanceof Date?e?t.toLocaleString():t.toISOString():String(t)}function pe(t,e,r={}){let{includeHeaders:s=!0,csvSeparator:o=",",formatDatesForExport:a=!1}=r,i=e!=null?Object.keys(e.fields):[],n=i.length>0?i:t.rows[0]?.cells.map(p=>p.key)??t.headers.slice(),u=[];s&&n.length>0&&u.push(n.map(p=>Ke(p,o)).join(o));for(let p of t.rows){let S=n.map(l=>{let y=p.cells.find(x=>x.key===l)?.value??"";return Ke(xt(y,a),o)});u.push(S.join(o))}return"\uFEFF"+u.join(`\r
|
|
4
|
+
`)}function vt(t,e){return t==null?null:t instanceof Date?e?t.toLocaleString():t.toISOString():t}function me(t,e,r={}){let{formatDatesForExport:s=!1}=r,o=t.rows.map(a=>{let i={};for(let n of a.cells)i[n.key]=vt(n.value,s);return i});return JSON.stringify(o,null,0)}function de(t={}){let{page:e=1,defaultPageSize:r=25,filterMode:s="all"}=t,[o,a]=Et(e),i=r,{sheet:n,editCell:u,removeRow:c,changeLog:p,changeLogAsText:S}=X({}),l=w(),m=z(()=>n?A(n):[],[n]),y=z(()=>s==="errors-only"?m:n?.rows??[],[s,m,n]),x=y.length,d=D((E,I)=>le(y,E??o,I??i),[o,i,y]),f=z(()=>d(o,i).rows,[d,o,i]),b=D((E,I)=>{let j=(E-1)*I;return y.slice(j,j+I)},[y]),C=z(()=>n?K(n):{totalRows:0,rowsWithErrors:0,totalErrors:0},[n]),g=D(E=>!n||!l.layout?"":pe(n,l.layout,E??{}),[n,l.layout]),h=D(E=>n?me(n,l.layout??null,E??{}):"[]",[n,l.layout]),R=D(async E=>{let I=g(E);if(!I)return;let j=new Blob([I],{type:"text/csv;charset=utf-8"}),L=URL.createObjectURL(j),M=document.createElement("a");M.href=L,M.download=(E?.filename??"export")+".csv",M.click(),URL.revokeObjectURL(L)},[g]),v=D(async E=>{let I=h(E),j=new Blob([I],{type:"application/json"}),L=URL.createObjectURL(j),M=document.createElement("a");M.href=L,M.download=(E?.filename??"export")+".json",M.click(),URL.revokeObjectURL(L)},[h]);return z(()=>({sheet:n,getPaginatedResult:d,paginatedRows:f,page:o,setPage:a,pageSize:i,totalRows:x,getRows:b,rowsWithErrors:m,counts:C,editCell:u,removeRow:c,changeLog:p,changeLogAsText:S,exportToCSV:g,exportToJSON:h,downloadCSV:R,downloadJSON:v,hasRecoverableSession:l.hasRecoverableSession,recoverSession:l.recoverSession,clearPersistedState:l.clearPersistedState}),[n,d,f,o,i,x,b,m,C,u,c,p,S,g,h,R,v,l.hasRecoverableSession,l.recoverSession,l.clearPersistedState])}import{useCallback as Pt,useEffect as Ct}from"react";function fe(){let e=w().progressEventTarget,r=Pt(s=>{let o=a=>{s(a.detail)};return e.addEventListener(O,o),()=>{e.removeEventListener(O,o)}},[e]);return{progressEventTarget:e,subscribeToProgress:r}}function Je(t){let{subscribeToProgress:e}=fe();Ct(()=>e(t),[e,t])}export{B as IMPORTER_ABORTED_EVENT,O as IMPORTER_PROGRESS_EVENT,oe as ImportProvider,oe as ImporterProvider,V as Registry,U as formatChangeLogAsText,ne as getCellValue,H as hasValidationErrors,Y as useConvert,De as useImportSheet,ke as useImporter,fe as useImporterEventTarget,Je as useImporterProgressSubscription,Ae as useImporterStatus,ze as useSheetData,X as useSheetEditor,de as useSheetView};
|
|
5
|
+
//# sourceMappingURL=index.js.map
|