aicodeman 1.41.0 → 1.41.1
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/README.md +58 -8
- package/dist/attachment-registry.d.ts +2 -0
- package/dist/attachment-registry.d.ts.map +1 -1
- package/dist/attachment-registry.js +14 -3
- package/dist/attachment-registry.js.map +1 -1
- package/dist/cli-agent.d.ts +2 -0
- package/dist/cli-agent.d.ts.map +1 -1
- package/dist/cli-agent.js +12 -8
- package/dist/cli-agent.js.map +1 -1
- package/dist/cli.d.ts +25 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +97 -11
- package/dist/cli.js.map +1 -1
- package/dist/config/buffer-limits.d.ts +9 -0
- package/dist/config/buffer-limits.d.ts.map +1 -1
- package/dist/config/buffer-limits.js +9 -0
- package/dist/config/buffer-limits.js.map +1 -1
- package/dist/config/cli-registry/schema.d.ts +8 -0
- package/dist/config/cli-registry/schema.d.ts.map +1 -1
- package/dist/config/cli-registry/schema.js +12 -0
- package/dist/config/cli-registry/schema.js.map +1 -1
- package/dist/config/cli-registry/stock.d.ts.map +1 -1
- package/dist/config/cli-registry/stock.js +42 -0
- package/dist/config/cli-registry/stock.js.map +1 -1
- package/dist/config/cli-registry/types.d.ts +35 -0
- package/dist/config/cli-registry/types.d.ts.map +1 -1
- package/dist/folder-listing.d.ts +94 -0
- package/dist/folder-listing.d.ts.map +1 -0
- package/dist/folder-listing.js +241 -0
- package/dist/folder-listing.js.map +1 -0
- package/dist/hooks-config.d.ts +36 -16
- package/dist/hooks-config.d.ts.map +1 -1
- package/dist/hooks-config.js +45 -20
- package/dist/hooks-config.js.map +1 -1
- package/dist/html-view-capabilities.d.ts +54 -0
- package/dist/html-view-capabilities.d.ts.map +1 -0
- package/dist/html-view-capabilities.js +103 -0
- package/dist/html-view-capabilities.js.map +1 -0
- package/dist/mcp-server.d.ts +114 -0
- package/dist/mcp-server.d.ts.map +1 -0
- package/dist/mcp-server.js +917 -0
- package/dist/mcp-server.js.map +1 -0
- package/dist/mcp-sync.d.ts +5 -0
- package/dist/mcp-sync.d.ts.map +1 -1
- package/dist/mcp-sync.js +51 -5
- package/dist/mcp-sync.js.map +1 -1
- package/dist/mux-interface.d.ts +36 -1
- package/dist/mux-interface.d.ts.map +1 -1
- package/dist/remote-files.d.ts +37 -0
- package/dist/remote-files.d.ts.map +1 -1
- package/dist/remote-files.js +103 -0
- package/dist/remote-files.js.map +1 -1
- package/dist/remote-pane-history.d.ts +103 -0
- package/dist/remote-pane-history.d.ts.map +1 -0
- package/dist/remote-pane-history.js +258 -0
- package/dist/remote-pane-history.js.map +1 -0
- package/dist/remote-ssh-limiter.d.ts +16 -3
- package/dist/remote-ssh-limiter.d.ts.map +1 -1
- package/dist/remote-ssh-limiter.js +37 -6
- package/dist/remote-ssh-limiter.js.map +1 -1
- package/dist/session.d.ts +29 -1
- package/dist/session.d.ts.map +1 -1
- package/dist/session.js +53 -0
- package/dist/session.js.map +1 -1
- package/dist/tab-layout-legacy-order.d.ts.map +1 -1
- package/dist/tab-layout-legacy-order.js +72 -13
- package/dist/tab-layout-legacy-order.js.map +1 -1
- package/dist/tab-layout-service.d.ts +33 -2
- package/dist/tab-layout-service.d.ts.map +1 -1
- package/dist/tab-layout-service.js +102 -7
- package/dist/tab-layout-service.js.map +1 -1
- package/dist/tab-layout.d.ts +9 -0
- package/dist/tab-layout.d.ts.map +1 -1
- package/dist/tab-layout.js +15 -2
- package/dist/tab-layout.js.map +1 -1
- package/dist/tmux-manager.d.ts +71 -2
- package/dist/tmux-manager.d.ts.map +1 -1
- package/dist/tmux-manager.js +169 -18
- package/dist/tmux-manager.js.map +1 -1
- package/dist/types/session.d.ts +53 -0
- package/dist/types/session.d.ts.map +1 -1
- package/dist/types/session.js.map +1 -1
- package/dist/usage-telemetry.d.ts +44 -7
- package/dist/usage-telemetry.d.ts.map +1 -1
- package/dist/usage-telemetry.js +72 -7
- package/dist/usage-telemetry.js.map +1 -1
- package/dist/web/approval-inbox.d.ts +12 -0
- package/dist/web/approval-inbox.d.ts.map +1 -1
- package/dist/web/approval-inbox.js +1 -0
- package/dist/web/approval-inbox.js.map +1 -1
- package/dist/web/middleware/auth.d.ts.map +1 -1
- package/dist/web/middleware/auth.js +33 -0
- package/dist/web/middleware/auth.js.map +1 -1
- package/dist/web/ports/session-port.d.ts +8 -1
- package/dist/web/ports/session-port.d.ts.map +1 -1
- package/dist/web/public/admin-ui.js.gz +0 -0
- package/dist/web/public/api-client.c9b1cddc.js.gz +0 -0
- package/dist/web/public/app.24689381.js +43 -0
- package/dist/web/public/app.24689381.js.br +0 -0
- package/dist/web/public/app.24689381.js.gz +0 -0
- package/dist/web/public/approvals-ui.js +4 -0
- package/dist/web/public/approvals-ui.js.br +0 -0
- package/dist/web/public/approvals-ui.js.gz +0 -0
- package/dist/web/public/{constants.bc9c1f63.js → constants.17d77b65.js} +395 -7
- package/dist/web/public/constants.17d77b65.js.br +0 -0
- package/dist/web/public/constants.17d77b65.js.gz +0 -0
- package/dist/web/public/cron-ui.js.gz +0 -0
- package/dist/web/public/entrance-animations.js.gz +0 -0
- package/dist/web/public/gesture/gesture-codeman.js +112 -6
- package/dist/web/public/git-status-ui.js.gz +0 -0
- package/dist/web/public/home-sessions.js.gz +0 -0
- package/dist/web/public/host-wake-ui.js.gz +0 -0
- package/dist/web/public/i18n.9afd8e4d.js +2 -0
- package/dist/web/public/i18n.9afd8e4d.js.br +0 -0
- package/dist/web/public/i18n.9afd8e4d.js.gz +0 -0
- package/dist/web/public/{image-input.e00471c6.js → image-input.9ed1d0d2.js} +186 -16
- package/dist/web/public/image-input.9ed1d0d2.js.br +0 -0
- package/dist/web/public/image-input.9ed1d0d2.js.gz +0 -0
- package/dist/web/public/index.html +105 -23
- package/dist/web/public/index.html.br +0 -0
- package/dist/web/public/index.html.gz +0 -0
- package/dist/web/public/input-cjk.8bc46081.js.gz +0 -0
- package/dist/web/public/{keyboard-accessory.c1e7c7b7.js → keyboard-accessory.c458eea8.js} +115 -35
- package/dist/web/public/keyboard-accessory.c458eea8.js.br +0 -0
- package/dist/web/public/keyboard-accessory.c458eea8.js.gz +0 -0
- package/dist/web/public/mobile-handlers.0ef9c311.js.gz +0 -0
- package/dist/web/public/mobile-ime-preview.2dbaf262.js.gz +0 -0
- package/dist/web/public/mobile-overview.js +11 -2
- package/dist/web/public/mobile-overview.js.br +0 -0
- package/dist/web/public/mobile-overview.js.gz +0 -0
- package/dist/web/public/mobile.2dff1580.css +1 -0
- package/dist/web/public/mobile.2dff1580.css.br +0 -0
- package/dist/web/public/mobile.2dff1580.css.gz +0 -0
- package/dist/web/public/notification-manager.feb82c04.js.gz +0 -0
- package/dist/web/public/orchestrator-panel.js.gz +0 -0
- package/dist/web/public/{panels-ui.71846fcb.js → panels-ui.73ec0137.js} +87 -87
- package/dist/web/public/panels-ui.73ec0137.js.br +0 -0
- package/dist/web/public/panels-ui.73ec0137.js.gz +0 -0
- package/dist/web/public/ralph-panel.b350e2ef.js.gz +0 -0
- package/dist/web/public/ralph-wizard.b6c0dd19.js.gz +0 -0
- package/dist/web/public/readmymind-ui.js.gz +0 -0
- package/dist/web/public/reboot-restore-ui.js.gz +0 -0
- package/dist/web/public/respawn-ui.ff0dae4c.js.gz +0 -0
- package/dist/web/public/sanitize-html.e7147e76.js.gz +0 -0
- package/dist/web/public/session-lineage.js.gz +0 -0
- package/dist/web/public/{session-ui.f731602c.js → session-ui.dbc6819b.js} +33 -33
- package/dist/web/public/session-ui.dbc6819b.js.br +0 -0
- package/dist/web/public/session-ui.dbc6819b.js.gz +0 -0
- package/dist/web/public/{settings-ui.4e33390f.js → settings-ui.81ac264e.js} +9 -9
- package/dist/web/public/settings-ui.81ac264e.js.br +0 -0
- package/dist/web/public/settings-ui.81ac264e.js.gz +0 -0
- package/dist/web/public/spreadsheet-preview-worker.js +11 -0
- package/dist/web/public/spreadsheet-preview-worker.js.br +0 -0
- package/dist/web/public/spreadsheet-preview-worker.js.gz +0 -0
- package/dist/web/public/{spreadsheet-preview.af82fa2f.js → spreadsheet-preview.75c751de.js} +1 -1
- package/dist/web/public/spreadsheet-preview.75c751de.js.br +0 -0
- package/dist/web/public/spreadsheet-preview.75c751de.js.gz +0 -0
- package/dist/web/public/spreadsheet-xlsx-core.js +110 -0
- package/dist/web/public/spreadsheet-xlsx-core.js.br +0 -0
- package/dist/web/public/spreadsheet-xlsx-core.js.gz +0 -0
- package/dist/web/public/styles.900a28e4.css +1 -0
- package/dist/web/public/styles.900a28e4.css.br +0 -0
- package/dist/web/public/styles.900a28e4.css.gz +0 -0
- package/dist/web/public/subagent-windows.07277a58.js.gz +0 -0
- package/dist/web/public/sw.js +6 -2
- package/dist/web/public/sw.js.br +0 -0
- package/dist/web/public/sw.js.gz +0 -0
- package/dist/web/public/tab-layout-browser.2d6189f7.js +1 -0
- package/dist/web/public/tab-layout-browser.2d6189f7.js.br +0 -0
- package/dist/web/public/tab-layout-browser.2d6189f7.js.gz +0 -0
- package/dist/web/public/{tab-rail-resize.a5867793.js → tab-rail-resize.7157e0bd.js} +1 -1
- package/dist/web/public/tab-rail-resize.7157e0bd.js.br +0 -0
- package/dist/web/public/tab-rail-resize.7157e0bd.js.gz +0 -0
- package/dist/web/public/terminal-keycode229-recovery.af09f99a.js.gz +0 -0
- package/dist/web/public/terminal-split.js.gz +0 -0
- package/dist/web/public/terminal-tile.js +44 -24
- package/dist/web/public/terminal-tile.js.br +0 -0
- package/dist/web/public/terminal-tile.js.gz +0 -0
- package/dist/web/public/terminal-ui.858f5da5.js +2 -0
- package/dist/web/public/terminal-ui.858f5da5.js.br +0 -0
- package/dist/web/public/terminal-ui.858f5da5.js.gz +0 -0
- package/dist/web/public/tile-grid.js +439 -18
- package/dist/web/public/tile-grid.js.br +0 -0
- package/dist/web/public/tile-grid.js.gz +0 -0
- package/dist/web/public/ultracode-panel.js.gz +0 -0
- package/dist/web/public/ultracode-windows.js.gz +0 -0
- package/dist/web/public/vendor/dompurify.min.js.gz +0 -0
- package/dist/web/public/vendor/exceljs.min.js.gz +0 -0
- package/dist/web/public/vendor/fflate.min.js.gz +0 -0
- package/dist/web/public/vendor/marked.min.js.gz +0 -0
- package/dist/web/public/vendor/xterm-addon-fit.min.js.gz +0 -0
- package/dist/web/public/vendor/xterm-addon-serialize.min.js.gz +0 -0
- package/dist/web/public/vendor/xterm-addon-unicode11.min.js.gz +0 -0
- package/dist/web/public/vendor/xterm-addon-webgl.min.js.gz +0 -0
- package/dist/web/public/vendor/xterm-predictive-echo.ae5e3d5d.js.gz +0 -0
- package/dist/web/public/vendor/xterm-zerolag-input.0b69623c.js.gz +0 -0
- package/dist/web/public/vendor/xterm.css.gz +0 -0
- package/dist/web/public/vendor/xterm.min.js.gz +0 -0
- package/dist/web/public/voice-input.2342c37b.js.gz +0 -0
- package/dist/web/public/voice-pcm-worklet.js.gz +0 -0
- package/dist/web/public/webview-tabs.js +12 -0
- package/dist/web/public/webview-tabs.js.br +0 -0
- package/dist/web/public/webview-tabs.js.gz +0 -0
- package/dist/web/route-helpers.d.ts +8 -0
- package/dist/web/route-helpers.d.ts.map +1 -1
- package/dist/web/route-helpers.js +8 -0
- package/dist/web/route-helpers.js.map +1 -1
- package/dist/web/routes/admin-routes.d.ts.map +1 -1
- package/dist/web/routes/admin-routes.js +4 -1
- package/dist/web/routes/admin-routes.js.map +1 -1
- package/dist/web/routes/approval-routes.d.ts.map +1 -1
- package/dist/web/routes/approval-routes.js +6 -8
- package/dist/web/routes/approval-routes.js.map +1 -1
- package/dist/web/routes/case-routes.js +1 -1
- package/dist/web/routes/case-routes.js.map +1 -1
- package/dist/web/routes/file-routes.d.ts +46 -1
- package/dist/web/routes/file-routes.d.ts.map +1 -1
- package/dist/web/routes/file-routes.js +214 -27
- package/dist/web/routes/file-routes.js.map +1 -1
- package/dist/web/routes/hook-event-routes.d.ts.map +1 -1
- package/dist/web/routes/hook-event-routes.js +8 -1
- package/dist/web/routes/hook-event-routes.js.map +1 -1
- package/dist/web/routes/html-view-routes.d.ts +60 -0
- package/dist/web/routes/html-view-routes.d.ts.map +1 -0
- package/dist/web/routes/html-view-routes.js +288 -0
- package/dist/web/routes/html-view-routes.js.map +1 -0
- package/dist/web/routes/index.d.ts +1 -0
- package/dist/web/routes/index.d.ts.map +1 -1
- package/dist/web/routes/index.js +1 -0
- package/dist/web/routes/index.js.map +1 -1
- package/dist/web/routes/reboot-restore-routes.js +2 -2
- package/dist/web/routes/reboot-restore-routes.js.map +1 -1
- package/dist/web/routes/session-routes.d.ts +1 -0
- package/dist/web/routes/session-routes.d.ts.map +1 -1
- package/dist/web/routes/session-routes.js +278 -56
- package/dist/web/routes/session-routes.js.map +1 -1
- package/dist/web/routes/status-telemetry-routes.d.ts.map +1 -1
- package/dist/web/routes/status-telemetry-routes.js +16 -2
- package/dist/web/routes/status-telemetry-routes.js.map +1 -1
- package/dist/web/schemas.d.ts +29 -0
- package/dist/web/schemas.d.ts.map +1 -1
- package/dist/web/schemas.js +65 -0
- package/dist/web/schemas.js.map +1 -1
- package/dist/web/server.d.ts +6 -1
- package/dist/web/server.d.ts.map +1 -1
- package/dist/web/server.js +62 -14
- package/dist/web/server.js.map +1 -1
- package/dist/web/sse-events.d.ts +5 -2
- package/dist/web/sse-events.d.ts.map +1 -1
- package/dist/web/sse-events.js +5 -2
- package/dist/web/sse-events.js.map +1 -1
- package/package.json +2 -1
- package/skills/codeman/SKILL.md +29 -12
- package/dist/web/public/app.6f8552e1.js +0 -43
- package/dist/web/public/app.6f8552e1.js.br +0 -0
- package/dist/web/public/app.6f8552e1.js.gz +0 -0
- package/dist/web/public/constants.bc9c1f63.js.br +0 -0
- package/dist/web/public/constants.bc9c1f63.js.gz +0 -0
- package/dist/web/public/i18n.a9840ea2.js +0 -2
- package/dist/web/public/i18n.a9840ea2.js.br +0 -0
- package/dist/web/public/i18n.a9840ea2.js.gz +0 -0
- package/dist/web/public/image-input.e00471c6.js.br +0 -0
- package/dist/web/public/image-input.e00471c6.js.gz +0 -0
- package/dist/web/public/keyboard-accessory.c1e7c7b7.js.br +0 -0
- package/dist/web/public/keyboard-accessory.c1e7c7b7.js.gz +0 -0
- package/dist/web/public/mobile.111b187d.css +0 -1
- package/dist/web/public/mobile.111b187d.css.br +0 -0
- package/dist/web/public/mobile.111b187d.css.gz +0 -0
- package/dist/web/public/panels-ui.71846fcb.js.br +0 -0
- package/dist/web/public/panels-ui.71846fcb.js.gz +0 -0
- package/dist/web/public/session-ui.f731602c.js.br +0 -0
- package/dist/web/public/session-ui.f731602c.js.gz +0 -0
- package/dist/web/public/settings-ui.4e33390f.js.br +0 -0
- package/dist/web/public/settings-ui.4e33390f.js.gz +0 -0
- package/dist/web/public/spreadsheet-preview.af82fa2f.js.br +0 -0
- package/dist/web/public/spreadsheet-preview.af82fa2f.js.gz +0 -0
- package/dist/web/public/styles.81a72906.css +0 -1
- package/dist/web/public/styles.81a72906.css.br +0 -0
- package/dist/web/public/styles.81a72906.css.gz +0 -0
- package/dist/web/public/tab-layout-browser.065fcba4.js +0 -1
- package/dist/web/public/tab-layout-browser.065fcba4.js.br +0 -0
- package/dist/web/public/tab-layout-browser.065fcba4.js.gz +0 -0
- package/dist/web/public/tab-rail-resize.a5867793.js.br +0 -0
- package/dist/web/public/tab-rail-resize.a5867793.js.gz +0 -0
- package/dist/web/public/terminal-ui.b7267005.js +0 -2
- package/dist/web/public/terminal-ui.b7267005.js.br +0 -0
- package/dist/web/public/terminal-ui.b7267005.js.gz +0 -0
|
@@ -171,6 +171,17 @@ async function loadWorkbook(bytes) {
|
|
|
171
171
|
// defineProperty throws if a future ExcelJS renames `_definedNames`, rather
|
|
172
172
|
// than silently expanding again.
|
|
173
173
|
Object.defineProperty(nextWorkbook._definedNames, 'model', { configurable: true, get: () => [], set: () => {} });
|
|
174
|
+
// ExcelJS follows a worksheet's comment, VML, table and drawing links
|
|
175
|
+
// unchecked, and openpyxl spells them so the lookup finds nothing: one comment,
|
|
176
|
+
// table or chart failed the whole preview. `load()` calls `this.reconcile()`
|
|
177
|
+
// once on the parsed model; repair the model first (core.repairExcelJsModel).
|
|
178
|
+
// Throws if a future ExcelJS renames reconcile, rather than failing again.
|
|
179
|
+
const reconcile = nextWorkbook.xlsx.reconcile;
|
|
180
|
+
if (typeof reconcile !== 'function') throw new Error('ExcelJS reconcile is unavailable');
|
|
181
|
+
nextWorkbook.xlsx.reconcile = function reconcileRepaired(model, options) {
|
|
182
|
+
core.repairExcelJsModel(model);
|
|
183
|
+
return reconcile.call(this, model, options);
|
|
184
|
+
};
|
|
174
185
|
// ExcelJS expands every address of a `<dataValidation sqref>` into its own
|
|
175
186
|
// object (a whole-column dropdown is a million), and the preview never shows
|
|
176
187
|
// validations, so they are not parsed at all. `maxRows` is a per-sheet
|
|
Binary file
|
|
Binary file
|
|
@@ -20,7 +20,7 @@
|
|
|
20
20
|
(function initSpreadsheetPreview(global) {
|
|
21
21
|
'use strict';
|
|
22
22
|
|
|
23
|
-
const SPREADSHEET_ASSET_VERSION = '
|
|
23
|
+
const SPREADSHEET_ASSET_VERSION = 'fd81c01bef7b';
|
|
24
24
|
const MAX_PREVIEW_BYTES = 10 * 1024 * 1024;
|
|
25
25
|
const DEFAULT_TIMEOUT_MS = 20000;
|
|
26
26
|
const MAX_SCROLL_PX = 8000000;
|
|
Binary file
|
|
Binary file
|
|
@@ -472,6 +472,115 @@
|
|
|
472
472
|
return zipApi.zipSync(admission.entries, { level: 0 });
|
|
473
473
|
}
|
|
474
474
|
|
|
475
|
+
// ExcelJS (4.4.0, lib/xlsx/xlsx.js + xform/sheet/worksheet-xform.js `reconcile`)
|
|
476
|
+
// links a worksheet to its comments, comment notes (VML), tables and drawing by
|
|
477
|
+
// looking the relationship Target up VERBATIM in maps keyed by its OWN spelling
|
|
478
|
+
// (`../comments1.xml`, `../drawings/vmlDrawing1.vml`, `../tables/table1.xml`,
|
|
479
|
+
// `drawing1`), then dereferences the result unchecked. openpyxl, which most
|
|
480
|
+
// agents write spreadsheets with, uses absolute Targets, its own part names
|
|
481
|
+
// (`/xl/comments/comment1.xml`) and a drawing XML ExcelJS parses to nothing, so
|
|
482
|
+
// a workbook with ONE comment, table or chart threw ("reading 'comments'",
|
|
483
|
+
// "'name'", "'anchors'") before a single cell was shown.
|
|
484
|
+
//
|
|
485
|
+
// This runs on ExcelJS's parsed model right before that reconcile. It only
|
|
486
|
+
// re-points a link to the key ExcelJS itself stored for the same part, or drops
|
|
487
|
+
// a link (or a drawing) that would dereference nothing; nothing is added. The
|
|
488
|
+
// preview shows none of these parts. Lookups are own-property only, so a Target
|
|
489
|
+
// or rId such as `__proto__` cannot resolve through Object.prototype.
|
|
490
|
+
const REL_TYPE = 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/';
|
|
491
|
+
const REL_COMMENTS = `${REL_TYPE}comments`;
|
|
492
|
+
const REL_VML_DRAWING = `${REL_TYPE}vmlDrawing`;
|
|
493
|
+
const REL_TABLE = `${REL_TYPE}table`;
|
|
494
|
+
const EXCELJS_DRAWING_TARGET = /\/drawings\/([a-zA-Z0-9]+)[.][a-zA-Z]{3,4}$/;
|
|
495
|
+
|
|
496
|
+
function ownValue(map, key) {
|
|
497
|
+
return map && typeof key === 'string' && Object.prototype.hasOwnProperty.call(map, key) ? map[key] : undefined;
|
|
498
|
+
}
|
|
499
|
+
|
|
500
|
+
// The key ExcelJS gives a part it loaded from `xl/<path>` is `../<path>`
|
|
501
|
+
// (relative to xl/worksheets/). A Target that names the same part another way
|
|
502
|
+
// (`/xl/tables/table1.xml`) is rewritten to that key.
|
|
503
|
+
function worksheetRelativeTarget(target) {
|
|
504
|
+
const path = excelJsEntryName(target[0] === '/' ? target : `xl/worksheets/${target}`);
|
|
505
|
+
return path.startsWith('xl/') ? `../${path.slice(3)}` : null;
|
|
506
|
+
}
|
|
507
|
+
|
|
508
|
+
function resolveTarget(rel, map, usable) {
|
|
509
|
+
if (typeof rel.Target !== 'string') return false;
|
|
510
|
+
if (usable(ownValue(map, rel.Target))) return true;
|
|
511
|
+
const key = worksheetRelativeTarget(rel.Target);
|
|
512
|
+
if (key && usable(ownValue(map, key))) {
|
|
513
|
+
rel.Target = key;
|
|
514
|
+
return true;
|
|
515
|
+
}
|
|
516
|
+
return false;
|
|
517
|
+
}
|
|
518
|
+
|
|
519
|
+
function repairExcelJsModel(model) {
|
|
520
|
+
if (!model || typeof model !== 'object') return model;
|
|
521
|
+
const isObject = (value) => Boolean(value) && typeof value === 'object';
|
|
522
|
+
const drawings = isObject(model.drawings) ? model.drawings : {};
|
|
523
|
+
// ExcelJS reconciles every drawing that has rels and reads `.anchors` off it.
|
|
524
|
+
for (const name of Object.keys(drawings)) {
|
|
525
|
+
if (!isObject(drawings[name]) || !Array.isArray(drawings[name].anchors)) {
|
|
526
|
+
delete drawings[name];
|
|
527
|
+
if (isObject(model.drawingRels)) delete model.drawingRels[name];
|
|
528
|
+
}
|
|
529
|
+
}
|
|
530
|
+
// ExcelJS also reconciles every table it parsed, so one it parsed to nothing goes.
|
|
531
|
+
if (isObject(model.tables)) {
|
|
532
|
+
for (const key of Object.keys(model.tables)) if (!isObject(model.tables[key])) delete model.tables[key];
|
|
533
|
+
}
|
|
534
|
+
const worksheetRels = isObject(model.worksheetRels) ? model.worksheetRels : {};
|
|
535
|
+
// Worksheets can share a sheetNo (ExcelJS's worksheet pattern is unanchored),
|
|
536
|
+
// and then they share one rels list: filter and index each list ONCE, or a
|
|
537
|
+
// long list costs once per worksheet.
|
|
538
|
+
const relsBySheetNo = new Map();
|
|
539
|
+
for (const worksheet of Array.isArray(model.worksheets) ? model.worksheets : []) {
|
|
540
|
+
if (!isObject(worksheet)) continue;
|
|
541
|
+
const sheetNo = String(worksheet.sheetNo);
|
|
542
|
+
let byId = relsBySheetNo.get(sheetNo);
|
|
543
|
+
if (!byId) {
|
|
544
|
+
const list = ownValue(worksheetRels, sheetNo);
|
|
545
|
+
const rels = Array.isArray(list) ? list : [];
|
|
546
|
+
const kept = rels.filter((rel) => {
|
|
547
|
+
if (!isObject(rel)) return false;
|
|
548
|
+
if (rel.Type === REL_COMMENTS) return resolveTarget(rel, model.comments, isObject);
|
|
549
|
+
if (rel.Type === REL_VML_DRAWING) {
|
|
550
|
+
return resolveTarget(rel, model.vmlDrawings, (vml) => isObject(vml) && Array.isArray(vml.comments));
|
|
551
|
+
}
|
|
552
|
+
if (rel.Type === REL_TABLE) return resolveTarget(rel, model.tables, isObject);
|
|
553
|
+
return true;
|
|
554
|
+
});
|
|
555
|
+
if (Array.isArray(list)) worksheetRels[sheetNo] = kept;
|
|
556
|
+
byId = new Map();
|
|
557
|
+
for (const rel of kept) byId.set(rel.Id, rel);
|
|
558
|
+
relsBySheetNo.set(sheetNo, byId);
|
|
559
|
+
}
|
|
560
|
+
// `<tablePart r:id>`, `<drawing r:id>` and `<hyperlink r:id>` are followed
|
|
561
|
+
// through the rels unchecked, so each must name a rel that is still there.
|
|
562
|
+
if (Array.isArray(worksheet.tables)) {
|
|
563
|
+
worksheet.tables = worksheet.tables.filter((part) => {
|
|
564
|
+
const rel = isObject(part) ? byId.get(part.rId) : undefined;
|
|
565
|
+
return Boolean(rel) && rel.Type === REL_TABLE;
|
|
566
|
+
});
|
|
567
|
+
}
|
|
568
|
+
if (isObject(worksheet.drawing)) {
|
|
569
|
+
const rel = byId.get(worksheet.drawing.rId);
|
|
570
|
+
const match = rel && typeof rel.Target === 'string' ? rel.Target.match(EXCELJS_DRAWING_TARGET) : null;
|
|
571
|
+
if (!rel || typeof rel.Target !== 'string' || (match && !ownValue(drawings, match[1]))) {
|
|
572
|
+
worksheet.drawing = undefined;
|
|
573
|
+
}
|
|
574
|
+
}
|
|
575
|
+
if (Array.isArray(worksheet.hyperlinks)) {
|
|
576
|
+
worksheet.hyperlinks = worksheet.hyperlinks.filter(
|
|
577
|
+
(link) => isObject(link) && (!link.rId || byId.has(link.rId))
|
|
578
|
+
);
|
|
579
|
+
}
|
|
580
|
+
}
|
|
581
|
+
return model;
|
|
582
|
+
}
|
|
583
|
+
|
|
475
584
|
function parseCellRef(ref) {
|
|
476
585
|
const match = /^\$?([A-Z]{1,3})\$?([1-9]\d*)$/i.exec(String(ref || ''));
|
|
477
586
|
if (!match) return null;
|
|
@@ -983,6 +1092,7 @@
|
|
|
983
1092
|
createXmlCounter,
|
|
984
1093
|
admitXlsx,
|
|
985
1094
|
buildAdmittedArchive,
|
|
1095
|
+
repairExcelJsModel,
|
|
986
1096
|
excelJsEntryName,
|
|
987
1097
|
parseCellRef,
|
|
988
1098
|
parseRange,
|
|
Binary file
|
|
Binary file
|