@agile-team/mach-table-xlsx 0.19.1 → 0.23.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/index.cjs +0 -1
- package/dist/index.js +0 -1
- package/package.json +2 -2
- package/dist/index.cjs.map +0 -1
- package/dist/index.js.map +0 -1
package/dist/index.cjs
CHANGED
|
@@ -1,3 +1,2 @@
|
|
|
1
1
|
"use strict";var w=Object.defineProperty;var b=Object.getOwnPropertyDescriptor;var y=Object.getOwnPropertyNames;var S=Object.prototype.hasOwnProperty;var E=(e,o)=>{for(var n in o)w(e,n,{get:o[n],enumerable:!0})},T=(e,o,n,t)=>{if(o&&typeof o=="object"||typeof o=="function")for(let r of y(o))!S.call(e,r)&&r!==n&&w(e,r,{get:()=>o[r],enumerable:!(t=b(o,r))||t.enumerable});return e};var _=e=>T(w({},"__esModule",{value:!0}),e);var A={};E(A,{createXlsxExtension:()=>G,exportGridToXlsx:()=>h,importGridFromXlsx:()=>k});module.exports=_(A);var x=require("@agile-team/mach-table");function f(e){return typeof e=="object"&&e!==null&&"utils"in e}async function m(e){let o=typeof e=="function"?await e():e,n=typeof o=="object"&&o!==null&&"default"in o?o.default:void 0,t=f(o)?o:f(n)?n:void 0;if(!t?.utils?.book_new||!t.utils.aoa_to_sheet||!t.utils.book_append_sheet)throw new TypeError("[MachTable] Invalid XLSX engine adapter.");return t}function N(e){return(e??"Data").replace(/[\\/?*\[\]:]/g," ").trim().slice(0,31)||"Data"}function P(e){let n=(e?.trim()||"mach-table.xlsx").replace(/[\\/:*?"<>|\u0000-\u001f]/g," ").trim()||"mach-table.xlsx";return/\.xlsx$/i.test(n)?n:`${n}.xlsx`}function g(e){let o=e??",";if(o.length!==1||/["\r\n]/.test(o))throw new TypeError("[MachTable] XLSX CSV bridge requires a single non-quote separator character.");return o}async function h(e,o,n={}){let t=await m(o),r=g(n.columnSeparator),s=e.getDataAsCsv(n),a=(0,x.parseCsv)(s,r).map((d,l)=>d.map((c,X)=>n.transformCell?.(c,l,X)??c)),i=t.utils.book_new(),p=t.utils.aoa_to_sheet(a);t.utils.book_append_sheet(i,p,N(n.sheetName));let u=P(n.fileName);if(t.writeFileXLSX)await t.writeFileXLSX(i,u,n.writeOptions);else if(t.writeFile)await t.writeFile(i,u,n.writeOptions);else throw new TypeError("[MachTable] XLSX engine must expose writeFileXLSX or writeFile.");return i}function F(e,o){let n="";return typeof e=="string"?n=e:typeof e=="number"||typeof e=="boolean"||typeof e=="bigint"?n=e.toString():typeof e=="symbol"?n=e.description??"":typeof e=="function"?n=e.name:e!=null&&(n=JSON.stringify(e)??""),n.includes(o)||/["\n\r]/.test(n)?`"${n.replace(/"/g,'""')}"`:n}async function k(e,o,n,t={}){let r=await m(o);if(!r.read||!r.utils.sheet_to_json)throw new TypeError("[MachTable] XLSX import requires engine.read and utils.sheet_to_json.");let s=r.read(n,t.readOptions);if(!s||!Array.isArray(s.SheetNames)||!s.Sheets||typeof s.Sheets!="object")throw new TypeError("[MachTable] XLSX engine returned an invalid workbook.");let a=typeof t.sheet=="number"?s.SheetNames[t.sheet]:t.sheet??s.SheetNames[0];if(!a||!(a in s.Sheets))throw new RangeError(`[MachTable] Worksheet not found: ${String(t.sheet??0)}.`);let i=r.utils.sheet_to_json(s.Sheets[a],{header:1,raw:!1});if(!Array.isArray(i)||i.some(l=>!Array.isArray(l)))throw new TypeError("[MachTable] XLSX worksheet must resolve to an array of rows.");let p=g(t.separator),u=i.map(l=>l.map(c=>F(c,p)).join(p)).join(`
|
|
2
2
|
`),d={separator:t.separator,mode:t.mode,headerRowIndex:t.headerRowIndex,coerceNumbers:t.coerceNumbers,parseValue:t.parseValue};return e.importCsv(u,d)}function G(e){return{export(o,n){return h(o,e,n)},import(o,n,t){return k(o,e,n,t)}}}0&&(module.exports={createXlsxExtension,exportGridToXlsx,importGridFromXlsx});
|
|
3
|
-
//# sourceMappingURL=index.cjs.map
|
package/dist/index.js
CHANGED
|
@@ -1,3 +1,2 @@
|
|
|
1
1
|
import{parseCsv as g}from"@agile-team/mach-table";function w(e){return typeof e=="object"&&e!==null&&"utils"in e}async function f(e){let t=typeof e=="function"?await e():e,n=typeof t=="object"&&t!==null&&"default"in t?t.default:void 0,o=w(t)?t:w(n)?n:void 0;if(!o?.utils?.book_new||!o.utils.aoa_to_sheet||!o.utils.book_append_sheet)throw new TypeError("[MachTable] Invalid XLSX engine adapter.");return o}function h(e){return(e??"Data").replace(/[\\/?*\[\]:]/g," ").trim().slice(0,31)||"Data"}function k(e){let n=(e?.trim()||"mach-table.xlsx").replace(/[\\/:*?"<>|\u0000-\u001f]/g," ").trim()||"mach-table.xlsx";return/\.xlsx$/i.test(n)?n:`${n}.xlsx`}function x(e){let t=e??",";if(t.length!==1||/["\r\n]/.test(t))throw new TypeError("[MachTable] XLSX CSV bridge requires a single non-quote separator character.");return t}async function X(e,t,n={}){let o=await f(t),i=x(n.columnSeparator),r=e.getDataAsCsv(n),a=g(r,i).map((d,l)=>d.map((c,m)=>n.transformCell?.(c,l,m)??c)),s=o.utils.book_new(),p=o.utils.aoa_to_sheet(a);o.utils.book_append_sheet(s,p,h(n.sheetName));let u=k(n.fileName);if(o.writeFileXLSX)await o.writeFileXLSX(s,u,n.writeOptions);else if(o.writeFile)await o.writeFile(s,u,n.writeOptions);else throw new TypeError("[MachTable] XLSX engine must expose writeFileXLSX or writeFile.");return s}function b(e,t){let n="";return typeof e=="string"?n=e:typeof e=="number"||typeof e=="boolean"||typeof e=="bigint"?n=e.toString():typeof e=="symbol"?n=e.description??"":typeof e=="function"?n=e.name:e!=null&&(n=JSON.stringify(e)??""),n.includes(t)||/["\n\r]/.test(n)?`"${n.replace(/"/g,'""')}"`:n}async function y(e,t,n,o={}){let i=await f(t);if(!i.read||!i.utils.sheet_to_json)throw new TypeError("[MachTable] XLSX import requires engine.read and utils.sheet_to_json.");let r=i.read(n,o.readOptions);if(!r||!Array.isArray(r.SheetNames)||!r.Sheets||typeof r.Sheets!="object")throw new TypeError("[MachTable] XLSX engine returned an invalid workbook.");let a=typeof o.sheet=="number"?r.SheetNames[o.sheet]:o.sheet??r.SheetNames[0];if(!a||!(a in r.Sheets))throw new RangeError(`[MachTable] Worksheet not found: ${String(o.sheet??0)}.`);let s=i.utils.sheet_to_json(r.Sheets[a],{header:1,raw:!1});if(!Array.isArray(s)||s.some(l=>!Array.isArray(l)))throw new TypeError("[MachTable] XLSX worksheet must resolve to an array of rows.");let p=x(o.separator),u=s.map(l=>l.map(c=>b(c,p)).join(p)).join(`
|
|
2
2
|
`),d={separator:o.separator,mode:o.mode,headerRowIndex:o.headerRowIndex,coerceNumbers:o.coerceNumbers,parseValue:o.parseValue};return e.importCsv(u,d)}function E(e){return{export(t,n){return X(t,e,n)},import(t,n,o){return y(t,e,n,o)}}}export{E as createXlsxExtension,X as exportGridToXlsx,y as importGridFromXlsx};
|
|
3
|
-
//# sourceMappingURL=index.js.map
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@agile-team/mach-table-xlsx",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.23.0",
|
|
4
4
|
"description": "Optional, engine-agnostic XLSX import and export extension for MachTable",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"data-grid",
|
|
@@ -48,7 +48,7 @@
|
|
|
48
48
|
],
|
|
49
49
|
"sideEffects": false,
|
|
50
50
|
"dependencies": {
|
|
51
|
-
"@agile-team/mach-table": "0.
|
|
51
|
+
"@agile-team/mach-table": "0.23.0"
|
|
52
52
|
},
|
|
53
53
|
"scripts": {
|
|
54
54
|
"build": "tsup",
|
package/dist/index.cjs.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["import {\n parseCsv,\n type CsvExportParams,\n type GridApi,\n type ImportCsvOptions\n} from \"@agile-team/mach-table\";\n\nexport interface XlsxWorkbook {\n SheetNames: string[];\n Sheets: Record<string, unknown>;\n}\n\nexport interface XlsxEngine {\n utils: {\n book_new(): XlsxWorkbook;\n aoa_to_sheet(rows: readonly (readonly unknown[])[]): unknown;\n book_append_sheet(workbook: XlsxWorkbook, sheet: unknown, name?: string): void;\n sheet_to_json?(sheet: unknown, options?: Record<string, unknown>): unknown[][];\n };\n writeFileXLSX?(workbook: XlsxWorkbook, filename: string, options?: Record<string, unknown>): void | Promise<void>;\n writeFile?(workbook: XlsxWorkbook, filename: string, options?: Record<string, unknown>): void | Promise<void>;\n read?(data: unknown, options?: Record<string, unknown>): XlsxWorkbook;\n}\n\nexport type XlsxEngineModule = XlsxEngine | { default: XlsxEngine };\nexport type XlsxEngineSource = XlsxEngineModule | (() => Promise<XlsxEngineModule>);\n\nexport interface ExportGridToXlsxParams extends CsvExportParams {\n fileName?: string;\n sheetName?: string;\n writeOptions?: Record<string, unknown>;\n transformCell?(value: string, rowIndex: number, columnIndex: number): unknown;\n}\n\nexport interface ImportGridFromXlsxParams extends ImportCsvOptions {\n sheet?: string | number;\n readOptions?: Record<string, unknown>;\n}\n\nfunction isEngine(value: unknown): value is XlsxEngine {\n return typeof value === \"object\" && value !== null && \"utils\" in value;\n}\n\nasync function resolveEngine(source: XlsxEngineSource): Promise<XlsxEngine> {\n const loaded = typeof source === \"function\" ? await source() : source;\n const moduleDefault = typeof loaded === \"object\" && loaded !== null && \"default\" in loaded\n ? loaded.default\n : undefined;\n const engine = isEngine(loaded) ? loaded : isEngine(moduleDefault) ? moduleDefault : undefined;\n if (!engine?.utils?.book_new || !engine.utils.aoa_to_sheet || !engine.utils.book_append_sheet) {\n throw new TypeError(\"[MachTable] Invalid XLSX engine adapter.\");\n }\n return engine;\n}\n\nfunction safeSheetName(value: string | undefined): string {\n const name = (value ?? \"Data\").replace(/[\\\\/?*\\[\\]:]/g, \" \").trim().slice(0, 31);\n return name || \"Data\";\n}\n\nfunction safeFileName(value: string | undefined): string {\n const input = value?.trim() || \"mach-table.xlsx\";\n const name = input.replace(/[\\\\/:*?\"<>|\\u0000-\\u001f]/g, \" \").trim() || \"mach-table.xlsx\";\n return /\\.xlsx$/i.test(name) ? name : `${name}.xlsx`;\n}\n\nfunction safeSeparator(value: string | undefined): string {\n const separator = value ?? \",\";\n if (separator.length !== 1 || /[\"\\r\\n]/.test(separator)) {\n throw new TypeError(\"[MachTable] XLSX CSV bridge requires a single non-quote separator character.\");\n }\n return separator;\n}\n\n/** Uses a lazily supplied workbook engine, keeping it out of the main grid bundle. */\nexport async function exportGridToXlsx<TData>(\n api: GridApi<TData>,\n source: XlsxEngineSource,\n params: ExportGridToXlsxParams = {}\n): Promise<XlsxWorkbook> {\n const engine = await resolveEngine(source);\n const separator = safeSeparator(params.columnSeparator);\n const csv = api.getDataAsCsv(params);\n const rows = parseCsv(csv, separator).map((row, rowIndex) =>\n row.map((value, columnIndex) => params.transformCell?.(value, rowIndex, columnIndex) ?? value)\n );\n const workbook = engine.utils.book_new();\n const sheet = engine.utils.aoa_to_sheet(rows);\n engine.utils.book_append_sheet(workbook, sheet, safeSheetName(params.sheetName));\n const fileName = safeFileName(params.fileName);\n if (engine.writeFileXLSX) await engine.writeFileXLSX(workbook, fileName, params.writeOptions);\n else if (engine.writeFile) await engine.writeFile(workbook, fileName, params.writeOptions);\n else throw new TypeError(\"[MachTable] XLSX engine must expose writeFileXLSX or writeFile.\");\n return workbook;\n}\n\nfunction csvCell(value: unknown, separator: string): string {\n let text = \"\";\n if (typeof value === \"string\") text = value;\n else if (typeof value === \"number\" || typeof value === \"boolean\" || typeof value === \"bigint\") text = value.toString();\n else if (typeof value === \"symbol\") text = value.description ?? \"\";\n else if (typeof value === \"function\") text = value.name;\n else if (value != null) text = JSON.stringify(value) ?? \"\";\n return text.includes(separator) || /[\"\\n\\r]/.test(text)\n ? `\"${text.replace(/\"/g, '\"\"')}\"`\n : text;\n}\n\n/** Reads the selected worksheet through the host engine and reuses core's safe CSV importer. */\nexport async function importGridFromXlsx<TData>(\n api: GridApi<TData>,\n source: XlsxEngineSource,\n data: unknown,\n params: ImportGridFromXlsxParams = {}\n): Promise<boolean> {\n const engine = await resolveEngine(source);\n if (!engine.read || !engine.utils.sheet_to_json) {\n throw new TypeError(\"[MachTable] XLSX import requires engine.read and utils.sheet_to_json.\");\n }\n const workbook = engine.read(data, params.readOptions);\n if (!workbook || !Array.isArray(workbook.SheetNames) || !workbook.Sheets || typeof workbook.Sheets !== \"object\") {\n throw new TypeError(\"[MachTable] XLSX engine returned an invalid workbook.\");\n }\n const sheetName = typeof params.sheet === \"number\"\n ? workbook.SheetNames[params.sheet]\n : params.sheet ?? workbook.SheetNames[0];\n if (!sheetName || !(sheetName in workbook.Sheets)) {\n throw new RangeError(`[MachTable] Worksheet not found: ${String(params.sheet ?? 0)}.`);\n }\n const rows = engine.utils.sheet_to_json(workbook.Sheets[sheetName], { header: 1, raw: false });\n if (!Array.isArray(rows) || rows.some((row) => !Array.isArray(row))) {\n throw new TypeError(\"[MachTable] XLSX worksheet must resolve to an array of rows.\");\n }\n const separator = safeSeparator(params.separator);\n const csv = rows.map((row) => row.map((value) => csvCell(value, separator)).join(separator)).join(\"\\n\");\n const csvOptions: ImportCsvOptions = {\n separator: params.separator,\n mode: params.mode,\n headerRowIndex: params.headerRowIndex,\n coerceNumbers: params.coerceNumbers,\n parseValue: params.parseValue\n };\n return api.importCsv(csv, csvOptions);\n}\n\nexport function createXlsxExtension(source: XlsxEngineSource) {\n return {\n export<TData>(api: GridApi<TData>, params?: ExportGridToXlsxParams) {\n return exportGridToXlsx(api, source, params);\n },\n import<TData>(api: GridApi<TData>, data: unknown, params?: ImportGridFromXlsxParams) {\n return importGridFromXlsx(api, source, data, params);\n }\n };\n}\n"],"mappings":"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","names":["index_exports","__export","createXlsxExtension","exportGridToXlsx","importGridFromXlsx","__toCommonJS","import_mach_table","isEngine","value","resolveEngine","source","loaded","moduleDefault","engine","safeSheetName","safeFileName","name","safeSeparator","separator","api","params","csv","rows","row","rowIndex","columnIndex","workbook","sheet","fileName","csvCell","text","data","sheetName","csvOptions"]}
|
package/dist/index.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["import {\n parseCsv,\n type CsvExportParams,\n type GridApi,\n type ImportCsvOptions\n} from \"@agile-team/mach-table\";\n\nexport interface XlsxWorkbook {\n SheetNames: string[];\n Sheets: Record<string, unknown>;\n}\n\nexport interface XlsxEngine {\n utils: {\n book_new(): XlsxWorkbook;\n aoa_to_sheet(rows: readonly (readonly unknown[])[]): unknown;\n book_append_sheet(workbook: XlsxWorkbook, sheet: unknown, name?: string): void;\n sheet_to_json?(sheet: unknown, options?: Record<string, unknown>): unknown[][];\n };\n writeFileXLSX?(workbook: XlsxWorkbook, filename: string, options?: Record<string, unknown>): void | Promise<void>;\n writeFile?(workbook: XlsxWorkbook, filename: string, options?: Record<string, unknown>): void | Promise<void>;\n read?(data: unknown, options?: Record<string, unknown>): XlsxWorkbook;\n}\n\nexport type XlsxEngineModule = XlsxEngine | { default: XlsxEngine };\nexport type XlsxEngineSource = XlsxEngineModule | (() => Promise<XlsxEngineModule>);\n\nexport interface ExportGridToXlsxParams extends CsvExportParams {\n fileName?: string;\n sheetName?: string;\n writeOptions?: Record<string, unknown>;\n transformCell?(value: string, rowIndex: number, columnIndex: number): unknown;\n}\n\nexport interface ImportGridFromXlsxParams extends ImportCsvOptions {\n sheet?: string | number;\n readOptions?: Record<string, unknown>;\n}\n\nfunction isEngine(value: unknown): value is XlsxEngine {\n return typeof value === \"object\" && value !== null && \"utils\" in value;\n}\n\nasync function resolveEngine(source: XlsxEngineSource): Promise<XlsxEngine> {\n const loaded = typeof source === \"function\" ? await source() : source;\n const moduleDefault = typeof loaded === \"object\" && loaded !== null && \"default\" in loaded\n ? loaded.default\n : undefined;\n const engine = isEngine(loaded) ? loaded : isEngine(moduleDefault) ? moduleDefault : undefined;\n if (!engine?.utils?.book_new || !engine.utils.aoa_to_sheet || !engine.utils.book_append_sheet) {\n throw new TypeError(\"[MachTable] Invalid XLSX engine adapter.\");\n }\n return engine;\n}\n\nfunction safeSheetName(value: string | undefined): string {\n const name = (value ?? \"Data\").replace(/[\\\\/?*\\[\\]:]/g, \" \").trim().slice(0, 31);\n return name || \"Data\";\n}\n\nfunction safeFileName(value: string | undefined): string {\n const input = value?.trim() || \"mach-table.xlsx\";\n const name = input.replace(/[\\\\/:*?\"<>|\\u0000-\\u001f]/g, \" \").trim() || \"mach-table.xlsx\";\n return /\\.xlsx$/i.test(name) ? name : `${name}.xlsx`;\n}\n\nfunction safeSeparator(value: string | undefined): string {\n const separator = value ?? \",\";\n if (separator.length !== 1 || /[\"\\r\\n]/.test(separator)) {\n throw new TypeError(\"[MachTable] XLSX CSV bridge requires a single non-quote separator character.\");\n }\n return separator;\n}\n\n/** Uses a lazily supplied workbook engine, keeping it out of the main grid bundle. */\nexport async function exportGridToXlsx<TData>(\n api: GridApi<TData>,\n source: XlsxEngineSource,\n params: ExportGridToXlsxParams = {}\n): Promise<XlsxWorkbook> {\n const engine = await resolveEngine(source);\n const separator = safeSeparator(params.columnSeparator);\n const csv = api.getDataAsCsv(params);\n const rows = parseCsv(csv, separator).map((row, rowIndex) =>\n row.map((value, columnIndex) => params.transformCell?.(value, rowIndex, columnIndex) ?? value)\n );\n const workbook = engine.utils.book_new();\n const sheet = engine.utils.aoa_to_sheet(rows);\n engine.utils.book_append_sheet(workbook, sheet, safeSheetName(params.sheetName));\n const fileName = safeFileName(params.fileName);\n if (engine.writeFileXLSX) await engine.writeFileXLSX(workbook, fileName, params.writeOptions);\n else if (engine.writeFile) await engine.writeFile(workbook, fileName, params.writeOptions);\n else throw new TypeError(\"[MachTable] XLSX engine must expose writeFileXLSX or writeFile.\");\n return workbook;\n}\n\nfunction csvCell(value: unknown, separator: string): string {\n let text = \"\";\n if (typeof value === \"string\") text = value;\n else if (typeof value === \"number\" || typeof value === \"boolean\" || typeof value === \"bigint\") text = value.toString();\n else if (typeof value === \"symbol\") text = value.description ?? \"\";\n else if (typeof value === \"function\") text = value.name;\n else if (value != null) text = JSON.stringify(value) ?? \"\";\n return text.includes(separator) || /[\"\\n\\r]/.test(text)\n ? `\"${text.replace(/\"/g, '\"\"')}\"`\n : text;\n}\n\n/** Reads the selected worksheet through the host engine and reuses core's safe CSV importer. */\nexport async function importGridFromXlsx<TData>(\n api: GridApi<TData>,\n source: XlsxEngineSource,\n data: unknown,\n params: ImportGridFromXlsxParams = {}\n): Promise<boolean> {\n const engine = await resolveEngine(source);\n if (!engine.read || !engine.utils.sheet_to_json) {\n throw new TypeError(\"[MachTable] XLSX import requires engine.read and utils.sheet_to_json.\");\n }\n const workbook = engine.read(data, params.readOptions);\n if (!workbook || !Array.isArray(workbook.SheetNames) || !workbook.Sheets || typeof workbook.Sheets !== \"object\") {\n throw new TypeError(\"[MachTable] XLSX engine returned an invalid workbook.\");\n }\n const sheetName = typeof params.sheet === \"number\"\n ? workbook.SheetNames[params.sheet]\n : params.sheet ?? workbook.SheetNames[0];\n if (!sheetName || !(sheetName in workbook.Sheets)) {\n throw new RangeError(`[MachTable] Worksheet not found: ${String(params.sheet ?? 0)}.`);\n }\n const rows = engine.utils.sheet_to_json(workbook.Sheets[sheetName], { header: 1, raw: false });\n if (!Array.isArray(rows) || rows.some((row) => !Array.isArray(row))) {\n throw new TypeError(\"[MachTable] XLSX worksheet must resolve to an array of rows.\");\n }\n const separator = safeSeparator(params.separator);\n const csv = rows.map((row) => row.map((value) => csvCell(value, separator)).join(separator)).join(\"\\n\");\n const csvOptions: ImportCsvOptions = {\n separator: params.separator,\n mode: params.mode,\n headerRowIndex: params.headerRowIndex,\n coerceNumbers: params.coerceNumbers,\n parseValue: params.parseValue\n };\n return api.importCsv(csv, csvOptions);\n}\n\nexport function createXlsxExtension(source: XlsxEngineSource) {\n return {\n export<TData>(api: GridApi<TData>, params?: ExportGridToXlsxParams) {\n return exportGridToXlsx(api, source, params);\n },\n import<TData>(api: GridApi<TData>, data: unknown, params?: ImportGridFromXlsxParams) {\n return importGridFromXlsx(api, source, data, params);\n }\n };\n}\n"],"mappings":"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","names":["parseCsv","isEngine","value","resolveEngine","source","loaded","moduleDefault","engine","safeSheetName","safeFileName","name","safeSeparator","separator","exportGridToXlsx","api","params","csv","rows","row","rowIndex","columnIndex","workbook","sheet","fileName","csvCell","text","importGridFromXlsx","data","sheetName","csvOptions","createXlsxExtension"]}
|