@casualoffice/sheets 0.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +200 -0
- package/dist/embed/embed-runtime.js +537 -0
- package/dist/embed/embed.html +29 -0
- package/dist/embed/parser.worker.js +48474 -0
- package/dist/embed.cjs +225 -0
- package/dist/embed.cjs.map +1 -0
- package/dist/embed.d.cts +100 -0
- package/dist/embed.d.ts +100 -0
- package/dist/embed.js +204 -0
- package/dist/embed.js.map +1 -0
- package/dist/index.cjs +1549 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +9 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.js +1530 -0
- package/dist/index.js.map +1 -0
- package/dist/parser.worker.cjs +48469 -0
- package/dist/parser.worker.cjs.map +1 -0
- package/dist/parser.worker.js +48474 -0
- package/dist/parser.worker.js.map +1 -0
- package/dist/protocol--KyBQUjU.d.cts +171 -0
- package/dist/protocol-cEzy7S0i.d.ts +171 -0
- package/dist/sheets.cjs +677 -0
- package/dist/sheets.cjs.map +1 -0
- package/dist/sheets.d.cts +177 -0
- package/dist/sheets.d.ts +177 -0
- package/dist/sheets.js +658 -0
- package/dist/sheets.js.map +1 -0
- package/dist/signing.cjs +706 -0
- package/dist/signing.cjs.map +1 -0
- package/dist/signing.d.cts +141 -0
- package/dist/signing.d.ts +141 -0
- package/dist/signing.js +683 -0
- package/dist/signing.js.map +1 -0
- package/dist/styles.cjs +10 -0
- package/dist/styles.cjs.map +1 -0
- package/dist/styles.d.cts +2 -0
- package/dist/styles.d.ts +2 -0
- package/dist/styles.js +8 -0
- package/dist/styles.js.map +1 -0
- package/dist/types-s_O0u6Cg.d.cts +90 -0
- package/dist/types-s_O0u6Cg.d.ts +90 -0
- package/dist/univer.cjs +220 -0
- package/dist/univer.cjs.map +1 -0
- package/dist/univer.d.cts +60 -0
- package/dist/univer.d.ts +60 -0
- package/dist/univer.js +187 -0
- package/dist/univer.js.map +1 -0
- package/dist/xlsx.cjs +3388 -0
- package/dist/xlsx.cjs.map +1 -0
- package/dist/xlsx.d.cts +383 -0
- package/dist/xlsx.d.ts +383 -0
- package/dist/xlsx.js +3383 -0
- package/dist/xlsx.js.map +1 -0
- package/package.json +293 -0
- package/src/embed/EmbedHostTransport.ts +226 -0
- package/src/embed/EmbedTransport.ts +323 -0
- package/src/embed/EmbedTransport.unit.test.ts +161 -0
- package/src/embed/index.ts +40 -0
- package/src/embed/protocol.ts +258 -0
- package/src/embed-runtime/embed.html +29 -0
- package/src/embed-runtime/index.tsx +440 -0
- package/src/index.ts +16 -0
- package/src/sheets/CasualSheets.tsx +319 -0
- package/src/sheets/CasualSheetsIframe.tsx +220 -0
- package/src/sheets/api.ts +108 -0
- package/src/sheets/index.ts +11 -0
- package/src/signing/SigningPane.tsx +374 -0
- package/src/signing/SigningProvider.tsx +126 -0
- package/src/signing/captures.tsx +316 -0
- package/src/signing/controller.ts +151 -0
- package/src/signing/controller.unit.test.ts +133 -0
- package/src/signing/index.ts +44 -0
- package/src/signing/types.ts +89 -0
- package/src/styles.ts +16 -0
- package/src/univer/index.ts +17 -0
- package/src/univer/lazy-plugins.ts +280 -0
- package/src/xlsx/_perf.ts +14 -0
- package/src/xlsx/_snapshot-constants.ts +15 -0
- package/src/xlsx/comments-resource.ts +209 -0
- package/src/xlsx/constants.ts +9 -0
- package/src/xlsx/data-validation-resource.ts +219 -0
- package/src/xlsx/import.ts +35 -0
- package/src/xlsx/index.ts +40 -0
- package/src/xlsx/page-setup-resource.ts +205 -0
- package/src/xlsx/parse-impl.ts +418 -0
- package/src/xlsx/parse-in-worker.ts +82 -0
- package/src/xlsx/parser.worker.ts +39 -0
- package/src/xlsx/passthrough-resource.ts +175 -0
- package/src/xlsx/pivot-passthrough.ts +359 -0
- package/src/xlsx/style-mapping.ts +171 -0
- package/src/xlsx/tables-resource.ts +211 -0
package/dist/univer.d.ts
ADDED
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { Univer, IWorkbookData } from '@univerjs/core';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Lazy plugin loading — pipeline Stage 4. The cheap plugins (render,
|
|
5
|
+
* formula, sheets, sheets-ui, numfmt, docs) stay eager because every
|
|
6
|
+
* workbook needs them. The heavy / feature-specific plugins (CF, DV,
|
|
7
|
+
* hyperlink, table, note, thread-comment, drawing, sort, filter,
|
|
8
|
+
* find-replace) load on demand:
|
|
9
|
+
*
|
|
10
|
+
* 1. Eagerly when a snapshot is about to mount and we detect the
|
|
11
|
+
* plugin's resource key on it (e.g. `SHEET_CONDITIONAL_FORMATTING_PLUGIN`
|
|
12
|
+
* in `data.resources`). This is the safety net: missing this would
|
|
13
|
+
* silently drop plugin data on file open.
|
|
14
|
+
* 2. Lazily when the user reaches for the feature — opens the Data
|
|
15
|
+
* tab (sort/filter), hits Ctrl+F (find-replace), uses the Insert
|
|
16
|
+
* tab (drawing), etc. The shell hooks `ensurePlugin(...)` into
|
|
17
|
+
* these triggers and awaits before the action runs.
|
|
18
|
+
*
|
|
19
|
+
* Each loader returns the plugins-to-register in the correct order
|
|
20
|
+
* (base before UI, same as `plugins.ts`). Registration order matters
|
|
21
|
+
* in Univer; the loaders bundle a small group together to keep that
|
|
22
|
+
* locality explicit.
|
|
23
|
+
*/
|
|
24
|
+
type LazyPluginGroup = 'cf' | 'dv' | 'hyperlink' | 'note' | 'table' | 'threadComment' | 'drawing' | 'sort' | 'filter' | 'findReplace';
|
|
25
|
+
declare function setUniverForLazyLoad(univer: Univer | null): void;
|
|
26
|
+
/**
|
|
27
|
+
* Idempotent: subsequent calls for the same group resolve immediately
|
|
28
|
+
* if the plugin is already loaded; concurrent calls share the same
|
|
29
|
+
* in-flight promise so we never double-register.
|
|
30
|
+
*/
|
|
31
|
+
declare function ensurePlugin(univer: Univer, group: LazyPluginGroup): Promise<void>;
|
|
32
|
+
/**
|
|
33
|
+
* Shell-friendly variant of `ensurePlugin` that pulls the Univer
|
|
34
|
+
* instance from the module-level holder set by `UniverSheet.tsx`. Use
|
|
35
|
+
* this anywhere we only have the FUniver facade (toolbar callbacks,
|
|
36
|
+
* panel handlers). Returns a resolved promise if the holder is empty —
|
|
37
|
+
* the worst case is a no-op, never a throw.
|
|
38
|
+
*/
|
|
39
|
+
declare function ensurePluginByName(group: LazyPluginGroup): Promise<void>;
|
|
40
|
+
/**
|
|
41
|
+
* Walk a snapshot for plugin-owned resources + side-channel hyperlinks
|
|
42
|
+
* and eagerly load every group that's referenced. Returns a promise
|
|
43
|
+
* the caller MUST await before `createUnit` — Univer's resource manager
|
|
44
|
+
* silently discards keys for plugins that aren't yet registered.
|
|
45
|
+
*/
|
|
46
|
+
declare function eagerLoadForSnapshot(univer: Univer, snapshot: IWorkbookData): Promise<void>;
|
|
47
|
+
/**
|
|
48
|
+
* Idle-load every remaining lazy group AFTER Univer is mounted. The
|
|
49
|
+
* bundle split (each group ships as its own chunk) is the persistent
|
|
50
|
+
* boot-time win — the initial paint doesn't pay for them. This
|
|
51
|
+
* idle-load just ensures they're all eventually registered so a user
|
|
52
|
+
* clicking "Insert > Table" doesn't hit a no-op.
|
|
53
|
+
*
|
|
54
|
+
* Loads in parallel via `requestIdleCallback` so they don't compete
|
|
55
|
+
* with the first paint, falling back to `setTimeout(0)` in browsers
|
|
56
|
+
* without rIC (Safari).
|
|
57
|
+
*/
|
|
58
|
+
declare function idleLoadAll(univer: Univer): void;
|
|
59
|
+
|
|
60
|
+
export { type LazyPluginGroup, eagerLoadForSnapshot, ensurePlugin, ensurePluginByName, idleLoadAll, setUniverForLazyLoad };
|
package/dist/univer.js
ADDED
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
// src/univer/lazy-plugins.ts
|
|
2
|
+
var LOADERS = {
|
|
3
|
+
cf: async () => {
|
|
4
|
+
const [base, ui] = await Promise.all([
|
|
5
|
+
import("@univerjs/sheets-conditional-formatting"),
|
|
6
|
+
import("@univerjs/sheets-conditional-formatting-ui")
|
|
7
|
+
]);
|
|
8
|
+
return [
|
|
9
|
+
[base.UniverSheetsConditionalFormattingPlugin],
|
|
10
|
+
[ui.UniverSheetsConditionalFormattingUIPlugin]
|
|
11
|
+
];
|
|
12
|
+
},
|
|
13
|
+
dv: async () => {
|
|
14
|
+
const [base, ui] = await Promise.all([
|
|
15
|
+
import("@univerjs/sheets-data-validation"),
|
|
16
|
+
import("@univerjs/sheets-data-validation-ui")
|
|
17
|
+
]);
|
|
18
|
+
return [
|
|
19
|
+
[base.UniverSheetsDataValidationPlugin],
|
|
20
|
+
[ui.UniverSheetsDataValidationUIPlugin]
|
|
21
|
+
];
|
|
22
|
+
},
|
|
23
|
+
hyperlink: async () => {
|
|
24
|
+
const [base, ui] = await Promise.all([
|
|
25
|
+
import("@univerjs/sheets-hyper-link"),
|
|
26
|
+
import("@univerjs/sheets-hyper-link-ui")
|
|
27
|
+
]);
|
|
28
|
+
return [
|
|
29
|
+
[base.UniverSheetsHyperLinkPlugin],
|
|
30
|
+
[ui.UniverSheetsHyperLinkUIPlugin]
|
|
31
|
+
];
|
|
32
|
+
},
|
|
33
|
+
note: async () => {
|
|
34
|
+
const [base, ui] = await Promise.all([
|
|
35
|
+
import("@univerjs/sheets-note"),
|
|
36
|
+
import("@univerjs/sheets-note-ui")
|
|
37
|
+
]);
|
|
38
|
+
return [[base.UniverSheetsNotePlugin], [ui.UniverSheetsNoteUIPlugin]];
|
|
39
|
+
},
|
|
40
|
+
table: async () => {
|
|
41
|
+
const [base, ui] = await Promise.all([
|
|
42
|
+
import("@univerjs/sheets-table"),
|
|
43
|
+
import("@univerjs/sheets-table-ui")
|
|
44
|
+
]);
|
|
45
|
+
return [[base.UniverSheetsTablePlugin], [ui.UniverSheetsTableUIPlugin]];
|
|
46
|
+
},
|
|
47
|
+
threadComment: async () => {
|
|
48
|
+
const [tc, tcUi, sheetsTc, sheetsTcUi] = await Promise.all([
|
|
49
|
+
import("@univerjs/thread-comment"),
|
|
50
|
+
import("@univerjs/thread-comment-ui"),
|
|
51
|
+
import("@univerjs/sheets-thread-comment"),
|
|
52
|
+
import("@univerjs/sheets-thread-comment-ui")
|
|
53
|
+
]);
|
|
54
|
+
return [
|
|
55
|
+
[tc.UniverThreadCommentPlugin],
|
|
56
|
+
[tcUi.UniverThreadCommentUIPlugin],
|
|
57
|
+
[sheetsTc.UniverSheetsThreadCommentPlugin],
|
|
58
|
+
[sheetsTcUi.UniverSheetsThreadCommentUIPlugin]
|
|
59
|
+
];
|
|
60
|
+
},
|
|
61
|
+
drawing: async () => {
|
|
62
|
+
const [d, dUi, sd, sdUi] = await Promise.all([
|
|
63
|
+
import("@univerjs/drawing"),
|
|
64
|
+
import("@univerjs/drawing-ui"),
|
|
65
|
+
import("@univerjs/sheets-drawing"),
|
|
66
|
+
import("@univerjs/sheets-drawing-ui"),
|
|
67
|
+
// Side-effect imports: install FWorksheet.insertImage / getImages /
|
|
68
|
+
// updateImages on the facade prototype. Without these, code that
|
|
69
|
+
// reaches in via the FUniver facade (e2e specs, future shell glue)
|
|
70
|
+
// sees an undefined method even though the plugin is registered.
|
|
71
|
+
import("@univerjs/sheets-drawing/facade"),
|
|
72
|
+
import("@univerjs/sheets-drawing-ui/facade")
|
|
73
|
+
]);
|
|
74
|
+
return [
|
|
75
|
+
[d.UniverDrawingPlugin],
|
|
76
|
+
[dUi.UniverDrawingUIPlugin],
|
|
77
|
+
[sd.UniverSheetsDrawingPlugin],
|
|
78
|
+
[sdUi.UniverSheetsDrawingUIPlugin]
|
|
79
|
+
];
|
|
80
|
+
},
|
|
81
|
+
sort: async () => {
|
|
82
|
+
const [base, ui] = await Promise.all([
|
|
83
|
+
import("@univerjs/sheets-sort"),
|
|
84
|
+
import("@univerjs/sheets-sort-ui")
|
|
85
|
+
]);
|
|
86
|
+
return [[base.UniverSheetsSortPlugin], [ui.UniverSheetsSortUIPlugin]];
|
|
87
|
+
},
|
|
88
|
+
filter: async () => {
|
|
89
|
+
const [base, ui] = await Promise.all([
|
|
90
|
+
import("@univerjs/sheets-filter"),
|
|
91
|
+
import("@univerjs/sheets-filter-ui")
|
|
92
|
+
]);
|
|
93
|
+
return [[base.UniverSheetsFilterPlugin], [ui.UniverSheetsFilterUIPlugin]];
|
|
94
|
+
},
|
|
95
|
+
findReplace: async () => {
|
|
96
|
+
const [base, sheets] = await Promise.all([
|
|
97
|
+
import("@univerjs/find-replace"),
|
|
98
|
+
import("@univerjs/sheets-find-replace")
|
|
99
|
+
]);
|
|
100
|
+
return [[base.UniverFindReplacePlugin], [sheets.UniverSheetsFindReplacePlugin]];
|
|
101
|
+
}
|
|
102
|
+
};
|
|
103
|
+
var RESOURCE_NAME_TO_GROUP = {
|
|
104
|
+
SHEET_CONDITIONAL_FORMATTING_PLUGIN: "cf",
|
|
105
|
+
SHEET_DATA_VALIDATION_PLUGIN: "dv",
|
|
106
|
+
SHEET_HYPER_LINK_PLUGIN: "hyperlink",
|
|
107
|
+
SHEET_NOTE_PLUGIN: "note",
|
|
108
|
+
SHEET_TABLE_PLUGIN: "table",
|
|
109
|
+
SHEET_THREAD_COMMENT_BASE_PLUGIN: "threadComment",
|
|
110
|
+
SHEET_DRAWING_PLUGIN: "drawing",
|
|
111
|
+
SHEET_SORT_PLUGIN: "sort",
|
|
112
|
+
SHEET_FILTER_PLUGIN: "filter"
|
|
113
|
+
};
|
|
114
|
+
var loaded = /* @__PURE__ */ new Set();
|
|
115
|
+
var inflight = /* @__PURE__ */ new Map();
|
|
116
|
+
var currentUniver = null;
|
|
117
|
+
function setUniverForLazyLoad(univer) {
|
|
118
|
+
currentUniver = univer;
|
|
119
|
+
}
|
|
120
|
+
function ensurePlugin(univer, group) {
|
|
121
|
+
if (loaded.has(group)) return Promise.resolve();
|
|
122
|
+
const existing = inflight.get(group);
|
|
123
|
+
if (existing) return existing;
|
|
124
|
+
const loader = LOADERS[group];
|
|
125
|
+
if (!loader) return Promise.resolve();
|
|
126
|
+
const p = loader().then((plugins) => {
|
|
127
|
+
for (const [PluginCtor, config] of plugins) {
|
|
128
|
+
univer.registerPlugin(PluginCtor, config);
|
|
129
|
+
}
|
|
130
|
+
loaded.add(group);
|
|
131
|
+
inflight.delete(group);
|
|
132
|
+
});
|
|
133
|
+
inflight.set(group, p);
|
|
134
|
+
return p;
|
|
135
|
+
}
|
|
136
|
+
function ensurePluginByName(group) {
|
|
137
|
+
if (loaded.has(group)) return Promise.resolve();
|
|
138
|
+
if (!currentUniver) return Promise.resolve();
|
|
139
|
+
return ensurePlugin(currentUniver, group);
|
|
140
|
+
}
|
|
141
|
+
async function eagerLoadForSnapshot(univer, snapshot) {
|
|
142
|
+
const groups = /* @__PURE__ */ new Set();
|
|
143
|
+
const resources = snapshot.resources ?? [];
|
|
144
|
+
for (const r of resources) {
|
|
145
|
+
const g = RESOURCE_NAME_TO_GROUP[r.name];
|
|
146
|
+
if (g) groups.add(g);
|
|
147
|
+
}
|
|
148
|
+
if (snapshotHasHyperlinks(snapshot)) groups.add("hyperlink");
|
|
149
|
+
await Promise.all(Array.from(groups).map((g) => ensurePlugin(univer, g)));
|
|
150
|
+
}
|
|
151
|
+
function idleLoadAll(univer) {
|
|
152
|
+
const groups = Object.keys(LOADERS);
|
|
153
|
+
schedule(() => {
|
|
154
|
+
for (const g of groups) {
|
|
155
|
+
void ensurePlugin(univer, g);
|
|
156
|
+
}
|
|
157
|
+
});
|
|
158
|
+
}
|
|
159
|
+
function schedule(fn) {
|
|
160
|
+
const ric = globalThis.requestIdleCallback;
|
|
161
|
+
if (ric) ric(fn, { timeout: 500 });
|
|
162
|
+
else setTimeout(fn, 0);
|
|
163
|
+
}
|
|
164
|
+
function snapshotHasHyperlinks(snapshot) {
|
|
165
|
+
const sheetOrder = snapshot.sheetOrder ?? [];
|
|
166
|
+
for (const sid of sheetOrder) {
|
|
167
|
+
const sheet = snapshot.sheets?.[sid];
|
|
168
|
+
if (!sheet?.cellData) continue;
|
|
169
|
+
const cellData = sheet.cellData;
|
|
170
|
+
for (const r of Object.keys(cellData)) {
|
|
171
|
+
const row = cellData[r];
|
|
172
|
+
for (const c of Object.keys(row)) {
|
|
173
|
+
const ranges = row[c]?.p?.body?.customRanges ?? [];
|
|
174
|
+
if (ranges.some((cr) => cr.rangeType === 0)) return true;
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
return false;
|
|
179
|
+
}
|
|
180
|
+
export {
|
|
181
|
+
eagerLoadForSnapshot,
|
|
182
|
+
ensurePlugin,
|
|
183
|
+
ensurePluginByName,
|
|
184
|
+
idleLoadAll,
|
|
185
|
+
setUniverForLazyLoad
|
|
186
|
+
};
|
|
187
|
+
//# sourceMappingURL=univer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/univer/lazy-plugins.ts"],"sourcesContent":["import type { Univer, IWorkbookData } from '@univerjs/core';\n\n/**\n * Lazy plugin loading — pipeline Stage 4. The cheap plugins (render,\n * formula, sheets, sheets-ui, numfmt, docs) stay eager because every\n * workbook needs them. The heavy / feature-specific plugins (CF, DV,\n * hyperlink, table, note, thread-comment, drawing, sort, filter,\n * find-replace) load on demand:\n *\n * 1. Eagerly when a snapshot is about to mount and we detect the\n * plugin's resource key on it (e.g. `SHEET_CONDITIONAL_FORMATTING_PLUGIN`\n * in `data.resources`). This is the safety net: missing this would\n * silently drop plugin data on file open.\n * 2. Lazily when the user reaches for the feature — opens the Data\n * tab (sort/filter), hits Ctrl+F (find-replace), uses the Insert\n * tab (drawing), etc. The shell hooks `ensurePlugin(...)` into\n * these triggers and awaits before the action runs.\n *\n * Each loader returns the plugins-to-register in the correct order\n * (base before UI, same as `plugins.ts`). Registration order matters\n * in Univer; the loaders bundle a small group together to keep that\n * locality explicit.\n */\n\nexport type LazyPluginGroup =\n | 'cf'\n | 'dv'\n | 'hyperlink'\n | 'note'\n | 'table'\n | 'threadComment'\n | 'drawing'\n | 'sort'\n | 'filter'\n | 'findReplace';\n\ntype Loader = () => Promise<Array<[unknown, unknown?]>>;\n\nconst LOADERS: Record<LazyPluginGroup, Loader> = {\n cf: async () => {\n const [base, ui] = await Promise.all([\n import('@univerjs/sheets-conditional-formatting'),\n import('@univerjs/sheets-conditional-formatting-ui'),\n ]);\n return [\n [base.UniverSheetsConditionalFormattingPlugin],\n [ui.UniverSheetsConditionalFormattingUIPlugin],\n ];\n },\n dv: async () => {\n const [base, ui] = await Promise.all([\n import('@univerjs/sheets-data-validation'),\n import('@univerjs/sheets-data-validation-ui'),\n ]);\n return [\n [base.UniverSheetsDataValidationPlugin],\n [ui.UniverSheetsDataValidationUIPlugin],\n ];\n },\n hyperlink: async () => {\n const [base, ui] = await Promise.all([\n import('@univerjs/sheets-hyper-link'),\n import('@univerjs/sheets-hyper-link-ui'),\n ]);\n return [\n [base.UniverSheetsHyperLinkPlugin],\n [ui.UniverSheetsHyperLinkUIPlugin],\n ];\n },\n note: async () => {\n const [base, ui] = await Promise.all([\n import('@univerjs/sheets-note'),\n import('@univerjs/sheets-note-ui'),\n ]);\n return [[base.UniverSheetsNotePlugin], [ui.UniverSheetsNoteUIPlugin]];\n },\n table: async () => {\n const [base, ui] = await Promise.all([\n import('@univerjs/sheets-table'),\n import('@univerjs/sheets-table-ui'),\n ]);\n return [[base.UniverSheetsTablePlugin], [ui.UniverSheetsTableUIPlugin]];\n },\n threadComment: async () => {\n const [tc, tcUi, sheetsTc, sheetsTcUi] = await Promise.all([\n import('@univerjs/thread-comment'),\n import('@univerjs/thread-comment-ui'),\n import('@univerjs/sheets-thread-comment'),\n import('@univerjs/sheets-thread-comment-ui'),\n ]);\n return [\n [tc.UniverThreadCommentPlugin],\n [tcUi.UniverThreadCommentUIPlugin],\n [sheetsTc.UniverSheetsThreadCommentPlugin],\n [sheetsTcUi.UniverSheetsThreadCommentUIPlugin],\n ];\n },\n drawing: async () => {\n const [d, dUi, sd, sdUi] = await Promise.all([\n import('@univerjs/drawing'),\n import('@univerjs/drawing-ui'),\n import('@univerjs/sheets-drawing'),\n import('@univerjs/sheets-drawing-ui'),\n // Side-effect imports: install FWorksheet.insertImage / getImages /\n // updateImages on the facade prototype. Without these, code that\n // reaches in via the FUniver facade (e2e specs, future shell glue)\n // sees an undefined method even though the plugin is registered.\n import('@univerjs/sheets-drawing/facade'),\n import('@univerjs/sheets-drawing-ui/facade'),\n ]);\n return [\n [d.UniverDrawingPlugin],\n [dUi.UniverDrawingUIPlugin],\n [sd.UniverSheetsDrawingPlugin],\n [sdUi.UniverSheetsDrawingUIPlugin],\n ];\n },\n sort: async () => {\n const [base, ui] = await Promise.all([\n import('@univerjs/sheets-sort'),\n import('@univerjs/sheets-sort-ui'),\n ]);\n return [[base.UniverSheetsSortPlugin], [ui.UniverSheetsSortUIPlugin]];\n },\n filter: async () => {\n const [base, ui] = await Promise.all([\n import('@univerjs/sheets-filter'),\n import('@univerjs/sheets-filter-ui'),\n ]);\n return [[base.UniverSheetsFilterPlugin], [ui.UniverSheetsFilterUIPlugin]];\n },\n findReplace: async () => {\n const [base, sheets] = await Promise.all([\n import('@univerjs/find-replace'),\n import('@univerjs/sheets-find-replace'),\n ]);\n return [[base.UniverFindReplacePlugin], [sheets.UniverSheetsFindReplacePlugin]];\n },\n};\n\n/**\n * Map from a Univer `data.resources[].name` to the lazy group that owns\n * it. Used by `eagerLoadForSnapshot` to pre-register plugins whose\n * state already lives on the workbook so file-open never silently\n * drops a CF rule / table / drawing / etc.\n */\nconst RESOURCE_NAME_TO_GROUP: Record<string, LazyPluginGroup> = {\n SHEET_CONDITIONAL_FORMATTING_PLUGIN: 'cf',\n SHEET_DATA_VALIDATION_PLUGIN: 'dv',\n SHEET_HYPER_LINK_PLUGIN: 'hyperlink',\n SHEET_NOTE_PLUGIN: 'note',\n SHEET_TABLE_PLUGIN: 'table',\n SHEET_THREAD_COMMENT_BASE_PLUGIN: 'threadComment',\n SHEET_DRAWING_PLUGIN: 'drawing',\n SHEET_SORT_PLUGIN: 'sort',\n SHEET_FILTER_PLUGIN: 'filter',\n};\n\nconst loaded = new Set<LazyPluginGroup>();\nconst inflight = new Map<LazyPluginGroup, Promise<void>>();\n\n/**\n * Module-level reference to the live Univer instance, set by\n * `UniverSheet.tsx` immediately after `new Univer()`. Lets shell code\n * call `ensurePluginByName(group)` without plumbing the Univer\n * instance through React context (the FUniver facade doesn't expose\n * its host). Cleared on dispose so callers fail loudly if they hit\n * the lazy path after teardown.\n */\nlet currentUniver: Univer | null = null;\n\nexport function setUniverForLazyLoad(univer: Univer | null): void {\n currentUniver = univer;\n}\n\n/**\n * Idempotent: subsequent calls for the same group resolve immediately\n * if the plugin is already loaded; concurrent calls share the same\n * in-flight promise so we never double-register.\n */\nexport function ensurePlugin(univer: Univer, group: LazyPluginGroup): Promise<void> {\n if (loaded.has(group)) return Promise.resolve();\n const existing = inflight.get(group);\n if (existing) return existing;\n const loader = LOADERS[group];\n if (!loader) return Promise.resolve();\n const p = loader().then((plugins) => {\n for (const [PluginCtor, config] of plugins) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n univer.registerPlugin(PluginCtor as any, config);\n }\n loaded.add(group);\n inflight.delete(group);\n });\n inflight.set(group, p);\n return p;\n}\n\n/**\n * Shell-friendly variant of `ensurePlugin` that pulls the Univer\n * instance from the module-level holder set by `UniverSheet.tsx`. Use\n * this anywhere we only have the FUniver facade (toolbar callbacks,\n * panel handlers). Returns a resolved promise if the holder is empty —\n * the worst case is a no-op, never a throw.\n */\nexport function ensurePluginByName(group: LazyPluginGroup): Promise<void> {\n if (loaded.has(group)) return Promise.resolve();\n if (!currentUniver) return Promise.resolve();\n return ensurePlugin(currentUniver, group);\n}\n\n/**\n * Walk a snapshot for plugin-owned resources + side-channel hyperlinks\n * and eagerly load every group that's referenced. Returns a promise\n * the caller MUST await before `createUnit` — Univer's resource manager\n * silently discards keys for plugins that aren't yet registered.\n */\nexport async function eagerLoadForSnapshot(univer: Univer, snapshot: IWorkbookData): Promise<void> {\n const groups = new Set<LazyPluginGroup>();\n const resources = snapshot.resources ?? [];\n for (const r of resources) {\n const g = RESOURCE_NAME_TO_GROUP[r.name];\n if (g) groups.add(g);\n }\n // Hyperlinks live inline in cell.p (Stage 5) — the hyperlink plugin\n // still owns click handling / context-menu actions, so eager-load\n // when any cell has a HYPERLINK customRange.\n if (snapshotHasHyperlinks(snapshot)) groups.add('hyperlink');\n await Promise.all(Array.from(groups).map((g) => ensurePlugin(univer, g)));\n}\n\n/**\n * Idle-load every remaining lazy group AFTER Univer is mounted. The\n * bundle split (each group ships as its own chunk) is the persistent\n * boot-time win — the initial paint doesn't pay for them. This\n * idle-load just ensures they're all eventually registered so a user\n * clicking \"Insert > Table\" doesn't hit a no-op.\n *\n * Loads in parallel via `requestIdleCallback` so they don't compete\n * with the first paint, falling back to `setTimeout(0)` in browsers\n * without rIC (Safari).\n */\nexport function idleLoadAll(univer: Univer): void {\n const groups = Object.keys(LOADERS) as LazyPluginGroup[];\n schedule(() => {\n for (const g of groups) {\n void ensurePlugin(univer, g);\n }\n });\n}\n\nfunction schedule(fn: () => void): void {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const ric = (globalThis as any).requestIdleCallback as\n | ((cb: () => void, opts?: { timeout: number }) => number)\n | undefined;\n if (ric) ric(fn, { timeout: 500 });\n else setTimeout(fn, 0);\n}\n\nfunction snapshotHasHyperlinks(snapshot: IWorkbookData): boolean {\n const sheetOrder = snapshot.sheetOrder ?? [];\n for (const sid of sheetOrder) {\n const sheet = snapshot.sheets?.[sid];\n if (!sheet?.cellData) continue;\n const cellData = sheet.cellData as Record<\n string,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n Record<string, { p?: any }>\n >;\n for (const r of Object.keys(cellData)) {\n const row = cellData[r];\n for (const c of Object.keys(row)) {\n const ranges = row[c]?.p?.body?.customRanges ?? [];\n if (ranges.some((cr: { rangeType?: number }) => cr.rangeType === 0)) return true;\n }\n }\n }\n return false;\n}\n"],"mappings":"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","names":[]}
|