@mdzip/editor 1.3.1 → 1.3.8
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 +141 -4
- package/dist/archive-utils.d.ts.map +1 -1
- package/dist/archive-utils.js +1 -34
- package/dist/archive-utils.js.map +1 -1
- package/dist/asset-cache.d.ts +81 -0
- package/dist/asset-cache.d.ts.map +1 -0
- package/dist/asset-cache.js +365 -0
- package/dist/asset-cache.js.map +1 -0
- package/dist/diff-view-css.d.ts +2 -0
- package/dist/diff-view-css.d.ts.map +1 -0
- package/dist/diff-view-css.js +49 -0
- package/dist/diff-view-css.js.map +1 -0
- package/dist/diff-view.d.ts +112 -0
- package/dist/diff-view.d.ts.map +1 -0
- package/dist/diff-view.js +573 -0
- package/dist/diff-view.js.map +1 -0
- package/dist/diff.d.ts +2 -1
- package/dist/diff.d.ts.map +1 -1
- package/dist/diff.js +3 -1
- package/dist/diff.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/library-info.d.ts +37 -0
- package/dist/library-info.d.ts.map +1 -0
- package/dist/library-info.js +46 -0
- package/dist/library-info.js.map +1 -0
- package/dist/preview.d.ts +10 -0
- package/dist/preview.d.ts.map +1 -0
- package/dist/preview.js +9 -0
- package/dist/preview.js.map +1 -0
- package/dist/rendering.d.ts +138 -2
- package/dist/rendering.d.ts.map +1 -1
- package/dist/rendering.js +108 -13
- package/dist/rendering.js.map +1 -1
- package/dist/view-css.d.ts.map +1 -1
- package/dist/view-css.js +109 -1
- package/dist/view-css.js.map +1 -1
- package/dist/view.d.ts +136 -1
- package/dist/view.d.ts.map +1 -1
- package/dist/view.js +733 -22
- package/dist/view.js.map +1 -1
- package/dist/workspace.d.ts +15 -0
- package/dist/workspace.d.ts.map +1 -1
- package/dist/workspace.js +28 -0
- package/dist/workspace.js.map +1 -1
- package/package.json +14 -4
package/README.md
CHANGED
|
@@ -1,3 +1,8 @@
|
|
|
1
|
+
[![MDZip logo][mdzip-logo]][mdzip-url]
|
|
2
|
+
|
|
3
|
+
[mdzip-logo]: https://raw.githubusercontent.com/mdzip-project/mdzip-editor/main/resources/mdzip-mark.svg
|
|
4
|
+
[mdzip-url]: https://mdzip.org
|
|
5
|
+
|
|
1
6
|
# @mdzip/editor
|
|
2
7
|
|
|
3
8
|
Framework-independent MDZip workspace engine and browser view.
|
|
@@ -38,6 +43,11 @@ await view.open(markdownBytes, {
|
|
|
38
43
|
});
|
|
39
44
|
```
|
|
40
45
|
|
|
46
|
+
CodeMirror is not initialized until a source or split layout is used. Consumers
|
|
47
|
+
that only need archive, rendering, and preview helpers can import from
|
|
48
|
+
`@mdzip/editor/preview`; that entry point excludes `MdzipWorkspaceView` and its
|
|
49
|
+
CodeMirror dependencies from the module graph.
|
|
50
|
+
|
|
41
51
|
The filename normally selects the source format. Pass `sourceFormat:
|
|
42
52
|
'markdown'` or `sourceFormat: 'mdz'` to override detection.
|
|
43
53
|
|
|
@@ -47,10 +57,27 @@ rebuild:
|
|
|
47
57
|
```ts
|
|
48
58
|
await view.openWorkspace(workspace, {
|
|
49
59
|
mode: 'editable',
|
|
50
|
-
fileName: 'document.mdz'
|
|
60
|
+
fileName: 'document.mdz',
|
|
61
|
+
assetSourceId: 'document-etag-or-content-id'
|
|
62
|
+
});
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
Images are resolved only when referenced by the active document or selected in
|
|
66
|
+
the navigator. To reuse resolved bytes across sessions, inject the optional
|
|
67
|
+
bounded IndexedDB cache:
|
|
68
|
+
|
|
69
|
+
```ts
|
|
70
|
+
import { MdzipIndexedDbAssetCache, MdzipWorkspaceView } from '@mdzip/editor';
|
|
71
|
+
|
|
72
|
+
const view = new MdzipWorkspaceView(container, {
|
|
73
|
+
assetCache: new MdzipIndexedDbAssetCache({ maxBytes: 64 * 1024 * 1024 })
|
|
51
74
|
});
|
|
52
75
|
```
|
|
53
76
|
|
|
77
|
+
For `openWorkspace()`, provide a stable `assetSourceId` (or `archiveBytes`) so
|
|
78
|
+
cache hits can bypass lazy ZIP readers. Cache and storage failures automatically
|
|
79
|
+
fall back to archive reads.
|
|
80
|
+
|
|
54
81
|
## Editor Mode
|
|
55
82
|
|
|
56
83
|
```ts
|
|
@@ -127,20 +154,61 @@ flow (triggered by the nav button, Insert Image, or an image paste/drop):
|
|
|
127
154
|
|
|
128
155
|
```ts
|
|
129
156
|
const view = new MdzipWorkspaceView(container, {
|
|
130
|
-
onConversionRequested(action) {
|
|
157
|
+
async onConversionRequested(action, context) {
|
|
131
158
|
// action.kind: 'navigation' | 'image-picker' | 'image-file' (with action.file)
|
|
132
|
-
|
|
159
|
+
const relativePath = await hostHandlesImage(action);
|
|
160
|
+
return relativePath
|
|
161
|
+
? context.insertMarkdown(``)
|
|
162
|
+
: false;
|
|
133
163
|
}
|
|
134
164
|
});
|
|
135
165
|
```
|
|
136
166
|
|
|
137
167
|
Returning or resolving `false` (or omitting the callback) keeps the built-in
|
|
138
168
|
conversion dialog. Errors thrown by the hook are reported via `onFailed` and
|
|
139
|
-
fall back to the built-in dialog.
|
|
169
|
+
fall back to the built-in dialog. The context preserves the triggering
|
|
170
|
+
selection while a host dialog is open; it returns `false` if that document has
|
|
171
|
+
changed. `context.convertToMdz()` runs the built-in conversion and image action
|
|
172
|
+
against the same captured selection.
|
|
140
173
|
|
|
141
174
|
`MdzipRenderingService` uses `defaultSafeMarkdownRenderer` when no renderer is
|
|
142
175
|
injected. The default renderer sanitizes generated HTML and unsafe URL schemes.
|
|
143
176
|
|
|
177
|
+
## Rendering Extensibility
|
|
178
|
+
|
|
179
|
+
The view accepts a custom markdown renderer, composable markdown pipeline
|
|
180
|
+
extensions, and entry renderers that replace the content area for selected
|
|
181
|
+
archive entries — all optional, with built-in behavior as the fallback:
|
|
182
|
+
|
|
183
|
+
```ts
|
|
184
|
+
import { mdzipPathMatcher, type MdzipEntryRenderer } from '@mdzip/editor';
|
|
185
|
+
|
|
186
|
+
const manifestRenderer: MdzipEntryRenderer = {
|
|
187
|
+
id: 'host-manifest-editor',
|
|
188
|
+
priority: 100,
|
|
189
|
+
matches: mdzipPathMatcher('manifest.json'),
|
|
190
|
+
mount: (container, context) => mountManifestEditor(container, {
|
|
191
|
+
manifest: context.manifest,
|
|
192
|
+
editable: context.mode === 'editable',
|
|
193
|
+
onChange: (manifest) => context.updateManifest(manifest)
|
|
194
|
+
})
|
|
195
|
+
};
|
|
196
|
+
|
|
197
|
+
const view = new MdzipWorkspaceView(container, {
|
|
198
|
+
markdownRenderer, // optional full renderer replacement
|
|
199
|
+
markdownExtensions: [mermaidExt], // transformMarkdown/transformHtml/mount
|
|
200
|
+
entryRenderers: [manifestRenderer]
|
|
201
|
+
});
|
|
202
|
+
```
|
|
203
|
+
|
|
204
|
+
Renderers may be asynchronous; stale results are dropped when the selection
|
|
205
|
+
moves on. Sanitization stays in the pipeline: string output from custom
|
|
206
|
+
renderers and transform hooks passes through DOMPurify before insertion. Entry
|
|
207
|
+
renderer handles are destroyed on selection change and `destroy()`. The same
|
|
208
|
+
options are available as inputs/props on the Angular, React, and Vue wrappers.
|
|
209
|
+
See the Developer Guide's Rendering Extensibility section for the contracts
|
|
210
|
+
and lifecycle rules.
|
|
211
|
+
|
|
144
212
|
## Developer Guide
|
|
145
213
|
|
|
146
214
|
See the [Developer Guide](https://github.com/mdzip-project/mdzip-editor/blob/main/docs/developer-guide.md)
|
|
@@ -162,3 +230,72 @@ import {
|
|
|
162
230
|
```
|
|
163
231
|
|
|
164
232
|
These helpers are built on `@mdzip/core-js` and are suitable for framework wrappers, desktop hosts, browser apps, and extension integrations.
|
|
233
|
+
|
|
234
|
+
## Archive Diff View
|
|
235
|
+
|
|
236
|
+
The optional diff entry point keeps merge dependencies out of normal editor
|
|
237
|
+
and preview bundles:
|
|
238
|
+
|
|
239
|
+
```ts
|
|
240
|
+
import { MdzipDiffView } from '@mdzip/editor/diff-view';
|
|
241
|
+
|
|
242
|
+
const diff = new MdzipDiffView(container, {
|
|
243
|
+
before: { bytes: baseBytes, label: 'Git base' },
|
|
244
|
+
after: { bytes: workingBytes, label: 'Working tree' },
|
|
245
|
+
initialPath: 'index.md',
|
|
246
|
+
toolbarActions: [{
|
|
247
|
+
id: 'refresh',
|
|
248
|
+
label: 'Refresh comparison',
|
|
249
|
+
icon: 'refresh',
|
|
250
|
+
run: refreshComparison
|
|
251
|
+
}]
|
|
252
|
+
});
|
|
253
|
+
```
|
|
254
|
+
|
|
255
|
+
Construction opens the initial comparison. Use `await diff.open(options)` to
|
|
256
|
+
replace both sides, `openPath(path)` to select an entry, and
|
|
257
|
+
`setShowUnchanged(false)` to focus the tree on changes. Toolbar actions may be
|
|
258
|
+
updated with `setToolbarActions()` without reopening either archive.
|
|
259
|
+
|
|
260
|
+
The library-owned toolbar provides a navigation toggle, Previous/Next change
|
|
261
|
+
buttons, and a Show-unchanged toggle. Drive change traversal in code with
|
|
262
|
+
`openPreviousChange()` / `openNextChange()` (they walk non-unchanged entries
|
|
263
|
+
and resolve `false` at the ends). Opt individual built-in controls out with
|
|
264
|
+
the `controls` option (`navigation`, `changeTraversal`, `showUnchanged`; all
|
|
265
|
+
default on). The navigation pane animates open/closed like the workspace nav
|
|
266
|
+
pane.
|
|
267
|
+
|
|
268
|
+
The read-only view shows the union of archive paths in a directory tree,
|
|
269
|
+
added/removed/changed status, side-by-side text diffs, explicit missing-side
|
|
270
|
+
states, image previews with metadata, and binary metadata. Entry content is
|
|
271
|
+
loaded only when selected. Call `destroy()` to release editors, listeners, and
|
|
272
|
+
image object URLs.
|
|
273
|
+
|
|
274
|
+
## Preview Lifecycle Signals
|
|
275
|
+
|
|
276
|
+
To reveal or animate read-only preview content without scraping internal DOM,
|
|
277
|
+
use the preview lifecycle signals on `MdzipWorkspaceView`:
|
|
278
|
+
|
|
279
|
+
```ts
|
|
280
|
+
const view = new MdzipWorkspaceView(container, {
|
|
281
|
+
controls: 'preview',
|
|
282
|
+
onPreviewRendered: (snapshot) => { /* preview HTML is mounted */ },
|
|
283
|
+
onAssetsHydrated: (snapshot) => { /* its images have finished loading */ }
|
|
284
|
+
});
|
|
285
|
+
|
|
286
|
+
// Or await the fullest "ready" point (mounted + images hydrated):
|
|
287
|
+
await view.whenRendered();
|
|
288
|
+
revealContent();
|
|
289
|
+
```
|
|
290
|
+
|
|
291
|
+
`whenRendered()` resolves immediately when the latest preview is already
|
|
292
|
+
hydrated, and resolves (rather than hanging) if the view is destroyed.
|
|
293
|
+
|
|
294
|
+
The preview hydrates images progressively: the text mounts right away with each
|
|
295
|
+
archive image in a collapsed slot, so the reader gets a compact, readable text
|
|
296
|
+
block first. As each image resolves, its slot eases open to the height reserved
|
|
297
|
+
from dimensions sniffed out of the image header — a single slide to the exact
|
|
298
|
+
box, so the pixels arrive with no further reflow (and it snaps open instead
|
|
299
|
+
under `prefers-reduced-motion`). `onPreviewRendered` fires when the text is
|
|
300
|
+
mounted; `onAssetsHydrated` fires once every referenced image has resolved and
|
|
301
|
+
its final `src` is assigned.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"archive-utils.d.ts","sourceRoot":"","sources":["../src/archive-utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,WAAW,EAChB,KAAK,mBAAmB,EACxB,KAAK,YAAY,EAClB,MAAM,gBAAgB,CAAC;AAExB,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,OAAO,CAAC;IACpB,OAAO,EAAE,OAAO,CAAC;IACjB,WAAW,EAAE,OAAO,CAAC;CACtB;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,YAAY,EAAE,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,WAAW,GAAG,IAAI,CAAC;IAC7B,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC5B,kBAAkB,EAAE,MAAM,EAAE,CAAC;IAC7B,UAAU,EAAE,mBAAmB,CAAC;CACjC;AAED,MAAM,WAAW,eAAe;IAC9B,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,UAAU,CAAC;CACvB;AAED,wBAAsB,cAAc,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,aAAa,CAAC,CAI9E;AAED,wBAAsB,0BAA0B,CAAC,SAAS,EAAE,YAAY,GAAG,OAAO,CAAC,aAAa,CAAC,
|
|
1
|
+
{"version":3,"file":"archive-utils.d.ts","sourceRoot":"","sources":["../src/archive-utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,WAAW,EAChB,KAAK,mBAAmB,EACxB,KAAK,YAAY,EAClB,MAAM,gBAAgB,CAAC;AAExB,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,OAAO,CAAC;IACpB,OAAO,EAAE,OAAO,CAAC;IACjB,WAAW,EAAE,OAAO,CAAC;CACtB;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,YAAY,EAAE,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,WAAW,GAAG,IAAI,CAAC;IAC7B,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC5B,kBAAkB,EAAE,MAAM,EAAE,CAAC;IAC7B,UAAU,EAAE,mBAAmB,CAAC;CACjC;AAED,MAAM,WAAW,eAAe;IAC9B,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,UAAU,CAAC;CACvB;AAED,wBAAsB,cAAc,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,aAAa,CAAC,CAI9E;AAED,wBAAsB,0BAA0B,CAAC,SAAS,EAAE,YAAY,GAAG,OAAO,CAAC,aAAa,CAAC,CAqChG;AAED,wBAAsB,uBAAuB,CAC3C,aAAa,EAAE,UAAU,EACzB,cAAc,EAAE,MAAM,EACtB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,UAAU,CAAC,CAGrB;AAED,wBAAsB,qBAAqB,CACzC,aAAa,EAAE,UAAU,EACzB,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,UAAU,GACpB,OAAO,CAAC,UAAU,CAAC,CAGrB;AAED,wBAAsB,sBAAsB,CAC1C,aAAa,EAAE,UAAU,EACzB,YAAY,EAAE,MAAM,EAAE,GACrB,OAAO,CAAC,UAAU,CAAC,CAGrB;AAED,wBAAsB,+BAA+B,CACnD,aAAa,EAAE,UAAU,EACzB,UAAU,CAAC,EAAE,MAAM,GAClB,OAAO,CAAC,MAAM,EAAE,CAAC,CAMnB;AAED,wBAAsB,yBAAyB,CAC7C,aAAa,EAAE,UAAU,EACzB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,UAAU,CAAC,CAOrB;AAED,wBAAsB,uBAAuB,CAC3C,aAAa,EAAE,UAAU,EACzB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,MAAM,CAAC,CAOjB;AAED,wBAAsB,eAAe,CAAC,eAAe,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAE5E;AAED,wBAAsB,wBAAwB,CAC5C,eAAe,EAAE,MAAM,EACvB,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,IAAI,CAAC,CAcf;AAED,wBAAsB,6BAA6B,CACjD,eAAe,EAAE,MAAM,EACvB,KAAK,EAAE,MAAM,EACb,MAAM,GAAE,SAAS,eAAe,EAAO,GACtC,OAAO,CAAC,UAAU,CAAC,CASrB;AAED,wBAAsB,4BAA4B,CAChD,aAAa,EAAE,UAAU,EACzB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,UAAU,CAAC,CAarB;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAGjD;AAED,wBAAsB,WAAW,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,UAAU,CAAC,CAEjE"}
|
package/dist/archive-utils.js
CHANGED
|
@@ -30,28 +30,12 @@ export async function openedArchiveFromWorkspace(workspace) {
|
|
|
30
30
|
isDirectory: false
|
|
31
31
|
}))
|
|
32
32
|
].sort((a, b) => a.path.localeCompare(b.path, undefined, { sensitivity: 'base' }));
|
|
33
|
-
const images = new Map();
|
|
34
|
-
for (const asset of workspace.assets) {
|
|
35
|
-
if (asset.kind !== 'image') {
|
|
36
|
-
continue;
|
|
37
|
-
}
|
|
38
|
-
if (asset.readDataUri) {
|
|
39
|
-
images.set(asset.path, await asset.readDataUri());
|
|
40
|
-
continue;
|
|
41
|
-
}
|
|
42
|
-
const bytes = asset.bytes
|
|
43
|
-
? await binarySourceToBytes(asset.bytes)
|
|
44
|
-
: await asset.readBytes?.();
|
|
45
|
-
if (bytes) {
|
|
46
|
-
images.set(asset.path, `data:${asset.mimeType};base64,${bytesToBase64(bytes)}`);
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
33
|
return {
|
|
50
34
|
paths,
|
|
51
35
|
entryPoint,
|
|
52
36
|
manifest: workspace.manifest,
|
|
53
37
|
markdownText,
|
|
54
|
-
images,
|
|
38
|
+
images: new Map(),
|
|
55
39
|
orphanedAssetPaths: workspace.orphanedAssets?.orphanedAssetPaths ?? [],
|
|
56
40
|
validation: workspace.validation
|
|
57
41
|
};
|
|
@@ -128,21 +112,4 @@ export function isImagePath(path) {
|
|
|
128
112
|
export async function blobToBytes(blob) {
|
|
129
113
|
return new Uint8Array(await blob.arrayBuffer());
|
|
130
114
|
}
|
|
131
|
-
async function binarySourceToBytes(source) {
|
|
132
|
-
if (source instanceof Uint8Array) {
|
|
133
|
-
return source;
|
|
134
|
-
}
|
|
135
|
-
if (source instanceof ArrayBuffer) {
|
|
136
|
-
return new Uint8Array(source);
|
|
137
|
-
}
|
|
138
|
-
return blobToBytes(source);
|
|
139
|
-
}
|
|
140
|
-
function bytesToBase64(bytes) {
|
|
141
|
-
let binary = '';
|
|
142
|
-
const chunkSize = 0x8000;
|
|
143
|
-
for (let index = 0; index < bytes.length; index += chunkSize) {
|
|
144
|
-
binary += String.fromCharCode(...bytes.subarray(index, index + chunkSize));
|
|
145
|
-
}
|
|
146
|
-
return btoa(binary);
|
|
147
|
-
}
|
|
148
115
|
//# sourceMappingURL=archive-utils.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"archive-utils.js","sourceRoot":"","sources":["../src/archive-utils.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,oBAAoB,EACpB,cAAc,EACd,eAAe,EAIhB,MAAM,gBAAgB,CAAC;AAwBxB,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,KAAiB;IACpD,OAAO,0BAA0B,CAAC,MAAM,cAAc,CAAC,aAAa,CAAC,KAAK,EAAE;QAC1E,4BAA4B,EAAE,IAAI;KACnC,CAAC,CAAC,CAAC;AACN,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,0BAA0B,CAAC,SAAuB;IACtE,MAAM,UAAU,GAAG,SAAS,CAAC,UAAU;WAClC,SAAS,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,IAAI;WACnE,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI;WAC5B,UAAU,CAAC;IAChB,MAAM,YAAY,GAAG,SAAS,CAAC,SAAS,CAAC,IAAI,CAC3C,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,UAAU,CAAC,WAAW,EAAE,CACvE,EAAE,IAAI,IAAI,EAAE,CAAC;IACd,MAAM,KAAK,GAAG;QACZ,GAAG,SAAS,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAgB,EAAE,CAAC,CAAC;YACtD,IAAI,EAAE,QAAQ,CAAC,IAAI;YACnB,UAAU,EAAE,IAAI;YAChB,OAAO,EAAE,KAAK;YACd,WAAW,EAAE,KAAK;SACnB,CAAC,CAAC;QACH,GAAG,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;gBACxB,IAAI,EAAE,eAAe;gBACrB,UAAU,EAAE,KAAK;gBACjB,OAAO,EAAE,KAAK;gBACd,WAAW,EAAE,KAAK;aACnB,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACR,GAAG,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAgB,EAAE,CAAC,CAAC;YAChD,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,UAAU,EAAE,KAAK;YACjB,OAAO,EAAE,KAAK,CAAC,IAAI,KAAK,OAAO;YAC/B,WAAW,EAAE,KAAK;SACnB,CAAC,CAAC;KACJ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,EAAE,SAAS,EAAE,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;IACnF,
|
|
1
|
+
{"version":3,"file":"archive-utils.js","sourceRoot":"","sources":["../src/archive-utils.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import type { MdzWorkspaceAsset } from '@mdzip/core-js';
|
|
2
|
+
import type { MdzipWorkspaceService } from './workspace.js';
|
|
3
|
+
export interface MdzipAssetCacheEntry {
|
|
4
|
+
bytes: Uint8Array;
|
|
5
|
+
mimeType: string;
|
|
6
|
+
}
|
|
7
|
+
export interface MdzipAssetCache {
|
|
8
|
+
get(contentKey: string): Promise<MdzipAssetCacheEntry | undefined>;
|
|
9
|
+
set(contentKey: string, entry: MdzipAssetCacheEntry): Promise<void>;
|
|
10
|
+
getReference(referenceKey: string): Promise<string | undefined>;
|
|
11
|
+
setReference(referenceKey: string, contentKey: string): Promise<void>;
|
|
12
|
+
}
|
|
13
|
+
export interface MdzipIndexedDbAssetCacheOptions {
|
|
14
|
+
databaseName?: string;
|
|
15
|
+
maxBytes?: number;
|
|
16
|
+
maxEntries?: number;
|
|
17
|
+
maxAgeMs?: number;
|
|
18
|
+
}
|
|
19
|
+
export declare class MdzipIndexedDbAssetCache implements MdzipAssetCache {
|
|
20
|
+
private readonly databaseName;
|
|
21
|
+
private readonly maxBytes;
|
|
22
|
+
private readonly maxEntries;
|
|
23
|
+
private readonly maxAgeMs;
|
|
24
|
+
private databasePromise;
|
|
25
|
+
constructor(options?: MdzipIndexedDbAssetCacheOptions);
|
|
26
|
+
get(contentKey: string): Promise<MdzipAssetCacheEntry | undefined>;
|
|
27
|
+
set(contentKey: string, entry: MdzipAssetCacheEntry): Promise<void>;
|
|
28
|
+
getReference(referenceKey: string): Promise<string | undefined>;
|
|
29
|
+
setReference(referenceKey: string, contentKey: string): Promise<void>;
|
|
30
|
+
private database;
|
|
31
|
+
private putStored;
|
|
32
|
+
private deleteAsset;
|
|
33
|
+
private prune;
|
|
34
|
+
}
|
|
35
|
+
export interface MdzipAssetSessionOptions {
|
|
36
|
+
cache?: MdzipAssetCache;
|
|
37
|
+
sourceId?: string | (() => Promise<string>);
|
|
38
|
+
onFailed?: (error: unknown) => void;
|
|
39
|
+
}
|
|
40
|
+
export interface MdzipResolvedImage {
|
|
41
|
+
url: string;
|
|
42
|
+
/** Intrinsic pixel width, when it could be sniffed from the image bytes. */
|
|
43
|
+
width?: number;
|
|
44
|
+
/** Intrinsic pixel height, when it could be sniffed from the image bytes. */
|
|
45
|
+
height?: number;
|
|
46
|
+
}
|
|
47
|
+
export declare class MdzipAssetSession {
|
|
48
|
+
private readonly workspace;
|
|
49
|
+
private readonly assets;
|
|
50
|
+
private readonly ownerDocument;
|
|
51
|
+
private readonly options;
|
|
52
|
+
private readonly urls;
|
|
53
|
+
private readonly sizes;
|
|
54
|
+
private readonly pending;
|
|
55
|
+
private sourceIdPromise;
|
|
56
|
+
private destroyed;
|
|
57
|
+
constructor(workspace: MdzipWorkspaceService, assets: readonly MdzWorkspaceAsset[], ownerDocument: Document, options?: MdzipAssetSessionOptions);
|
|
58
|
+
resolveKnown(path: string, currentPath: string): string | undefined;
|
|
59
|
+
resolve(path: string, currentPath: string): Promise<string | undefined>;
|
|
60
|
+
/**
|
|
61
|
+
* Resolves an image to its URL plus, when sniffable from the bytes, its
|
|
62
|
+
* intrinsic dimensions — enabling progressive hydration that reserves layout
|
|
63
|
+
* space before the image visually loads.
|
|
64
|
+
*/
|
|
65
|
+
resolveImage(path: string, currentPath: string): Promise<MdzipResolvedImage | undefined>;
|
|
66
|
+
rewriteHtml(html: string, currentPath: string, signal: AbortSignal): Promise<string>;
|
|
67
|
+
destroy(): void;
|
|
68
|
+
private resolveAsset;
|
|
69
|
+
private storeUrl;
|
|
70
|
+
private referenceKey;
|
|
71
|
+
}
|
|
72
|
+
export declare function mdzipArchiveSourceId(bytes: Uint8Array): Promise<string>;
|
|
73
|
+
/**
|
|
74
|
+
* Reads intrinsic pixel dimensions from common image headers without decoding
|
|
75
|
+
* the image. Returns `undefined` for formats it does not recognize.
|
|
76
|
+
*/
|
|
77
|
+
export declare function sniffImageSize(bytes: Uint8Array, mimeType: string): {
|
|
78
|
+
width: number;
|
|
79
|
+
height: number;
|
|
80
|
+
} | undefined;
|
|
81
|
+
//# sourceMappingURL=asset-cache.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"asset-cache.d.ts","sourceRoot":"","sources":["../src/asset-cache.ts"],"names":[],"mappings":"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"}
|