@p10node/office-engine 0.0.0 → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (117) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +64 -1
  3. package/dist/DocViewer-Cv4LaMB_.js +9342 -0
  4. package/dist/DocViewer-Cv4LaMB_.js.map +1 -0
  5. package/dist/THIRD_PARTY_LICENSES.txt +79 -0
  6. package/dist/assets/worker-CJfZ05I7.js.map +1 -0
  7. package/dist/collab-BzN1ZI-z.js +1984 -0
  8. package/dist/collab-BzN1ZI-z.js.map +1 -0
  9. package/dist/collab.js +2 -0
  10. package/dist/core.js +2 -0
  11. package/dist/default-worker-B5CGBnic.js +9193 -0
  12. package/dist/default-worker-B5CGBnic.js.map +1 -0
  13. package/dist/embed.js +83 -0
  14. package/dist/embed.js.map +1 -0
  15. package/dist/index.js +5 -0
  16. package/dist/office-engine.embed.js +33 -0
  17. package/dist/office-engine.worker.js +9092 -0
  18. package/dist/types/collab/codec.d.ts +3 -0
  19. package/dist/types/collab/docx.d.ts +166 -0
  20. package/dist/types/collab/hosts.d.ts +24 -0
  21. package/dist/types/collab/hub.d.ts +41 -0
  22. package/dist/types/collab/index.d.ts +43 -0
  23. package/dist/types/collab/pptx-ops.d.ts +60 -0
  24. package/dist/types/collab/pptx-worker.d.ts +35 -0
  25. package/dist/types/collab/pptx.d.ts +47 -0
  26. package/dist/types/collab/protocol.d.ts +76 -0
  27. package/dist/types/collab/react.d.ts +23 -0
  28. package/dist/types/collab/session.d.ts +115 -0
  29. package/dist/types/collab/transport.d.ts +47 -0
  30. package/dist/types/collab/xlsx-ops.d.ts +72 -0
  31. package/dist/types/collab/xlsx-worker.d.ts +29 -0
  32. package/dist/types/collab/xlsx.d.ts +51 -0
  33. package/dist/types/core/color.d.ts +25 -0
  34. package/dist/types/core/default-worker.d.ts +1 -0
  35. package/dist/types/core/docx/numbering.d.ts +33 -0
  36. package/dist/types/core/docx/parser.d.ts +126 -0
  37. package/dist/types/core/docx/spec.d.ts +4 -0
  38. package/dist/types/core/docx/styles.d.ts +63 -0
  39. package/dist/types/core/docx/types.d.ts +325 -0
  40. package/dist/types/core/docx/writer.d.ts +35 -0
  41. package/dist/types/core/fonts.d.ts +1 -0
  42. package/dist/types/core/index.d.ts +15 -0
  43. package/dist/types/core/opc.d.ts +56 -0
  44. package/dist/types/core/pptx/edit.d.ts +10 -0
  45. package/dist/types/core/pptx/parser.d.ts +52 -0
  46. package/dist/types/core/pptx/types.d.ts +238 -0
  47. package/dist/types/core/raw.d.ts +40 -0
  48. package/dist/types/core/source.d.ts +65 -0
  49. package/dist/types/core/theme.d.ts +11 -0
  50. package/dist/types/core/units.d.ts +7 -0
  51. package/dist/types/core/worker/client.d.ts +48 -0
  52. package/dist/types/core/worker/engine.d.ts +27 -0
  53. package/dist/types/core/worker/protocol.d.ts +112 -0
  54. package/dist/types/core/worker/worker.d.ts +1 -0
  55. package/dist/types/core/xlsx/calc.d.ts +31 -0
  56. package/dist/types/core/xlsx/editor.d.ts +95 -0
  57. package/dist/types/core/xlsx/formula/assist.d.ts +35 -0
  58. package/dist/types/core/xlsx/formula/catalog.d.ts +14 -0
  59. package/dist/types/core/xlsx/formula/dates.d.ts +23 -0
  60. package/dist/types/core/xlsx/formula/evaluate.d.ts +33 -0
  61. package/dist/types/core/xlsx/formula/fn-date.d.ts +2 -0
  62. package/dist/types/core/xlsx/formula/fn-logic.d.ts +3 -0
  63. package/dist/types/core/xlsx/formula/fn-lookup.d.ts +3 -0
  64. package/dist/types/core/xlsx/formula/fn-math.d.ts +3 -0
  65. package/dist/types/core/xlsx/formula/fn-stats.d.ts +3 -0
  66. package/dist/types/core/xlsx/formula/fn-text.d.ts +3 -0
  67. package/dist/types/core/xlsx/formula/fn.d.ts +64 -0
  68. package/dist/types/core/xlsx/formula/format.d.ts +5 -0
  69. package/dist/types/core/xlsx/formula/functions.d.ts +4 -0
  70. package/dist/types/core/xlsx/formula/index.d.ts +17 -0
  71. package/dist/types/core/xlsx/formula/lexer.d.ts +54 -0
  72. package/dist/types/core/xlsx/formula/parser.d.ts +53 -0
  73. package/dist/types/core/xlsx/formula/refs.d.ts +23 -0
  74. package/dist/types/core/xlsx/formula/transform.d.ts +21 -0
  75. package/dist/types/core/xlsx/formula/types.d.ts +59 -0
  76. package/dist/types/core/xlsx/formula/values.d.ts +49 -0
  77. package/dist/types/core/xlsx/numfmt.d.ts +11 -0
  78. package/dist/types/core/xlsx/structure.d.ts +31 -0
  79. package/dist/types/core/xlsx/styles.d.ts +17 -0
  80. package/dist/types/core/xlsx/types.d.ts +193 -0
  81. package/dist/types/core/xlsx/workbook.d.ts +94 -0
  82. package/dist/types/core/xml.d.ts +80 -0
  83. package/dist/types/core/zip.d.ts +35 -0
  84. package/dist/types/core/zipwrite.d.ts +9 -0
  85. package/dist/types/embed.d.ts +30 -0
  86. package/dist/types/index.d.ts +18 -0
  87. package/dist/types/react/DocViewer.d.ts +43 -0
  88. package/dist/types/react/common/ContextMenu.d.ts +21 -0
  89. package/dist/types/react/common/Dialog.d.ts +27 -0
  90. package/dist/types/react/common/Slots.d.ts +18 -0
  91. package/dist/types/react/common/Status.d.ts +6 -0
  92. package/dist/types/react/common/ZoomControl.d.ts +6 -0
  93. package/dist/types/react/common/hooks.d.ts +20 -0
  94. package/dist/types/react/docx/DocxEditor.d.ts +172 -0
  95. package/dist/types/react/docx/DocxToolbar.d.ts +18 -0
  96. package/dist/types/react/docx/DocxView.d.ts +8 -0
  97. package/dist/types/react/docx/FindBar.d.ts +22 -0
  98. package/dist/types/react/docx/html.d.ts +8 -0
  99. package/dist/types/react/docx/render.d.ts +24 -0
  100. package/dist/types/react/docx/tables.d.ts +20 -0
  101. package/dist/types/react/edit/Toolbar.d.ts +130 -0
  102. package/dist/types/react/edit/input.d.ts +81 -0
  103. package/dist/types/react/edit/rich.d.ts +40 -0
  104. package/dist/types/react/injectStyles.d.ts +4 -0
  105. package/dist/types/react/pptx/PptxEditor.d.ts +95 -0
  106. package/dist/types/react/pptx/PptxToolbar.d.ts +36 -0
  107. package/dist/types/react/pptx/PptxView.d.ts +24 -0
  108. package/dist/types/react/pptx/Presenter.d.ts +9 -0
  109. package/dist/types/react/pptx/Slide.d.ts +28 -0
  110. package/dist/types/react/pptx/geometry.d.ts +5 -0
  111. package/dist/types/react/useDocument.d.ts +11 -0
  112. package/dist/types/react/xlsx/XlsxToolbar.d.ts +27 -0
  113. package/dist/types/react/xlsx/XlsxView.d.ts +16 -0
  114. package/dist/types/react/xlsx/axis.d.ts +19 -0
  115. package/dist/xlsx-ops-CsjNpMI0.js +244 -0
  116. package/dist/xlsx-ops-CsjNpMI0.js.map +1 -0
  117. package/package.json +74 -2
