@ai-matrx/office 0.8.8 → 0.8.10
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/CHANGELOG.md +31 -2
- package/dist/{chunk-5JAZ32SX.js → chunk-2X3KR6Y4.js} +2 -2
- package/dist/{chunk-5T2M6LSI.js → chunk-455FSVQN.js} +1 -1
- package/dist/chunk-455FSVQN.js.map +1 -0
- package/dist/{chunk-47MIGBMH.js → chunk-DY5TGHBI.js} +2 -2
- package/dist/{chunk-47MIGBMH.js.map → chunk-DY5TGHBI.js.map} +1 -1
- package/dist/{chunk-556EUPET.cjs → chunk-HX5TXQIX.cjs} +7 -7
- package/dist/{chunk-556EUPET.cjs.map → chunk-HX5TXQIX.cjs.map} +1 -1
- package/dist/{chunk-MQB2ZK2F.cjs → chunk-NSU6EVJK.cjs} +6 -6
- package/dist/{chunk-MQB2ZK2F.cjs.map → chunk-NSU6EVJK.cjs.map} +1 -1
- package/dist/{chunk-QZE7HBZB.cjs → chunk-O6F2NGLW.cjs} +1 -1
- package/dist/{chunk-QZE7HBZB.cjs.map → chunk-O6F2NGLW.cjs.map} +1 -1
- package/dist/{chunk-UBLEFLES.cjs → chunk-XAIKXHHJ.cjs} +1 -1
- package/dist/{chunk-UBLEFLES.cjs.map → chunk-XAIKXHHJ.cjs.map} +1 -1
- package/dist/{chunk-Z247F527.js → chunk-Y24EYKSD.js} +1 -1
- package/dist/{chunk-Z247F527.js.map → chunk-Y24EYKSD.js.map} +1 -1
- package/dist/collab-sheets-transform.cjs.map +1 -1
- package/dist/collab-sheets-transform.d.cts +2 -2
- package/dist/collab-sheets-transform.d.ts +2 -2
- package/dist/collab-sheets-transform.js.map +1 -1
- package/dist/core-page-setup-apply.cjs.map +1 -1
- package/dist/core-page-setup-apply.d.cts +1 -1
- package/dist/core-page-setup-apply.d.ts +1 -1
- package/dist/core-page-setup-apply.js.map +1 -1
- package/dist/core.cjs.map +1 -1
- package/dist/core.d.cts +1 -1
- package/dist/core.d.ts +1 -1
- package/dist/core.js.map +1 -1
- package/dist/docs-io.cjs +9 -9
- package/dist/docs-io.js +2 -2
- package/dist/docs-tools.cjs +7 -7
- package/dist/docs-tools.cjs.map +1 -1
- package/dist/docs-tools.d.cts +2 -2
- package/dist/docs-tools.d.ts +2 -2
- package/dist/docs-tools.js +2 -2
- package/dist/docs-tools.js.map +1 -1
- package/dist/docs.cjs +47 -21
- package/dist/docs.cjs.map +1 -1
- package/dist/docs.d.cts +28 -2
- package/dist/docs.d.ts +28 -2
- package/dist/docs.js +29 -3
- package/dist/docs.js.map +1 -1
- package/dist/{document-page-style-BFLrgdLI.d.cts → document-page-style-6yKEDjHE.d.cts} +2 -2
- package/dist/{document-page-style-BFLrgdLI.d.ts → document-page-style-6yKEDjHE.d.ts} +2 -2
- package/dist/{matrxImagePorts-JDFYE4QI.cjs → matrxImagePorts-46SGQTLN.cjs} +1 -1
- package/dist/matrxImagePorts-46SGQTLN.cjs.map +1 -0
- package/dist/{matrxImagePorts-VPBBUADM.js → matrxImagePorts-P6SSF25Q.js} +1 -1
- package/dist/matrxImagePorts-P6SSF25Q.js.map +1 -0
- package/dist/sheets-xlsx.cjs +27 -27
- package/dist/sheets-xlsx.cjs.map +1 -1
- package/dist/sheets-xlsx.d.cts +3 -3
- package/dist/sheets-xlsx.d.ts +3 -3
- package/dist/sheets-xlsx.js +3 -3
- package/dist/sheets-xlsx.js.map +1 -1
- package/dist/sheets.cjs.map +1 -1
- package/dist/sheets.d.cts +1 -1
- package/dist/sheets.d.ts +1 -1
- package/dist/sheets.js.map +1 -1
- package/dist/univer-collab.cjs.map +1 -1
- package/dist/univer-collab.d.cts +2 -2
- package/dist/univer-collab.d.ts +2 -2
- package/dist/univer-collab.js.map +1 -1
- package/dist/univer-realtime.cjs.map +1 -1
- package/dist/univer-realtime.js.map +1 -1
- package/dist/univer.cjs.map +1 -1
- package/dist/univer.d.cts +6 -6
- package/dist/univer.d.ts +6 -6
- package/dist/univer.js.map +1 -1
- package/dist/xlsx-to-univer-NWCHAWJC.cjs +7 -0
- package/dist/{xlsx-to-univer-AQAXU3TC.cjs.map → xlsx-to-univer-NWCHAWJC.cjs.map} +1 -1
- package/dist/xlsx-to-univer-YEYX47EE.js +7 -0
- package/package.json +3 -3
- package/dist/chunk-5T2M6LSI.js.map +0 -1
- package/dist/matrxImagePorts-JDFYE4QI.cjs.map +0 -1
- package/dist/matrxImagePorts-VPBBUADM.js.map +0 -1
- package/dist/xlsx-to-univer-AQAXU3TC.cjs +0 -7
- package/dist/xlsx-to-univer-OPMMBWEW.js +0 -7
- /package/dist/{chunk-5JAZ32SX.js.map → chunk-2X3KR6Y4.js.map} +0 -0
- /package/dist/{xlsx-to-univer-OPMMBWEW.js.map → xlsx-to-univer-YEYX47EE.js.map} +0 -0
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/sheets/xlsx-to-univer.ts","../src/sheets/xlsx-to-univer-excel.ts","../src/sheets/xlsx-shared.ts"],"sourcesContent":["/**\n * xlsxToUniverWorkbook — parse a spreadsheet file into a Univer IWorkbookData\n * suitable for `apiRef.createWorkbook(...)` and for persistence as the initial\n * snapshot of a new workbook.\n *\n * ONE reader: ExcelJS (`xlsx-to-univer-excel`) holds styles, number formats,\n * widths, heights, frozen panes, merges, validation, conditional formatting,\n * filter range, notes, links and pictures. A file that is not already an\n * .xlsx (.xls, .ods, .csv, .tsv) is first re-written as an .xlsx by the\n * Alchemy workbook door — values, formulas and merges — and read by that same\n * reader, so there is no second import path to drift.\n */\n\nimport { readWorkbook } from \"@ai-matrx/alchemy/operate/read\";\nimport { writeWorkbookBytes } from \"@ai-matrx/alchemy/operate/formats/xlsx\";\nimport type { WorkbookJson } from \"@ai-matrx/alchemy/operate/read\";\nimport type { IWorkbookData } from \"@univerjs/core\";\nimport { importXlsxWithExcelJs, type XlsxImportOptions } from \"./xlsx-to-univer-excel\";\n\n/** A legacy or text spreadsheet as .xlsx bytes (values, formulas, merges). */\nasync function legacyToXlsxBytes(file: File): Promise<ArrayBuffer> {\n const wb = await readWorkbook(file, { dates: true, formulas: true });\n const json: WorkbookJson = {\n sheets: wb.sheets.map((ws) => {\n const range = ws.range ?? { s: { r: 0, c: 0 }, e: { r: -1, c: -1 } };\n const rows: WorkbookJson[\"sheets\"][number][\"rows\"] = [];\n for (let r = 0; r <= range.e.r; r++) {\n const row: WorkbookJson[\"sheets\"][number][\"rows\"][number] = [];\n for (let c = 0; c <= range.e.c; c++) {\n const cell = ws.cell(r, c);\n if (!cell || cell.v === undefined || cell.v === null) {\n row.push(null);\n continue;\n }\n const v = cell.v instanceof Date ? cell.v.toISOString().slice(0, 10) : cell.v;\n if (cell.f) row.push({ v: typeof v === \"boolean\" || typeof v === \"number\" ? v : String(v), f: cell.f.replace(/^=/, \"\") });\n else row.push(v);\n }\n rows.push(row);\n }\n return { name: ws.name.slice(0, 31) || \"Sheet1\", rows, merges: ws.merges };\n }),\n };\n const bytes = await writeWorkbookBytes(json);\n return bytes.buffer.slice(bytes.byteOffset, bytes.byteOffset + bytes.byteLength) as ArrayBuffer;\n}\n\n/**\n * Parse a spreadsheet file into a Univer workbook. Whatever could not be\n * carried is reported through `options.onDropped` (the caller tells the person).\n */\nexport async function xlsxToUniverWorkbook(\n file: File,\n options: XlsxImportOptions = {},\n): Promise<Partial<IWorkbookData>> {\n if (/\\.xlsx$/i.test(file.name)) return importXlsxWithExcelJs(file, options);\n const data = await legacyToXlsxBytes(file);\n return importXlsxWithExcelJs({ name: file.name, arrayBuffer: async () => data }, options);\n}\n","/**\n * Full-fidelity .xlsx -> Univer reader (ExcelJS). The inverse of\n * `univer-to-xlsx.ts`: styles, number formats, column widths, row heights,\n * frozen panes, merges, data validation, conditional formatting, the filter\n * range, notes, cell links and pictures. Free of Univer runtime imports (enums\n * are numbers) so it runs under tests as well as in the browser.\n */\n\nimport type { IWorkbookData } from \"@univerjs/core\";\nimport { loadExcelJs, type ExcelJSTypes } from \"@ai-matrx/print/xlsx-styled\";\nimport {\n H_ALIGN_IN,\n RESOURCE,\n V_ALIGN_IN,\n argbToColor,\n borderFromExcel,\n colCharsToPx,\n parseA1Range,\n rowPtToPx,\n writeResource,\n type RangeLike,\n type UniverResource,\n} from \"./xlsx-shared\";\n\nexport type XlsxImportOptions = {\n /** Stores a picture and returns its file id; without it pictures are reported, not imported. */\n uploadImage?: (bytes: Uint8Array, extension: string) => Promise<string>;\n /** Called once per thing the file held that could not be carried. */\n onDropped?: (what: string) => void;\n};\n\ntype Json = Record<string, any>; // eslint-disable-line @typescript-eslint/no-explicit-any -- Univer resource payloads are untyped JSON\n\nconst THEME = [\"FFFFFF\", \"000000\", \"E7E6E6\", \"44546A\", \"4472C4\", \"ED7D31\", \"A5A5A5\", \"FFC000\", \"5B9BD5\", \"70AD47\"];\nconst colorOf = (c: Partial<ExcelJSTypes.Color> | undefined): string | undefined =>\n c?.argb ? argbToColor(c.argb) : typeof c?.theme === \"number\" && THEME[c.theme] ? `#${THEME[c.theme]!.toLowerCase()}` : undefined;\n\nconst rid = (prefix: string) => `${prefix}${Math.random().toString(36).slice(2, 10)}`;\nconst sheetId = (name: string) => `${name.replace(/[^A-Za-z0-9_-]+/g, \"-\").slice(0, 32) || \"sheet\"}-${Math.random().toString(36).slice(2, 8)}`;\n\nexport async function importXlsxWithExcelJs(\n file: { name: string; arrayBuffer(): Promise<ArrayBuffer> },\n options: XlsxImportOptions = {},\n): Promise<Partial<IWorkbookData>> {\n const ExcelJS = await loadExcelJs();\n const wb = new ExcelJS.Workbook();\n await wb.xlsx.load(await file.arrayBuffer());\n\n const dropped = new Set<string>();\n const styles: Record<string, Json> = {};\n const styleIds = new Map<string, string>();\n const styleId = (st: Json): string => {\n const key = JSON.stringify(st);\n let id = styleIds.get(key);\n if (!id) {\n id = `s${styleIds.size + 1}`;\n styleIds.set(key, id);\n styles[id] = st;\n }\n return id;\n };\n\n const sheets: Record<string, Json> = {};\n const sheetOrder: string[] = [];\n const resources: UniverResource[] = [];\n const validation: Json = {};\n const conditional: Json = {};\n const filters: Json = {};\n const notes: Json = {};\n const drawings: Json = {};\n const unitId = `wb-${rid(\"\")}`;\n\n for (const ws of wb.worksheets) {\n const id = sheetId(ws.name);\n sheetOrder.push(id);\n const cellData: Record<number, Record<number, Json>> = {};\n let maxR = 0;\n let maxC = 0;\n const sheetNotes: Json = {};\n\n ws.eachRow({ includeEmpty: false }, (row, rowNumber) => {\n row.eachCell({ includeEmpty: false }, (cell, colNumber) => {\n const r = rowNumber - 1;\n const c = colNumber - 1;\n const out = toCell(cell, styleId);\n if (out) {\n (cellData[r] ??= {})[c] = out;\n maxR = Math.max(maxR, r);\n maxC = Math.max(maxC, c);\n }\n const note = cell.note;\n const text = typeof note === \"string\" ? note : (note as Json | undefined)?.texts?.map((t: Json) => t.text).join(\"\");\n if (text) {\n ((sheetNotes[r] ??= {}) as Json)[c] = { id: rid(\"n\"), row: r, col: c, width: 160, height: 72, note: text, show: false };\n }\n });\n });\n if (Object.keys(sheetNotes).length) notes[id] = sheetNotes;\n\n const sheet: Json = {\n id,\n name: ws.name.slice(0, 31),\n cellData,\n rowCount: Math.max(maxR + 1, ws.rowCount, 100),\n columnCount: Math.max(maxC + 1, ws.columnCount, 26),\n };\n\n const tab = colorOf(ws.properties?.tabColor);\n if (tab) sheet.tabColor = tab;\n\n const merges = (ws.model as Json).merges as string[] | undefined;\n const mergeData = (merges ?? []).map((m) => parseA1Range(m)).filter((m): m is RangeLike => !!m);\n if (mergeData.length) {\n sheet.mergeData = mergeData;\n sheet.rowCount = Math.max(sheet.rowCount, ...mergeData.map((m) => m.endRow + 1));\n sheet.columnCount = Math.max(sheet.columnCount, ...mergeData.map((m) => m.endColumn + 1));\n }\n\n const columnData: Json = {};\n for (let c = 1; c <= Math.min(ws.columnCount, 2000); c++) {\n const col = ws.getColumn(c);\n if (typeof col.width === \"number\" || col.hidden) {\n columnData[c - 1] = {\n ...(typeof col.width === \"number\" ? { w: colCharsToPx(col.width) } : {}),\n ...(col.hidden ? { hd: 1 } : {}),\n };\n }\n }\n if (Object.keys(columnData).length) sheet.columnData = columnData;\n\n const rowData: Json = {};\n ws.eachRow({ includeEmpty: true }, (row, n) => {\n if (typeof row.height === \"number\" || row.hidden) {\n rowData[n - 1] = {\n ...(typeof row.height === \"number\" ? { h: rowPtToPx(row.height), hd: row.hidden ? 1 : 0 } : { hd: 1 }),\n };\n }\n });\n if (Object.keys(rowData).length) sheet.rowData = rowData;\n\n const view = ws.views?.[0] as Json | undefined;\n if (view?.state === \"frozen\" && (view.xSplit || view.ySplit)) {\n sheet.freeze = {\n xSplit: view.xSplit ?? 0,\n ySplit: view.ySplit ?? 0,\n startColumn: view.xSplit ?? 0,\n startRow: view.ySplit ?? 0,\n };\n }\n\n // ── data validation\n const dvModel = ((ws as Json).dataValidations as Json | undefined)?.model as Record<string, Json> | undefined;\n const rules = dataValidationRules(dvModel ?? {});\n if (rules.length) validation[id] = rules;\n\n // ── conditional formatting\n const cf = conditionalRules(((ws as Json).conditionalFormattings ?? []) as Json[], dropped);\n if (cf.length) conditional[id] = cf;\n\n // ── filter range\n const af = ws.autoFilter as ExcelJSTypes.AutoFilter | undefined;\n if (af) {\n const range =\n typeof af === \"string\"\n ? parseA1Range(af)\n : af.from && af.to\n ? {\n startRow: (af.from as Json).row - 1,\n startColumn: (af.from as Json).column - 1,\n endRow: (af.to as Json).row - 1,\n endColumn: (af.to as Json).column - 1,\n }\n : null;\n if (range) filters[id] = { ref: range, filterColumns: [] };\n }\n\n // ── pictures\n const images = ws.getImages();\n if (images.length) {\n if (!options.uploadImage) {\n dropped.add(\"Pictures in the file were not imported\");\n } else {\n const data: Record<string, Json> = {};\n const order: string[] = [];\n for (const img of images) {\n try {\n const media = wb.getImage(Number(img.imageId)) as Json;\n const bytes = new Uint8Array(media.buffer as ArrayBuffer);\n const fileId = await options.uploadImage(bytes, String(media.extension ?? \"png\"));\n const tl = img.range.tl as Json;\n const ext = (img.range as Json).ext as Json | undefined;\n const br = img.range.br as Json | undefined;\n const width = ext?.width ?? ((br?.nativeCol ?? tl.nativeCol + 3) - tl.nativeCol) * 88;\n const height = ext?.height ?? ((br?.nativeRow ?? tl.nativeRow + 6) - tl.nativeRow) * 24;\n const drawingId = rid(\"img\");\n const column = Math.floor(tl.nativeCol ?? tl.col);\n const rowIdx = Math.floor(tl.nativeRow ?? tl.row);\n data[drawingId] = {\n unitId,\n subUnitId: id,\n drawingId,\n drawingType: 0,\n imageSourceType: \"URL\",\n source: `matrx-file:${fileId}`,\n transform: { left: column * 88, top: rowIdx * 24, width, height, angle: 0 },\n sheetTransform: {\n from: { column, columnOffset: 0, row: rowIdx, rowOffset: 0 },\n to: { column: column + Math.max(1, Math.round(width / 88)), columnOffset: 0, row: rowIdx + Math.max(1, Math.round(height / 24)), rowOffset: 0 },\n },\n };\n order.push(drawingId);\n } catch {\n dropped.add(\"Some pictures could not be stored and were left out\");\n }\n }\n if (order.length) drawings[id] = { data, order };\n }\n }\n\n if ((ws.getTables?.() ?? []).length) dropped.add(\"Excel tables became plain ranges (their data and styling are kept)\");\n sheets[id] = sheet;\n }\n\n if (Object.keys(validation).length) writeResource(resources, RESOURCE.validation, validation);\n if (Object.keys(conditional).length) writeResource(resources, RESOURCE.conditional, conditional);\n if (Object.keys(filters).length) writeResource(resources, RESOURCE.filter, filters);\n if (Object.keys(notes).length) writeResource(resources, RESOURCE.note, notes);\n if (Object.keys(drawings).length) writeResource(resources, RESOURCE.drawing, drawings);\n\n for (const d of dropped) options.onDropped?.(d);\n\n return {\n id: unitId,\n sheetOrder,\n name: file.name.replace(/\\.[^.]+$/, \"\"),\n appVersion: \"1\",\n locale: \"enUS\" as IWorkbookData[\"locale\"],\n styles,\n sheets,\n resources,\n } as Partial<IWorkbookData>;\n}\n\nfunction toStyle(cell: ExcelJSTypes.Cell): Json | undefined {\n const st: Json = {};\n const f = cell.font;\n if (f) {\n if (f.name) st.ff = f.name;\n if (f.size) st.fs = f.size;\n if (f.bold) st.bl = 1;\n if (f.italic) st.it = 1;\n if (f.underline) st.ul = { s: 1 };\n if (f.strike) st.st = { s: 1 };\n const cl = colorOf(f.color);\n if (cl) st.cl = { rgb: cl };\n }\n const fill = cell.fill as Json | undefined;\n if (fill?.type === \"pattern\" && fill.pattern === \"solid\") {\n const bg = colorOf(fill.fgColor);\n if (bg) st.bg = { rgb: bg };\n }\n const al = cell.alignment;\n if (al) {\n if (al.horizontal && H_ALIGN_IN[al.horizontal]) st.ht = H_ALIGN_IN[al.horizontal];\n if (al.vertical && V_ALIGN_IN[al.vertical]) st.vt = V_ALIGN_IN[al.vertical];\n if (al.wrapText) st.tb = 3;\n }\n const bd = cell.border as Json | undefined;\n if (bd) {\n const out: Json = {};\n for (const [side, key] of [[\"top\", \"t\"], [\"bottom\", \"b\"], [\"left\", \"l\"], [\"right\", \"r\"]] as const) {\n const s = borderFromExcel(bd[side]?.style);\n if (s) out[key] = { s, cl: { rgb: colorOf(bd[side]?.color) ?? \"#000000\" } };\n }\n if (Object.keys(out).length) st.bd = out;\n }\n if (cell.numFmt && cell.numFmt !== \"General\") st.n = { pattern: cell.numFmt };\n return Object.keys(st).length ? st : undefined;\n}\n\nconst EXCEL_EPOCH_OFFSET_DAYS = 25569;\n\nfunction toCell(cell: ExcelJSTypes.Cell, styleId: (s: Json) => string): Json | null {\n const out: Json = {};\n let st = toStyle(cell);\n const v = cell.value as unknown;\n const setNumber = (n: number) => {\n out.v = n;\n out.t = 2;\n };\n const apply = (value: unknown) => {\n if (value instanceof Date) {\n setNumber(value.getTime() / 86_400_000 + EXCEL_EPOCH_OFFSET_DAYS);\n st = { ...(st ?? {}), n: (st?.n as Json | undefined) ?? { pattern: \"yyyy-mm-dd\" } };\n } else if (typeof value === \"number\") setNumber(value);\n else if (typeof value === \"boolean\") {\n out.v = value ? 1 : 0;\n out.t = 3;\n } else if (typeof value === \"string\") {\n out.v = value;\n out.t = 1;\n } else if (value && typeof value === \"object\" && \"error\" in (value as Json)) {\n out.v = String((value as Json).error);\n out.t = 1;\n }\n };\n if (v && typeof v === \"object\" && !(v instanceof Date)) {\n const o = v as Json;\n if (\"formula\" in o || \"sharedFormula\" in o) {\n const f = o.formula ?? o.sharedFormula;\n if (f) out.f = `=${String(f).replace(/^=/, \"\")}`;\n apply(o.result);\n } else if (Array.isArray(o.richText)) {\n apply(o.richText.map((r: Json) => r.text).join(\"\"));\n } else if (\"hyperlink\" in o) {\n const text = String(typeof o.text === \"object\" ? (o.text?.richText ?? []).map((r: Json) => r.text).join(\"\") : (o.text ?? o.hyperlink));\n out.v = text;\n out.t = 1;\n out.p = linkDoc(text, String(o.hyperlink));\n } else apply(o);\n } else {\n apply(v);\n }\n if (st) out.s = styleId(st);\n return out.v === undefined && out.f === undefined && !out.s ? null : out;\n}\n\nfunction linkDoc(text: string, url: string): Json {\n return {\n id: \"d\",\n documentStyle: {},\n body: {\n dataStream: `${text}\\r\\n`,\n textRuns: [],\n paragraphs: [{ startIndex: text.length }],\n customRanges: [\n { startIndex: 0, endIndex: Math.max(0, text.length - 1), rangeId: rid(\"link\"), rangeType: 0, properties: { url } },\n ],\n },\n };\n}\n\nfunction dataValidationRules(model: Record<string, Json>): Json[] {\n const groups = new Map<string, { rule: Json; cells: [number, number][] }>();\n for (const [ref, dv] of Object.entries(model)) {\n const pos = parseA1Range(ref);\n if (!pos) continue;\n const type = String(dv.type);\n const rule: Json = {\n allowBlank: dv.allowBlank !== false,\n showErrorMessage: dv.showErrorMessage !== false,\n ...(dv.error ? { error: dv.error } : {}),\n ...(dv.errorTitle ? { errorTitle: dv.errorTitle } : {}),\n ...(dv.prompt ? { prompt: dv.prompt, showInputMessage: true } : {}),\n };\n const f = (dv.formulae ?? []) as unknown[];\n if (type === \"list\") {\n const raw = String(f[0] ?? \"\");\n const literal = /^\"(.*)\"$/.exec(raw);\n Object.assign(rule, { type: \"list\", formula1: literal ? literal[1] : raw, formula2: \"\", showDropDown: true });\n } else if ([\"whole\", \"decimal\", \"date\", \"time\", \"textLength\"].includes(type)) {\n Object.assign(rule, { type, operator: dv.operator ?? \"between\", formula1: String(f[0] ?? \"\"), formula2: f[1] !== undefined ? String(f[1]) : \"\" });\n } else if (type === \"custom\") {\n Object.assign(rule, { type: \"custom\", formula1: String(f[0] ?? \"\") });\n } else continue;\n const key = JSON.stringify(rule);\n const g = groups.get(key) ?? { rule, cells: [] };\n g.cells.push([pos.startRow, pos.startColumn]);\n groups.set(key, g);\n }\n return [...groups.values()].map(({ rule, cells }) => ({ uid: rid(\"dv\"), ...rule, ranges: compressCells(cells) }));\n}\n\n/** Single cells -> the fewest vertical runs. */\nfunction compressCells(cells: [number, number][]): RangeLike[] {\n const sorted = [...cells].sort((a, b) => a[1] - b[1] || a[0] - b[0]);\n const out: RangeLike[] = [];\n for (const [r, c] of sorted) {\n const last = out[out.length - 1];\n if (last && last.startColumn === c && last.endColumn === c && last.endRow === r - 1) last.endRow = r;\n else out.push({ startRow: r, endRow: r, startColumn: c, endColumn: c });\n }\n return out;\n}\n\nfunction dxfToStyle(style: Json | undefined): Json {\n const out: Json = {};\n const fg = colorOf(style?.font?.color);\n if (fg) out.cl = { rgb: fg };\n if (style?.font?.bold) out.bl = 1;\n if (style?.font?.italic) out.it = 1;\n const bg = colorOf(style?.fill?.bgColor) ?? colorOf(style?.fill?.fgColor);\n if (bg) out.bg = { rgb: bg };\n return out;\n}\n\nfunction conditionalRules(formats: Json[], dropped: Set<string>): Json[] {\n const out: Json[] = [];\n for (const cf of formats) {\n const ranges = String(cf.ref ?? \"\").split(/\\s+/).map((r) => parseA1Range(r)).filter((r): r is RangeLike => !!r);\n if (!ranges.length) continue;\n for (const rule of (cf.rules ?? []) as Json[]) {\n let mapped: Json | null = null;\n const style = dxfToStyle(rule.style);\n if (rule.type === \"cellIs\") {\n const nums = ((rule.formulae ?? []) as unknown[]).map(Number);\n const between = rule.operator === \"between\" || rule.operator === \"notBetween\";\n mapped = { type: \"highlightCell\", subType: \"number\", operator: rule.operator, value: between ? nums.slice(0, 2) : nums[0], style };\n } else if (rule.type === \"containsText\") {\n mapped = { type: \"highlightCell\", subType: \"text\", operator: \"containsText\", value: String(rule.text ?? \"\"), style };\n } else if (rule.type === \"expression\") {\n mapped = { type: \"highlightCell\", subType: \"formula\", value: `=${String((rule.formulae ?? [])[0] ?? \"\")}`, style };\n } else if (rule.type === \"colorScale\") {\n mapped = {\n type: \"colorScale\",\n config: ((rule.cfvo ?? []) as Json[]).map((v, i) => ({\n index: i,\n color: colorOf(rule.color?.[i]) ?? \"#ffffff\",\n value: { type: v.type, ...(v.value !== undefined ? { value: v.value } : {}) },\n })),\n };\n } else if (rule.type === \"dataBar\") {\n const [min, max] = (rule.cfvo ?? []) as Json[];\n mapped = {\n type: \"dataBar\",\n isShowValue: true,\n config: {\n min: { type: min?.type ?? \"min\" },\n max: { type: max?.type ?? \"max\" },\n isGradient: rule.gradient !== false,\n positiveColor: colorOf(rule.color) ?? \"#638ec6\",\n nativeColor: \"#ff0000\",\n },\n };\n }\n if (!mapped) {\n dropped.add(\"Some conditional formats (icon sets, top/bottom, date rules) were not imported\");\n continue;\n }\n out.push({ cfId: rid(\"cf\"), ranges, stopIfTrue: Boolean(rule.stopIfTrue), rule: mapped });\n }\n }\n return out;\n}\n","/**\n * Shared vocabulary between the xlsx importer and exporter: how Univer's\n * style numbers, colours and units map to the xlsx file's.\n *\n * Univer enums are written as numbers here so these helpers stay free of any\n * Univer import (they run in tests and in both directions).\n */\n\nexport const RESOURCE = {\n validation: \"SHEET_DATA_VALIDATION_PLUGIN\",\n conditional: \"SHEET_CONDITIONAL_FORMATTING_PLUGIN\",\n filter: \"SHEET_FILTER_PLUGIN\",\n note: \"SHEET_NOTE_PLUGIN\",\n comments: \"SHEET_UNIVER_THREAD_COMMENT_PLUGIN\",\n drawing: \"SHEET_DRAWING_PLUGIN\",\n table: \"SHEET_TABLE_PLUGIN\",\n} as const;\n\nexport type UniverResource = { name: string; data: string };\n\nexport function readResource<T = unknown>(\n resources: readonly UniverResource[] | undefined,\n name: string,\n): T | undefined {\n const raw = resources?.find((r) => r.name === name)?.data;\n if (!raw) return undefined;\n try {\n return JSON.parse(raw) as T;\n } catch {\n return undefined;\n }\n}\n\nexport function writeResource(resources: UniverResource[], name: string, value: unknown): void {\n const i = resources.findIndex((r) => r.name === name);\n const entry = { name, data: JSON.stringify(value) };\n if (i >= 0) resources[i] = entry;\n else resources.push(entry);\n}\n\n/** Excel column width (characters) <-> Univer pixels. */\nexport const colPxToChars = (px: number): number => Math.max(0, Math.round((px / 7) * 100) / 100);\nexport const colCharsToPx = (chars: number): number => Math.round(chars * 7);\n/** Excel row height (points) <-> Univer pixels. */\nexport const rowPxToPt = (px: number): number => Math.round(px * 0.75 * 100) / 100;\nexport const rowPtToPx = (pt: number): number => Math.round((pt / 0.75) * 100) / 100;\n\n/** Univer colour (\"#rrggbb\", \"rgb(r,g,b)\", \"rgba(...)\") -> ARGB hex, or undefined. */\nexport function colorToArgb(input: string | undefined | null): string | undefined {\n if (!input) return undefined;\n const s = input.trim();\n const hex = /^#?([0-9a-f]{6})$/i.exec(s);\n if (hex) return `FF${hex[1]!.toUpperCase()}`;\n const short = /^#([0-9a-f])([0-9a-f])([0-9a-f])$/i.exec(s);\n if (short) return `FF${short[1]}${short[1]}${short[2]}${short[2]}${short[3]}${short[3]}`.toUpperCase();\n const rgb = /^rgba?\\(\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)/i.exec(s);\n if (rgb) {\n const h = (n: string) => Number(n).toString(16).padStart(2, \"0\");\n return `FF${h(rgb[1]!)}${h(rgb[2]!)}${h(rgb[3]!)}`.toUpperCase();\n }\n return undefined;\n}\n\n/** ARGB (or RGB) hex from a file -> Univer \"#rrggbb\". */\nexport function argbToColor(argb: string | undefined | null): string | undefined {\n if (!argb) return undefined;\n const v = argb.replace(/^#/, \"\");\n if (v.length === 8) return `#${v.slice(2).toLowerCase()}`;\n if (v.length === 6) return `#${v.toLowerCase()}`;\n return undefined;\n}\n\n// Univer BorderStyleTypes number <-> ExcelJS border style name.\nconst BORDER_OUT: Record<number, string> = {\n 1: \"thin\", 2: \"hair\", 3: \"dotted\", 4: \"dashed\", 5: \"dashDot\", 6: \"dashDotDot\", 7: \"double\",\n 8: \"medium\", 9: \"mediumDashed\", 10: \"mediumDashDot\", 11: \"mediumDashDotDot\", 12: \"slantDashDot\", 13: \"thick\",\n};\nexport const borderToExcel = (n: number | undefined): string | undefined =>\n n === undefined ? undefined : BORDER_OUT[n];\nexport const borderFromExcel = (name: string | undefined): number | undefined => {\n if (!name) return undefined;\n const hit = Object.entries(BORDER_OUT).find(([, v]) => v === name);\n return hit ? Number(hit[0]) : undefined;\n};\n\nexport const H_ALIGN_OUT: Record<number, string> = { 1: \"left\", 2: \"center\", 3: \"right\", 4: \"justify\", 5: \"justify\", 6: \"distributed\" };\nexport const V_ALIGN_OUT: Record<number, string> = { 1: \"top\", 2: \"middle\", 3: \"bottom\" };\nexport const H_ALIGN_IN: Record<string, number> = { left: 1, center: 2, right: 3, justify: 4, fill: 1, centerContinuous: 2, distributed: 6 };\nexport const V_ALIGN_IN: Record<string, number> = { top: 1, middle: 2, bottom: 3, distributed: 2, justify: 2 };\n\n/** 0-based (row, col) -> \"A1\" (no $). */\nexport function a1(row: number, col: number): string {\n let n = col + 1;\n let letters = \"\";\n while (n > 0) {\n const m = (n - 1) % 26;\n letters = String.fromCharCode(65 + m) + letters;\n n = Math.floor((n - 1) / 26);\n }\n return `${letters}${row + 1}`;\n}\n\nexport type RangeLike = { startRow: number; endRow: number; startColumn: number; endColumn: number };\nexport const rangeToA1 = (r: RangeLike): string =>\n r.startRow === r.endRow && r.startColumn === r.endColumn\n ? a1(r.startRow, r.startColumn)\n : `${a1(r.startRow, r.startColumn)}:${a1(r.endRow, r.endColumn)}`;\n\n/** \"A1\" or \"A1:C5\" -> range (0-based), or null. */\nexport function parseA1Range(ref: string): RangeLike | null {\n const m = /^\\$?([A-Z]+)\\$?(\\d+)(?::\\$?([A-Z]+)\\$?(\\d+))?$/i.exec(ref.trim());\n if (!m) return null;\n const col = (s: string) => [...s.toUpperCase()].reduce((acc, ch) => acc * 26 + ch.charCodeAt(0) - 64, 0) - 1;\n const sc = col(m[1]!);\n const sr = Number(m[2]!) - 1;\n return { startRow: sr, startColumn: sc, endRow: m[4] ? Number(m[4]) - 1 : sr, endColumn: m[3] ? col(m[3]) : sc };\n}\n"],"mappings":"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","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["/home/runner/work/aidream/aidream/apps/shared/office/dist/matrxImagePorts-JDFYE4QI.cjs","../src/univer/ports.ts","../src/univer/univerImageStore.ts","../src/univer/matrxImagePorts.ts"],"names":[],"mappings":"AAAA;ACwCA,IAAM,KAAA,kBAAO,MAAA,CAAO,GAAA,CAAI,6BAA6B,CAAA;AAErD,IAAM,KAAA,EAAO,CAAA,EAAA,GAAY;AACvB,EAAA,MAAM,EAAA,EAAI,UAAA;AACV,EAAA,OAAQ,CAAA,CAAE,IAAI,EAAA,IAAM,CAAC,CAAA;AACvB,CAAA;AAMO,SAAS,aAAA,CAAA,EAAiC;AAC/C,EAAA,MAAM,MAAA,EAAQ,IAAA,CAAK,CAAA,CAAE,KAAA;AACrB,EAAA,GAAA,CAAI,CAAC,KAAA,EAAO,MAAM,IAAI,KAAA,CAAM,8FAA8F,CAAA;AAC1H,EAAA,OAAO,KAAA;AACT;AD5CA;AACA;AEAA;AACE;AACA;AACA;AACA;AACA;AAAA,sCACK;AAEA,IAAM,mBAAA,EAAqB,aAAA;AAE3B,IAAM,mBAAA,EAAqB,CAAC,MAAA,EAAA,GACjC,MAAA,CAAO,UAAA,CAAW,kBAAkB,CAAA;AAE/B,IAAM,iBAAA,EAAmB,CAAC,MAAA,EAAA,GAC/B,MAAA,CAAO,KAAA,CAAM,kBAAA,CAAmB,MAAM,CAAA;AFHxC;AACA;AGpBO,IAAM,gBAAA,EAAmC;AAAA,EAC9C,MAAM,MAAA,CAAO,IAAA,EAAM;AACjB,IAAA,OAAO,aAAA,CAAc,CAAA,CAAE,KAAA,CAAM,MAAA,CAAO,IAAI,CAAA;AAAA,EAC1C,CAAA;AAAA,EACA,OAAA,CAAQ,MAAA,EAAQ;AACd,IAAA,OAAO,aAAA,CAAc,CAAA,CAAE,KAAA,CAAM,OAAA,CAAQ,MAAM,CAAA;AAAA,EAC7C,CAAA;AAAA,EACA,aAAA,CAAc,KAAA,EAAO;AACnB,IAAA,aAAA,CAAc,CAAA,CAAE,iBAAA,CAAkB,KAAK,CAAA;AAAA,EACzC;AACF,CAAA;AAGA,MAAA,SAAsB,kBAAA,CACpB,MAAA,EAC0E;AAC1E,EAAA,IAAI,IAAA;AACJ,EAAA,GAAA,CAAI,kBAAA,CAAmB,MAAM,CAAA,EAAG;AAC9B,IAAA,KAAA,EAAO,MAAM,aAAA,CAAc,CAAA,CAAE,KAAA,CAAM,OAAA,CAAQ,gBAAA,CAAiB,MAAM,CAAC,CAAA;AAAA,EACrE,EAAA,KAAO;AACL,IAAA,MAAM,IAAA,EAAM,MAAM,KAAA,CAAM,MAAM,CAAA;AAC9B,IAAA,GAAA,CAAI,CAAC,GAAA,CAAI,EAAA,EAAI,OAAO,IAAA;AACpB,IAAA,KAAA,EAAO,MAAM,GAAA,CAAI,IAAA,CAAK,CAAA;AAAA,EACxB;AACA,EAAA,MAAM,UAAA,EAAY,IAAA,CAAK,IAAA,CAAK,QAAA,CAAS,KAAK,EAAA,EAAI,MAAA,EAAQ,IAAA,CAAK,IAAA,CAAK,QAAA,CAAS,KAAK,EAAA,EAAI,MAAA,EAAQ,MAAA;AAC1F,EAAA,OAAO,EAAE,KAAA,EAAO,IAAI,UAAA,CAAW,MAAM,IAAA,CAAK,WAAA,CAAY,CAAC,CAAA,EAAG,UAAU,CAAA;AACtE;AAGA,MAAA,SAAsB,mBAAA,CAAoB,KAAA,EAAmB,SAAA,EAAoC;AAC/F,EAAA,MAAM,KAAA,EAAO,UAAA,IAAc,MAAA,EAAQ,aAAA,EAAe,CAAA,MAAA,EAAS,SAAS,CAAA,CAAA;AACa,EAAA;AAC1E,EAAA;AACT;AHgBuE;AACA;AACA;AACA;AACA","file":"/home/runner/work/aidream/aidream/apps/shared/office/dist/matrxImagePorts-JDFYE4QI.cjs","sourcesContent":[null,"/**\n * The host ports of the Univer glue.\n *\n * The glue belongs to the package, but four things belong to the app that mounts an editor: the\n * toast path, the signed-in person, the file store, the snapshot catch-up read and the painted theme. The host states them\n * once at start-up with `configureUniverHost`; the glue reads them here. State sits on a\n * `globalThis` slot so a dual-bundled copy of the package still sees one host (dual-bundle rule).\n * An unconfigured port THROWS naming the port (nothing fails silently).\n */\n\nexport type UniverToastId = string | number;\ntype ToastShow = (title: string, options?: { description?: string; duration?: number }) => UniverToastId;\n\nexport interface UniverHostPorts {\n /** The app's toast path (one toaster per page). */\n toast: {\n success: ToastShow;\n info: ToastShow;\n warning: ToastShow;\n error: ToastShow;\n message: ToastShow;\n dismiss(id: UniverToastId): void;\n };\n /** Who is typing, or null when signed out. `metadata` is the auth user's metadata bag. */\n getSignedInUser(): Promise<{ id: string; email?: string | null; metadata?: Record<string, unknown> | null } | null>;\n /** The file store behind pictures on a sheet or in a document. */\n files: {\n upload(file: File): Promise<{ fileId: string }>;\n getBlob(fileId: string): Promise<Blob>;\n };\n /** The newest snapshot row of a workbook (the realtime catch-up read), or `data: null` when it has none. */\n readNewestWorkbookSnapshot(\n workbookId: string,\n ): Promise<{ data: { id?: string; created_by?: string | null; created_at?: string } | null; error: { message: string } | null }>;\n /** Tell the person a picture did not upload. */\n notifyUploadError(error: unknown): void;\n /** The painted colour mode, as a React hook (re-renders on a switch). */\n useThemeMode(): \"light\" | \"dark\";\n}\n\nconst SLOT = Symbol.for(\"ai-matrx.office.univer-host\");\ntype Slot = { ports?: UniverHostPorts };\nconst slot = (): Slot => {\n const g = globalThis as Record<symbol, Slot | undefined>;\n return (g[SLOT] ??= {});\n};\n\nexport function configureUniverHost(ports: UniverHostPorts): void {\n slot().ports = ports;\n}\n\nexport function getUniverHost(): UniverHostPorts {\n const ports = slot().ports;\n if (!ports) throw new Error(\"@ai-matrx/office/univer: configureUniverHost(ports) was not called before an editor mounted.\");\n return ports;\n}\n","/**\n * univerImageStore — images on a sheet or in a document live in OUR file\n * store; the Univer snapshot holds only a reference (`matrx-file:<fileId>`).\n *\n * Why: Univer's stock image service inlines every picture as base64 into the\n * snapshot, so one 2 MB photo made every autosave, history row and collab\n * mutation ~2 MB. Here `saveImage` uploads the file and hands Univer a URL-type\n * source; Univer's URL-image downloader turns the reference back into bytes\n * (`getBlob` → object URL) when it paints. Images already inline (BASE64\n * sources) are untouched and keep rendering.\n */\n\nimport {\n IImageIoService,\n IURLImageService,\n ImageSourceType,\n ImageUploadStatusType,\n generateRandomId,\n} from \"@univerjs/core\";\n\nexport const MATRX_IMAGE_PREFIX = \"matrx-file:\";\n\nexport const isMatrxImageSource = (source: string): boolean =>\n source.startsWith(MATRX_IMAGE_PREFIX);\n\nexport const matrxImageFileId = (source: string): string =>\n source.slice(MATRX_IMAGE_PREFIX.length);\n\nexport type ImageStorePorts = {\n upload(file: File): Promise<{ fileId: string }>;\n getBlob(fileId: string): Promise<Blob>;\n /** Called when an upload fails, so the person is told (never silent). */\n onUploadError(error: unknown): void;\n};\n\nconst ALLOWED = [\"image/png\", \"image/jpeg\", \"image/jpg\", \"image/gif\", \"image/bmp\", \"image/webp\"];\n\ntype ImageIo = {\n saveImage(file: File): Promise<unknown>;\n};\ntype UrlImages = {\n registerURLImageDownloader(d: (url: string) => Promise<string>): { dispose(): void };\n};\ntype InjectorLike = { get(id: unknown): unknown };\n\n/** Pure core: the two replacements, given ports. */\nexport function createMatrxImageStore(ports: ImageStorePorts) {\n const blobUrls = new Map<string, Promise<string>>();\n return {\n /** Revoke every object URL this store made (the editor is going away). */\n dispose() {\n for (const pending of blobUrls.values()) void pending.then((url) => URL.revokeObjectURL(url), () => undefined);\n blobUrls.clear();\n },\n async saveImage(file: File) {\n if (!ALLOWED.includes(file.type)) throw new Error(\"ERROR_IMAGE_TYPE\");\n let fileId: string;\n try {\n ({ fileId } = await ports.upload(file));\n } catch (error) {\n ports.onUploadError(error);\n throw error;\n }\n const source = MATRX_IMAGE_PREFIX + fileId;\n // Univer measures the picture from base64Cache before it inserts (an empty one throws, nothing is\n // inserted). A blob URL of the file just chosen serves that and paints it; it is never saved.\n const localUrl = URL.createObjectURL(file);\n blobUrls.set(fileId, Promise.resolve(localUrl));\n return {\n imageId: generateRandomId(6),\n imageSourceType: ImageSourceType.URL,\n source,\n base64Cache: localUrl,\n status: ImageUploadStatusType.SUCCUSS,\n };\n },\n async download(url: string): Promise<string> {\n if (!isMatrxImageSource(url)) return url;\n const fileId = matrxImageFileId(url);\n let pending = blobUrls.get(fileId);\n if (!pending) {\n pending = ports.getBlob(fileId).then((blob) => URL.createObjectURL(blob));\n blobUrls.set(fileId, pending);\n pending.catch(() => blobUrls.delete(fileId));\n }\n return pending;\n },\n };\n}\n\nconst stores = new WeakMap<object, { dispose(): void }>();\n\n/** Release the object URLs of the store wired into this Univer instance (call as the instance is disposed). */\nexport function releaseMatrxImageStore(injector: object | null | undefined): void {\n if (!injector) return;\n stores.get(injector)?.dispose();\n stores.delete(injector);\n}\n\n/** Wire the store into one Univer instance's image services. */\nexport function registerMatrxImageStore(injector: InjectorLike, ports: ImageStorePorts): void {\n const store = createMatrxImageStore(ports);\n stores.set(injector, store);\n const io = injector.get(IImageIoService) as ImageIo;\n io.saveImage = store.saveImage as ImageIo[\"saveImage\"];\n const urls = injector.get(IURLImageService) as UrlImages;\n urls.registerURLImageDownloader(store.download);\n}\n","import { getUniverHost } from \"./ports\";\nimport { isMatrxImageSource, matrxImageFileId, type ImageStorePorts } from \"./univerImageStore\";\n\n/** The real file-store ports (the host's): upload, read back as a blob, tell the person on failure. */\nexport const matrxImagePorts: ImageStorePorts = {\n async upload(file) {\n return getUniverHost().files.upload(file);\n },\n getBlob(fileId) {\n return getUniverHost().files.getBlob(fileId);\n },\n onUploadError(error) {\n getUniverHost().notifyUploadError(error);\n },\n};\n\n/** Export: a snapshot picture source (`matrx-file:<id>` or a URL) as bytes + type, or null if unreadable. */\nexport async function resolveExportImage(\n source: string,\n): Promise<{ bytes: Uint8Array; extension: \"png\" | \"jpeg\" | \"gif\" } | null> {\n let blob: Blob;\n if (isMatrxImageSource(source)) {\n blob = await getUniverHost().files.getBlob(matrxImageFileId(source));\n } else {\n const res = await fetch(source);\n if (!res.ok) return null;\n blob = await res.blob();\n }\n const extension = blob.type.includes(\"gif\") ? \"gif\" : blob.type.includes(\"png\") ? \"png\" : \"jpeg\";\n return { bytes: new Uint8Array(await blob.arrayBuffer()), extension };\n}\n\n/** Import: store a picture from a file, return its file id. */\nexport async function uploadImportedImage(bytes: Uint8Array, extension: string): Promise<string> {\n const mime = extension === \"jpg\" ? \"image/jpeg\" : `image/${extension}`;\n const { fileId } = await getUniverHost().files.upload(new File([bytes as BlobPart], `image.${extension}`, { type: mime }));\n return fileId;\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/univer/ports.ts","../src/univer/univerImageStore.ts","../src/univer/matrxImagePorts.ts"],"sourcesContent":["/**\n * The host ports of the Univer glue.\n *\n * The glue belongs to the package, but four things belong to the app that mounts an editor: the\n * toast path, the signed-in person, the file store, the snapshot catch-up read and the painted theme. The host states them\n * once at start-up with `configureUniverHost`; the glue reads them here. State sits on a\n * `globalThis` slot so a dual-bundled copy of the package still sees one host (dual-bundle rule).\n * An unconfigured port THROWS naming the port (nothing fails silently).\n */\n\nexport type UniverToastId = string | number;\ntype ToastShow = (title: string, options?: { description?: string; duration?: number }) => UniverToastId;\n\nexport interface UniverHostPorts {\n /** The app's toast path (one toaster per page). */\n toast: {\n success: ToastShow;\n info: ToastShow;\n warning: ToastShow;\n error: ToastShow;\n message: ToastShow;\n dismiss(id: UniverToastId): void;\n };\n /** Who is typing, or null when signed out. `metadata` is the auth user's metadata bag. */\n getSignedInUser(): Promise<{ id: string; email?: string | null; metadata?: Record<string, unknown> | null } | null>;\n /** The file store behind pictures on a sheet or in a document. */\n files: {\n upload(file: File): Promise<{ fileId: string }>;\n getBlob(fileId: string): Promise<Blob>;\n };\n /** The newest snapshot row of a workbook (the realtime catch-up read), or `data: null` when it has none. */\n readNewestWorkbookSnapshot(\n workbookId: string,\n ): Promise<{ data: { id?: string; created_by?: string | null; created_at?: string } | null; error: { message: string } | null }>;\n /** Tell the person a picture did not upload. */\n notifyUploadError(error: unknown): void;\n /** The painted colour mode, as a React hook (re-renders on a switch). */\n useThemeMode(): \"light\" | \"dark\";\n}\n\nconst SLOT = Symbol.for(\"ai-matrx.office.univer-host\");\ntype Slot = { ports?: UniverHostPorts };\nconst slot = (): Slot => {\n const g = globalThis as Record<symbol, Slot | undefined>;\n return (g[SLOT] ??= {});\n};\n\nexport function configureUniverHost(ports: UniverHostPorts): void {\n slot().ports = ports;\n}\n\nexport function getUniverHost(): UniverHostPorts {\n const ports = slot().ports;\n if (!ports) throw new Error(\"@ai-matrx/office/univer: configureUniverHost(ports) was not called before an editor mounted.\");\n return ports;\n}\n","/**\n * univerImageStore — images on a sheet or in a document live in OUR file\n * store; the Univer snapshot holds only a reference (`matrx-file:<fileId>`).\n *\n * Why: Univer's stock image service inlines every picture as base64 into the\n * snapshot, so one 2 MB photo made every autosave, history row and collab\n * mutation ~2 MB. Here `saveImage` uploads the file and hands Univer a URL-type\n * source; Univer's URL-image downloader turns the reference back into bytes\n * (`getBlob` → object URL) when it paints. Images already inline (BASE64\n * sources) are untouched and keep rendering.\n */\n\nimport {\n IImageIoService,\n IURLImageService,\n ImageSourceType,\n ImageUploadStatusType,\n generateRandomId,\n} from \"@univerjs/core\";\n\nexport const MATRX_IMAGE_PREFIX = \"matrx-file:\";\n\nexport const isMatrxImageSource = (source: string): boolean =>\n source.startsWith(MATRX_IMAGE_PREFIX);\n\nexport const matrxImageFileId = (source: string): string =>\n source.slice(MATRX_IMAGE_PREFIX.length);\n\nexport type ImageStorePorts = {\n upload(file: File): Promise<{ fileId: string }>;\n getBlob(fileId: string): Promise<Blob>;\n /** Called when an upload fails, so the person is told (never silent). */\n onUploadError(error: unknown): void;\n};\n\nconst ALLOWED = [\"image/png\", \"image/jpeg\", \"image/jpg\", \"image/gif\", \"image/bmp\", \"image/webp\"];\n\ntype ImageIo = {\n saveImage(file: File): Promise<unknown>;\n};\ntype UrlImages = {\n registerURLImageDownloader(d: (url: string) => Promise<string>): { dispose(): void };\n};\ntype InjectorLike = { get(id: unknown): unknown };\n\n/** Pure core: the two replacements, given ports. */\nexport function createMatrxImageStore(ports: ImageStorePorts) {\n const blobUrls = new Map<string, Promise<string>>();\n return {\n /** Revoke every object URL this store made (the editor is going away). */\n dispose() {\n for (const pending of blobUrls.values()) void pending.then((url) => URL.revokeObjectURL(url), () => undefined);\n blobUrls.clear();\n },\n async saveImage(file: File) {\n if (!ALLOWED.includes(file.type)) throw new Error(\"ERROR_IMAGE_TYPE\");\n let fileId: string;\n try {\n ({ fileId } = await ports.upload(file));\n } catch (error) {\n ports.onUploadError(error);\n throw error;\n }\n const source = MATRX_IMAGE_PREFIX + fileId;\n // Univer measures the picture from base64Cache before it inserts (an empty one throws, nothing is\n // inserted). A blob URL of the file just chosen serves that and paints it; it is never saved.\n const localUrl = URL.createObjectURL(file);\n blobUrls.set(fileId, Promise.resolve(localUrl));\n return {\n imageId: generateRandomId(6),\n imageSourceType: ImageSourceType.URL,\n source,\n base64Cache: localUrl,\n status: ImageUploadStatusType.SUCCUSS,\n };\n },\n async download(url: string): Promise<string> {\n if (!isMatrxImageSource(url)) return url;\n const fileId = matrxImageFileId(url);\n let pending = blobUrls.get(fileId);\n if (!pending) {\n pending = ports.getBlob(fileId).then((blob) => URL.createObjectURL(blob));\n blobUrls.set(fileId, pending);\n pending.catch(() => blobUrls.delete(fileId));\n }\n return pending;\n },\n };\n}\n\nconst stores = new WeakMap<object, { dispose(): void }>();\n\n/** Release the object URLs of the store wired into this Univer instance (call as the instance is disposed). */\nexport function releaseMatrxImageStore(injector: object | null | undefined): void {\n if (!injector) return;\n stores.get(injector)?.dispose();\n stores.delete(injector);\n}\n\n/** Wire the store into one Univer instance's image services. */\nexport function registerMatrxImageStore(injector: InjectorLike, ports: ImageStorePorts): void {\n const store = createMatrxImageStore(ports);\n stores.set(injector, store);\n const io = injector.get(IImageIoService) as ImageIo;\n io.saveImage = store.saveImage as ImageIo[\"saveImage\"];\n const urls = injector.get(IURLImageService) as UrlImages;\n urls.registerURLImageDownloader(store.download);\n}\n","import { getUniverHost } from \"./ports\";\nimport { isMatrxImageSource, matrxImageFileId, type ImageStorePorts } from \"./univerImageStore\";\n\n/** The real file-store ports (the host's): upload, read back as a blob, tell the person on failure. */\nexport const matrxImagePorts: ImageStorePorts = {\n async upload(file) {\n return getUniverHost().files.upload(file);\n },\n getBlob(fileId) {\n return getUniverHost().files.getBlob(fileId);\n },\n onUploadError(error) {\n getUniverHost().notifyUploadError(error);\n },\n};\n\n/** Export: a snapshot picture source (`matrx-file:<id>` or a URL) as bytes + type, or null if unreadable. */\nexport async function resolveExportImage(\n source: string,\n): Promise<{ bytes: Uint8Array; extension: \"png\" | \"jpeg\" | \"gif\" } | null> {\n let blob: Blob;\n if (isMatrxImageSource(source)) {\n blob = await getUniverHost().files.getBlob(matrxImageFileId(source));\n } else {\n const res = await fetch(source);\n if (!res.ok) return null;\n blob = await res.blob();\n }\n const extension = blob.type.includes(\"gif\") ? \"gif\" : blob.type.includes(\"png\") ? \"png\" : \"jpeg\";\n return { bytes: new Uint8Array(await blob.arrayBuffer()), extension };\n}\n\n/** Import: store a picture from a file, return its file id. */\nexport async function uploadImportedImage(bytes: Uint8Array, extension: string): Promise<string> {\n const mime = extension === \"jpg\" ? \"image/jpeg\" : `image/${extension}`;\n const { fileId } = await getUniverHost().files.upload(new File([bytes as BlobPart], `image.${extension}`, { type: mime }));\n return fileId;\n}\n"],"mappings":";AAwCA,IAAM,OAAO,uBAAO,IAAI,6BAA6B;AAErD,IAAM,OAAO,MAAY;AACvB,QAAM,IAAI;AACV,SAAQ,EAAE,IAAI,MAAM,CAAC;AACvB;AAMO,SAAS,gBAAiC;AAC/C,QAAM,QAAQ,KAAK,EAAE;AACrB,MAAI,CAAC,MAAO,OAAM,IAAI,MAAM,8FAA8F;AAC1H,SAAO;AACT;;;AC3CA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAEA,IAAM,qBAAqB;AAE3B,IAAM,qBAAqB,CAAC,WACjC,OAAO,WAAW,kBAAkB;AAE/B,IAAM,mBAAmB,CAAC,WAC/B,OAAO,MAAM,mBAAmB,MAAM;;;ACtBjC,IAAM,kBAAmC;AAAA,EAC9C,MAAM,OAAO,MAAM;AACjB,WAAO,cAAc,EAAE,MAAM,OAAO,IAAI;AAAA,EAC1C;AAAA,EACA,QAAQ,QAAQ;AACd,WAAO,cAAc,EAAE,MAAM,QAAQ,MAAM;AAAA,EAC7C;AAAA,EACA,cAAc,OAAO;AACnB,kBAAc,EAAE,kBAAkB,KAAK;AAAA,EACzC;AACF;AAGA,eAAsB,mBACpB,QAC0E;AAC1E,MAAI;AACJ,MAAI,mBAAmB,MAAM,GAAG;AAC9B,WAAO,MAAM,cAAc,EAAE,MAAM,QAAQ,iBAAiB,MAAM,CAAC;AAAA,EACrE,OAAO;AACL,UAAM,MAAM,MAAM,MAAM,MAAM;AAC9B,QAAI,CAAC,IAAI,GAAI,QAAO;AACpB,WAAO,MAAM,IAAI,KAAK;AAAA,EACxB;AACA,QAAM,YAAY,KAAK,KAAK,SAAS,KAAK,IAAI,QAAQ,KAAK,KAAK,SAAS,KAAK,IAAI,QAAQ;AAC1F,SAAO,EAAE,OAAO,IAAI,WAAW,MAAM,KAAK,YAAY,CAAC,GAAG,UAAU;AACtE;AAGA,eAAsB,oBAAoB,OAAmB,WAAoC;AAC/F,QAAM,OAAO,cAAc,QAAQ,eAAe,SAAS,SAAS;AACpE,QAAM,EAAE,OAAO,IAAI,MAAM,cAAc,EAAE,MAAM,OAAO,IAAI,KAAK,CAAC,KAAiB,GAAG,SAAS,SAAS,IAAI,EAAE,MAAM,KAAK,CAAC,CAAC;AACzH,SAAO;AACT;","names":[]}
|
|
File without changes
|
|
File without changes
|