@@ -0,0 +1,24 @@
1
+ import { type ReactNode } from 'react';
2
+ import type { PresentationMeta, SlideModel } from '../../core/pptx/types';
3
+ import type { DocumentClient } from '../../core/worker/client';
4
+ import { type Zoom } from '../common/ZoomControl';
5
+ import { type SlideEditing } from './Slide';
6
+ export declare function useSlide(client: DocumentClient, index: number): SlideModel | {
7
+ error: string;
8
+ } | undefined;
9
+ export declare function SlideSlot(props: {
10
+ client: DocumentClient;
11
+ index: number;
12
+ meta: PresentationMeta;
13
+ scale: number;
14
+ live: boolean;
15
+ editing?: SlideEditing;
16
+ overlay?: ReactNode;
17
+ }): import("react").JSX.Element;
18
+ export interface PptxViewProps {
19
+ client: DocumentClient;
20
+ onStatus?: (s: string) => void;
21
+ initialZoom?: Zoom;
22
+ thumbnails?: boolean;
23
+ }
24
+ export declare function PptxView({ client, onStatus, initialZoom, thumbnails }: PptxViewProps): import("react").JSX.Element;
@@ -0,0 +1,9 @@
1
+ import type { PresentationMeta } from '../../core/pptx/types';
2
+ import type { DocumentClient } from '../../core/worker/client';
3
+ /** Full-screen slideshow: ←/→/Space/PageUp/PageDown/Home/End, click = next, Esc = exit. */
4
+ export declare function Presenter({ client, meta, start, onClose }: {
5
+ client: DocumentClient;
6
+ meta: PresentationMeta;
7
+ start: number;
8
+ onClose: () => void;
9
+ }): import("react").JSX.Element;
@@ -0,0 +1,28 @@
1
+ import { type ReactNode } from 'react';
2
+ import type { SlideModel, TextBody } from '../../core/pptx/types';
3
+ import type { DocumentClient } from '../../core/worker/client';
4
+ export interface TextEdit {
5
+ /** contentEditable root callback */
6
+ root: (el: HTMLDivElement | null) => void;
7
+ }
8
+ export declare function TextView({ text, flow, edit }: {
9
+ text: TextBody;
10
+ flow?: boolean;
11
+ edit?: TextEdit;
12
+ }): import("react").JSX.Element;
13
+ export interface SlideEditing {
14
+ sid: number;
15
+ text: TextBody;
16
+ edit: TextEdit;
17
+ }
18
+ export interface SlideViewProps {
19
+ model: SlideModel;
20
+ client: DocumentClient;
21
+ scale: number;
22
+ /** load media (false for far-away thumbnails) */
23
+ live?: boolean;
24
+ editing?: SlideEditing;
25
+ /** extra layer drawn in slide coordinates (selection handles) */
26
+ overlay?: ReactNode;
27
+ }
28
+ export declare const SlideView: import("react").MemoExoticComponent<({ model, client, scale, live, editing, overlay }: SlideViewProps) => import("react").JSX.Element>;
@@ -0,0 +1,5 @@
1
+ /** SVG paths for common DrawingML preset geometries (box-local px). Unknown presets fall back to a rectangle. */
2
+ type Adj = Record<string, number> | undefined;
3
+ export declare const LINE_GEOMS: Set<string>;
4
+ export declare function geomPath(geom: string, w: number, h: number, adj: Adj): string;
5
+ export {};
@@ -0,0 +1,11 @@
1
+ import type { DocSource } from '../core/source';
2
+ import { DocumentClient, type OpenOptions } from '../core/worker/client';
3
+ import type { Events } from '../core/worker/protocol';
4
+ export interface DocumentState {
5
+ client: DocumentClient | null;
6
+ error: Error | null;
7
+ loading: boolean;
8
+ progress: Events['progress'] | null;
9
+ }
10
+ /** Opens a document in a worker and closes it on unmount / source change. */
11
+ export declare function useDocument(src: DocSource | null | undefined, options?: OpenOptions): DocumentState;
@@ -0,0 +1,27 @@
1
+ import type { FmtPatch } from '../../core/xlsx/types';
2
+ export type MergeMode = 'all' | 'across' | 'down' | 'unmerge';
3
+ export declare function XlsxToolbar(props: {
4
+ css: Record<string, string | number>;
5
+ /** workbook default font (cells without an explicit font) */
6
+ base: {
7
+ fontFamily?: string;
8
+ fontSize?: string | number;
9
+ };
10
+ format: string;
11
+ merged: boolean;
12
+ frozen: boolean;
13
+ gridlines: boolean;
14
+ painter: boolean;
15
+ onToggle: (k: 'b' | 'i' | 'u' | 'strike') => void;
16
+ onFormat: (p: FmtPatch) => void;
17
+ onUndo: () => void;
18
+ onRedo: () => void;
19
+ onPaint: () => void;
20
+ onMerge: (mode: MergeMode) => void;
21
+ onFreeze: (k: 'none' | 'row' | 'col' | 'sel') => void;
22
+ onGridlines: () => void;
23
+ onFunc: (fn: string | null) => void;
24
+ onSort: (desc: boolean) => void;
25
+ onRows: (k: 'rowAbove' | 'rowBelow' | 'colLeft' | 'colRight' | 'delRow' | 'delCol' | 'hideRows' | 'hideCols' | 'unhideRows' | 'unhideCols') => void;
26
+ onFind: () => void;
27
+ }): import("react").JSX.Element;
@@ -0,0 +1,16 @@
1
+ import type { Range } from '../../core/xlsx/types';
2
+ import type { DocumentClient } from '../../core/worker/client';
3
+ export interface XlsxViewProps {
4
+ client: DocumentClient;
5
+ onStatus?: (s: string) => void;
6
+ initialSheet?: number;
7
+ }
8
+ export declare function XlsxView({ client, onStatus, initialSheet }: XlsxViewProps): import("react").JSX.Element;
9
+ export { ContextMenu, type MenuItem } from '../common/ContextMenu';
10
+ interface Selection {
11
+ ar: number;
12
+ ac: number;
13
+ fr: number;
14
+ fc: number;
15
+ }
16
+ export declare const rectOf: (s: Selection) => Range;
@@ -0,0 +1,19 @@
1
+ /** Variable-size axis (rows or columns): default size + sparse overrides, O(log n) lookups. */
2
+ export declare class Axis {
3
+ def: number;
4
+ count: number;
5
+ private custom;
6
+ private keys;
7
+ private cum;
8
+ private dirty;
9
+ constructor(def: number);
10
+ set(i: number, size: number): void;
11
+ setRange(min: number, max: number, size: number): void;
12
+ private build;
13
+ size(i: number): number;
14
+ /** Start offset of index i. */
15
+ pos(i: number): number;
16
+ total(): number;
17
+ /** Index containing offset px (clamped to [0, count-1]). */
18
+ index(px: number): number;
19
+ }
@@ -0,0 +1,244 @@
1
+
2
+ // src/collab/xlsx-ops.ts
3
+ var e = /* @__PURE__ */ new Set([
4
+ "insertRows",
5
+ "deleteRows",
6
+ "insertCols",
7
+ "deleteCols"
8
+ ]), t = (t) => t.t === "book" || t.t === "sheet" && e.has(t.op.op);
9
+ function n(e, t, n) {
10
+ if (n >= 0) return e >= t ? e + n : e;
11
+ let r = -n;
12
+ return e < t ? e : e < t + r ? null : e - r;
13
+ }
14
+ function r(e, t, n, r) {
15
+ if (r >= 0) return [e >= n ? e + r : e, t >= n ? t + r : t];
16
+ let i = -r;
17
+ if (t < n) return [e, t];
18
+ if (e >= n + i) return [e - i, t - i];
19
+ let a = e < n ? e : n, o = t < n + i ? n - 1 : t - i;
20
+ return o < a ? null : [a, o];
21
+ }
22
+ function i(e, t, n, i) {
23
+ let a = t === "row" ? r(e.r0, e.r1, n, i) : r(e.c0, e.c1, n, i);
24
+ return a ? t === "row" ? {
25
+ ...e,
26
+ r0: a[0],
27
+ r1: a[1]
28
+ } : {
29
+ ...e,
30
+ c0: a[0],
31
+ c1: a[1]
32
+ } : null;
33
+ }
34
+ function a(e, t, a, o) {
35
+ let s = (e, n, i) => i === t ? r(e, n, a, o) : [e, n];
36
+ switch (e.op) {
37
+ case "insertRows":
38
+ case "insertCols": {
39
+ if (e.op === "insertRows" != (t === "row")) return e;
40
+ let n = o >= 0 ? e.at >= a ? e.at + o : e.at : e.at < a ? e.at : e.at < a - o ? a : e.at + o;
41
+ return n === e.at ? e : {
42
+ ...e,
43
+ at: n
44
+ };
45
+ }
46
+ case "deleteRows":
47
+ case "deleteCols": {
48
+ if (e.op === "deleteRows" != (t === "row")) return e;
49
+ let n = r(e.at, e.at + e.n - 1, a, o);
50
+ return n ? {
51
+ ...e,
52
+ at: n[0],
53
+ n: n[1] - n[0] + 1
54
+ } : null;
55
+ }
56
+ case "merge":
57
+ case "unmerge":
58
+ case "fill": {
59
+ let n = i(e.range, t, a, o);
60
+ return n ? {
61
+ ...e,
62
+ range: n
63
+ } : null;
64
+ }
65
+ case "sort": {
66
+ let r = i(e.range, t, a, o);
67
+ if (!r) return null;
68
+ let s = t === "col" ? n(e.col, a, o) : e.col;
69
+ return s === null ? null : {
70
+ ...e,
71
+ range: r,
72
+ col: s
73
+ };
74
+ }
75
+ case "hideRows":
76
+ case "hideCols": {
77
+ let t = s(e.a, e.b, e.op === "hideRows" ? "row" : "col");
78
+ return t ? {
79
+ ...e,
80
+ a: t[0],
81
+ b: t[1]
82
+ } : null;
83
+ }
84
+ case "colWidth": {
85
+ let t = s(e.c0, e.c1, "col");
86
+ return t ? {
87
+ ...e,
88
+ c0: t[0],
89
+ c1: t[1]
90
+ } : null;
91
+ }
92
+ case "rowHeight": {
93
+ let t = s(e.r0, e.r1, "row");
94
+ return t ? {
95
+ ...e,
96
+ r0: t[0],
97
+ r1: t[1]
98
+ } : null;
99
+ }
100
+ default: return e;
101
+ }
102
+ }
103
+ function o(t, r) {
104
+ if (r.t === "book") return r.op.op === "delete" && "sheet" in t && t.sheet === r.op.path ? null : t;
105
+ if (r.t !== "sheet" || !e.has(r.op.op) || !("sheet" in t) || t.sheet !== r.sheet) return t;
106
+ let o = r.op, s = o.op.endsWith("Rows") ? "row" : "col", c = o.op.startsWith("insert") ? o.n : -o.n;
107
+ switch (t.t) {
108
+ case "set": {
109
+ let e = [];
110
+ for (let r of t.cells) {
111
+ let t = n(s === "row" ? r.r : r.c, o.at, c);
112
+ t !== null && e.push(s === "row" ? {
113
+ ...r,
114
+ r: t
115
+ } : {
116
+ ...r,
117
+ c: t
118
+ });
119
+ }
120
+ return e.length ? {
121
+ ...t,
122
+ cells: e
123
+ } : null;
124
+ }
125
+ case "fmt": {
126
+ let e = i(t.range, s, o.at, c);
127
+ return e ? {
128
+ ...t,
129
+ range: e
130
+ } : null;
131
+ }
132
+ case "sheet": {
133
+ let e = a(t.op, s, o.at, c);
134
+ return e === t.op ? t : e ? {
135
+ ...t,
136
+ op: e
137
+ } : null;
138
+ }
139
+ case "replace": {
140
+ if (!t.at) return t;
141
+ let e = n(s === "row" ? t.at.r : t.at.c, o.at, c);
142
+ return e === null ? null : {
143
+ ...t,
144
+ at: s === "row" ? {
145
+ ...t.at,
146
+ r: e
147
+ } : {
148
+ ...t.at,
149
+ c: e
150
+ }
151
+ };
152
+ }
153
+ }
154
+ return t;
155
+ }
156
+ var s = {
157
+ r0: 0,
158
+ c0: 0,
159
+ r1: 2 ** 53 - 1,
160
+ c1: 2 ** 53 - 1
161
+ };
162
+ function c(e) {
163
+ switch (e.t) {
164
+ case "set": {
165
+ let t = Infinity, n = Infinity, r = -1, i = -1;
166
+ for (let a of e.cells) t = Math.min(t, a.r), n = Math.min(n, a.c), r = Math.max(r, a.r), i = Math.max(i, a.c);
167
+ return {
168
+ sheet: e.sheet,
169
+ range: {
170
+ r0: t,
171
+ c0: n,
172
+ r1: r,
173
+ c1: i
174
+ }
175
+ };
176
+ }
177
+ case "fmt": return {
178
+ sheet: e.sheet,
179
+ range: e.range
180
+ };
181
+ case "replace": return {
182
+ sheet: e.sheet,
183
+ range: e.at ? {
184
+ r0: e.at.r,
185
+ c0: e.at.c,
186
+ r1: e.at.r,
187
+ c1: e.at.c
188
+ } : s
189
+ };
190
+ case "sheet": {
191
+ let t = e.op;
192
+ return "range" in t ? {
193
+ sheet: e.sheet,
194
+ range: t.range
195
+ } : t.op === "hideRows" ? {
196
+ sheet: e.sheet,
197
+ range: {
198
+ ...s,
199
+ r0: t.a,
200
+ r1: t.b
201
+ }
202
+ } : t.op === "hideCols" ? {
203
+ sheet: e.sheet,
204
+ range: {
205
+ ...s,
206
+ c0: t.a,
207
+ c1: t.b
208
+ }
209
+ } : t.op === "colWidth" ? {
210
+ sheet: e.sheet,
211
+ range: {
212
+ ...s,
213
+ c0: t.c0,
214
+ c1: t.c1
215
+ }
216
+ } : t.op === "rowHeight" ? {
217
+ sheet: e.sheet,
218
+ range: {
219
+ ...s,
220
+ r0: t.r0,
221
+ r1: t.r1
222
+ }
223
+ } : {
224
+ sheet: e.sheet,
225
+ range: s
226
+ };
227
+ }
228
+ default: return null;
229
+ }
230
+ }
231
+ var l = (e, t) => e.r0 <= t.r1 && t.r0 <= e.r1 && e.c0 <= t.c1 && t.c0 <= e.c1;
232
+ function u(e, n) {
233
+ if (n.some((e) => t(e) || e.t === "revert") || e.some((e) => e.t === "revert" || t(e))) return !0;
234
+ let r = (e) => e.t === "fmt" && e.patch.xf === void 0 && !e.patch.clear;
235
+ if (e.some(r) && n.some(r)) return !0;
236
+ let i = n.map(c);
237
+ return e.some((e) => {
238
+ let t = c(e);
239
+ return !!t && i.some((e) => !!e && e.sheet === t.sheet && l(t.range, e.range));
240
+ });
241
+ }
242
+ export { o as i, u as n, t as r, e as t };
243
+
244
+ //# sourceMappingURL=xlsx-ops-CsjNpMI0.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"xlsx-ops-CsjNpMI0.js","names":["STRUCTURAL","isStructural","o","shiftIdx","x","at","d","shiftSpan","n","a","b","na","nb","shiftRange","s","axis","r","shiftSheetOp","span","ax","op","range","col","transformX","prior","p","cells","c","next","ALL","footprint","r0","c0","r1","c1","overlap","conflictsX","remote","pending","styles","fp"],"sources":["../src/collab/xlsx-ops.ts"],"sourcesContent":["/** XLSX collaboration operations (shared by the main-thread adapter and the worker) + their transforms. */\nimport type { CellInput, FindOptions, FmtPatch, Range, SheetOp } from '../core/xlsx/types'\n\n/** sheets are addressed by part path: indexes move when sheets are added / reordered */\nexport type PBookOp =\n | { op: 'add'; name?: string; after?: string }\n | { op: 'rename'; path: string; name: string }\n | { op: 'delete'; path: string }\n | { op: 'move'; path: string; to: number }\n\nexport type XOp =\n | { t: 'set'; id: string; sheet: string; cells: CellInput[] }\n | { t: 'fmt'; id: string; sheet: string; range: Range; patch: FmtPatch }\n | { t: 'sheet'; id: string; sheet: string; op: SheetOp }\n | { t: 'replace'; id: string; sheet: string; query: string; by: string; opts?: FindOptions; at?: { r: number; c: number } }\n | { t: 'book'; id: string; op: PBookOp }\n /** sets the cells changed by op `target` back to their state before (`prev`) or after (`next`) it */\n | { t: 'revert'; id: string; target: string; which: 'prev' | 'next' }\n\nexport const STRUCTURAL = new Set<SheetOp['op']>(['insertRows', 'deleteRows', 'insertCols', 'deleteCols'])\n\nexport const isStructural = (o: XOp) => o.t === 'book' || (o.t === 'sheet' && STRUCTURAL.has(o.op.op))\n\n// ---------------------------------------------------------------- index shifting\n\n/** index after `n` items were inserted (n > 0) or deleted (n < 0) at `at`; null when deleted */\nexport function shiftIdx(x: number, at: number, n: number): number | null {\n if (n >= 0) return x >= at ? x + n : x\n const d = -n\n return x < at ? x : x < at + d ? null : x - d\n}\n\n/** inclusive span [a, b] after an insert / delete; null when entirely deleted */\nexport function shiftSpan(a: number, b: number, at: number, n: number): [number, number] | null {\n if (n >= 0) return [a >= at ? a + n : a, b >= at ? b + n : b]\n const d = -n\n if (b < at) return [a, b]\n if (a >= at + d) return [a - d, b - d]\n const na = a < at ? a : at\n const nb = b < at + d ? at - 1 : b - d\n return nb < na ? null : [na, nb]\n}\n\nfunction shiftRange(r: Range, axis: 'row' | 'col', at: number, n: number): Range | null {\n const s = axis === 'row' ? shiftSpan(r.r0, r.r1, at, n) : shiftSpan(r.c0, r.c1, at, n)\n if (!s) return null\n return axis === 'row' ? { ...r, r0: s[0], r1: s[1] } : { ...r, c0: s[0], c1: s[1] }\n}\n\nfunction shiftSheetOp(op: SheetOp, axis: 'row' | 'col', at: number, n: number): SheetOp | null {\n const span = (a: number, b: number, ax: 'row' | 'col') => (ax === axis ? shiftSpan(a, b, at, n) : ([a, b] as [number, number]))\n switch (op.op) {\n case 'insertRows':\n case 'insertCols': {\n if ((op.op === 'insertRows') !== (axis === 'row')) return op\n // concurrent insert at the same place: the one sequenced first stays first\n const x = n >= 0 ? (op.at >= at ? op.at + n : op.at) : op.at < at ? op.at : op.at < at - n ? at : op.at + n\n return x === op.at ? op : { ...op, at: x }\n }\n case 'deleteRows':\n case 'deleteCols': {\n if ((op.op === 'deleteRows') !== (axis === 'row')) return op\n const s = shiftSpan(op.at, op.at + op.n - 1, at, n)\n return s ? { ...op, at: s[0], n: s[1] - s[0] + 1 } : null\n }\n case 'merge':\n case 'unmerge':\n case 'fill': {\n const range = shiftRange(op.range, axis, at, n)\n return range ? { ...op, range } : null\n }\n case 'sort': {\n const range = shiftRange(op.range, axis, at, n)\n if (!range) return null\n const col = axis === 'col' ? shiftIdx(op.col, at, n) : op.col\n return col === null ? null : { ...op, range, col }\n }\n case 'hideRows':\n case 'hideCols': {\n const s = span(op.a, op.b, op.op === 'hideRows' ? 'row' : 'col')\n return s ? { ...op, a: s[0], b: s[1] } : null\n }\n case 'colWidth': {\n const s = span(op.c0, op.c1, 'col')\n return s ? { ...op, c0: s[0], c1: s[1] } : null\n }\n case 'rowHeight': {\n const s = span(op.r0, op.r1, 'row')\n return s ? { ...op, r0: s[0], r1: s[1] } : null\n }\n default:\n return op\n }\n}\n\n/** `op` adjusted to apply after `prior` (deterministic) */\nexport function transformX(op: XOp, prior: XOp): XOp | null {\n if (prior.t === 'book') {\n if (prior.op.op === 'delete' && 'sheet' in op && op.sheet === prior.op.path) return null\n return op\n }\n if (prior.t !== 'sheet' || !STRUCTURAL.has(prior.op.op) || !('sheet' in op) || op.sheet !== prior.sheet) return op\n const p = prior.op as { op: string; at: number; n: number }\n const axis = p.op.endsWith('Rows') ? 'row' : 'col'\n const n = p.op.startsWith('insert') ? p.n : -p.n\n switch (op.t) {\n case 'set': {\n const cells: CellInput[] = []\n for (const c of op.cells) {\n const x = shiftIdx(axis === 'row' ? c.r : c.c, p.at, n)\n if (x !== null) cells.push(axis === 'row' ? { ...c, r: x } : { ...c, c: x })\n }\n return cells.length ? { ...op, cells } : null\n }\n case 'fmt': {\n const range = shiftRange(op.range, axis, p.at, n)\n return range ? { ...op, range } : null\n }\n case 'sheet': {\n const next = shiftSheetOp(op.op, axis, p.at, n)\n return next === op.op ? op : next ? { ...op, op: next } : null\n }\n case 'replace': {\n if (!op.at) return op\n const x = shiftIdx(axis === 'row' ? op.at.r : op.at.c, p.at, n)\n return x === null ? null : { ...op, at: axis === 'row' ? { ...op.at, r: x } : { ...op.at, c: x } }\n }\n }\n return op\n}\n\n// ---------------------------------------------------------------- footprint (for conflict detection)\n\nconst ALL: Range = { r0: 0, c0: 0, r1: Number.MAX_SAFE_INTEGER, c1: Number.MAX_SAFE_INTEGER }\n\nexport function footprint(op: XOp): { sheet: string; range: Range } | null {\n switch (op.t) {\n case 'set': {\n let r0 = Infinity\n let c0 = Infinity\n let r1 = -1\n let c1 = -1\n for (const c of op.cells) {\n r0 = Math.min(r0, c.r)\n c0 = Math.min(c0, c.c)\n r1 = Math.max(r1, c.r)\n c1 = Math.max(c1, c.c)\n }\n return { sheet: op.sheet, range: { r0, c0, r1, c1 } }\n }\n case 'fmt':\n return { sheet: op.sheet, range: op.range }\n case 'replace':\n return { sheet: op.sheet, range: op.at ? { r0: op.at.r, c0: op.at.c, r1: op.at.r, c1: op.at.c } : ALL }\n case 'sheet': {\n const o = op.op\n if ('range' in o) return { sheet: op.sheet, range: o.range }\n if (o.op === 'hideRows') return { sheet: op.sheet, range: { ...ALL, r0: o.a, r1: o.b } }\n if (o.op === 'hideCols') return { sheet: op.sheet, range: { ...ALL, c0: o.a, c1: o.b } }\n if (o.op === 'colWidth') return { sheet: op.sheet, range: { ...ALL, c0: o.c0, c1: o.c1 } }\n if (o.op === 'rowHeight') return { sheet: op.sheet, range: { ...ALL, r0: o.r0, r1: o.r1 } }\n return { sheet: op.sheet, range: ALL }\n }\n default:\n return null\n }\n}\n\nconst overlap = (a: Range, b: Range) => a.r0 <= b.r1 && b.r0 <= a.r1 && a.c0 <= b.c1 && b.c0 <= a.c1\n\n/** whether remote ops interact with pending local ones (→ rebase) */\nexport function conflictsX(pending: XOp[], remote: XOp[]): boolean {\n if (remote.some((o) => isStructural(o) || o.t === 'revert')) return true\n if (pending.some((o) => o.t === 'revert' || isStructural(o))) return true\n // derived styles are appended to one table: keep its order identical everywhere\n const styles = (o: XOp) => o.t === 'fmt' && o.patch.xf === undefined && !o.patch.clear\n if (pending.some(styles) && remote.some(styles)) return true\n const fp = remote.map(footprint)\n return pending.some((p) => {\n const a = footprint(p)\n return !!a && fp.some((b) => !!b && b.sheet === a.sheet && overlap(a.range, b.range))\n })\n}\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,8 +1,80 @@
1
1
  {
2
2
  "name": "@p10node/office-engine",
3
- "version": "0.0.0",
4
- "description": "Placeholder to reserve the name. Install 0.1.0 or later.",
3
+ "version": "0.1.0",
4
+ "description": "Browser engine to view DOCX, XLSX, PPTX progressively (worker-based, range-loading, virtualized React views)",
5
+ "type": "module",
5
6
  "license": "MIT",
7
+ "files": [
8
+ "dist"
9
+ ],
10
+ "main": "./dist/index.js",
11
+ "module": "./dist/index.js",
12
+ "types": "./dist/types/index.d.ts",
13
+ "exports": {
14
+ ".": {
15
+ "types": "./dist/types/index.d.ts",
16
+ "import": "./dist/index.js"
17
+ },
18
+ "./core": {
19
+ "types": "./dist/types/core/index.d.ts",
20
+ "import": "./dist/core.js"
21
+ },
22
+ "./embed": {
23
+ "types": "./dist/types/embed.d.ts",
24
+ "import": "./dist/embed.js"
25
+ },
26
+ "./worker": "./dist/office-engine.worker.js",
27
+ "./embed.js": "./dist/office-engine.embed.js",
28
+ "./collab": {
29
+ "types": "./dist/types/collab/index.d.ts",
30
+ "import": "./dist/collab.js"
31
+ }
32
+ },
33
+ "sideEffects": [
34
+ "./src/core/default-worker.ts",
35
+ "./src/embed.ts",
36
+ "./dist/index.js",
37
+ "./dist/core.js",
38
+ "./dist/embed.js",
39
+ "./dist/office-engine.embed.js",
40
+ "**/*.css"
41
+ ],
42
+ "scripts": {
43
+ "dev": "vite --config vite.playground.config.ts",
44
+ "build": "bun run clean && bun run build:lib && bun run build:embed && bun run build:worker && bun run build:types",
45
+ "build:lib": "vite build",
46
+ "build:embed": "vite build --config vite.embed.config.ts",
47
+ "build:types": "tsc -p tsconfig.build.json",
48
+ "build:playground": "vite build --config vite.playground.config.ts",
49
+ "typecheck": "tsc --noEmit",
50
+ "test": "bun test",
51
+ "fixtures": "bun scripts/gen-fixtures.ts",
52
+ "build:worker": "vite build --config vite.worker.config.ts",
53
+ "collab": "bun scripts/collab-server.ts",
54
+ "clean": "rm -rf dist",
55
+ "screenshots": "bun scripts/screenshots.ts",
56
+ "build:site": "bun scripts/build-site.ts"
57
+ },
58
+ "peerDependencies": {
59
+ "react": ">=18",
60
+ "react-dom": ">=18"
61
+ },
62
+ "devDependencies": {
63
+ "@types/bun": "^1.4.4",
64
+ "@types/react": "^19.3.0",
65
+ "@types/react-dom": "^19.3.0",
66
+ "@vitejs/plugin-react": "^6.1.2",
67
+ "fflate": "^0.8.3",
68
+ "playwright-core": "^1.64.1",
69
+ "react": "^19.3.1",
70
+ "react-dom": "^19.3.1",
71
+ "typescript": "^7.0.2",
72
+ "vite": "^8.3.5"
73
+ },
74
+ "publishConfig": {
75
+ "access": "public"
76
+ },
77
+ "homepage": "https://p10node.github.io/office-engine/",
6
78
  "repository": {
7
79
  "type": "git",
8
80
  "url": "git+https://github.com/p10node/office-engine.git"