@quillmark/wasm 0.108.0 → 0.108.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +88 -0
- package/backends/pdfform/wasm.js +2 -1
- package/backends/pdfform/wasm_bg.wasm +0 -0
- package/backends/typst/wasm.js +2 -1
- package/backends/typst/wasm_bg.wasm +0 -0
- package/core/wasm.js +2 -1
- package/core/wasm_bg.wasm +0 -0
- package/package.json +1 -1
- package/runtime/runtime.d.ts +4 -4
- package/runtime/runtime.js +2 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,93 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## v0.108.2 - 2026-08-20
|
|
4
|
+
|
|
5
|
+
- fix(core): **storage blobs tagged `@0.81.0` and `@0.82.0` load again.** Both
|
|
6
|
+
tags migrate forward on read instead of failing as an unknown schema version.
|
|
7
|
+
Migrations chain (`V0_81_0 → V0_82_0 → V0_92_0 → V0_93_0`); the write path is
|
|
8
|
+
untouched, so re-serializing a migrated row emits `@0.93.0`.
|
|
9
|
+
|
|
10
|
+
The `V0_82_0` hop is **lossy in one place**: the `$id` payload item is
|
|
11
|
+
dropped, the live model having no counterpart for it. The alternative is
|
|
12
|
+
refusing the row. A consumer that kept a key under `$id` re-establishes it
|
|
13
|
+
under a `$ext` namespace it owns.
|
|
14
|
+
|
|
15
|
+
This reverses the #929 retirement, whose two premises were both wrong. Rows
|
|
16
|
+
do predate `@0.92.0` — #1327 reports stored `@0.81.0` ones. And `0.82.0` was
|
|
17
|
+
not yanked: every published Quillmark version is live on crates.io, npm, and
|
|
18
|
+
PyPI. Because no yank happened, `@0.82.0` names a shape
|
|
19
|
+
union rather than a frozen format — every release from `0.83.0` through
|
|
20
|
+
`0.91.0` stamped it — so the restored reader accepts the union (#1327)
|
|
21
|
+
|
|
22
|
+
- refactor!: **one definition per mechanism across the rust crates.** A
|
|
23
|
+
whole-codebase simplify pass: the typst session compiles through one
|
|
24
|
+
`recompile` pipeline whose derived tables (regions, span windows, page hashes)
|
|
25
|
+
are built per commit instead of per query; the pdf reader's scan plumbing
|
|
26
|
+
(`object_dict`, `open_trailer`, `dict_end`, `ws_end`) and the page-dict array
|
|
27
|
+
splice are single definitions shared by stamp and flatten; the flattened PDF
|
|
28
|
+
is shared by `Arc` instead of copied per render; emission, prescan, payload
|
|
29
|
+
assembly and validation in core lose their duplicated dispatch and their
|
|
30
|
+
per-keystroke deep clones. Two outputs shift: a blank pdfform document returns
|
|
31
|
+
the base PDF unchanged rather than appending a revision carrying two
|
|
32
|
+
unreferenced font objects, and three `quillmark-pdf` parse-failure messages
|
|
33
|
+
share one `dict not parseable` spelling (codes unchanged). Dead public API is
|
|
34
|
+
deleted: `FileTreeNode::{file_exists, dir_exists, list_files,
|
|
35
|
+
list_subdirectories}`, `Payload::contains_key`, `PayloadItem::nested_comments`,
|
|
36
|
+
`QuillValue::{string, integer, bool, null}` (the `From` impls and `from_json`
|
|
37
|
+
are the constructors), `FieldSpec::{with_schema_field, with_value,
|
|
38
|
+
with_tooltip}` (assign the fields), and `quillmark-content`'s
|
|
39
|
+
`strip_bidi_formatting` / `fix_html_comment_fences` (internal to
|
|
40
|
+
`normalize_markdown`). None had a caller in the workspace or bindings.
|
|
41
|
+
|
|
42
|
+
- fix: **an empty mapping emits as `{}` rather than losing its key.** `emit_field`
|
|
43
|
+
dropped an empty-object field entirely, which composes with the block form of
|
|
44
|
+
its parent into markdown no parser accepts: a `$ext` whose every namespace
|
|
45
|
+
emptied wrote `$ext:` with no children, and re-parsed as null. That is the
|
|
46
|
+
`parse::invalid_structure` a `@quillmark/svelte` host hit on save, once a
|
|
47
|
+
tips-card dismissal had cleared `$ext.editor.tips`. One level down the same
|
|
48
|
+
rule ran silent: `$ext` is the only slot type-checked, so an inner mapping
|
|
49
|
+
turned null and the document parsed clean, handing a consumer back a type it
|
|
50
|
+
never wrote. Plain user fields carried that loss too — `cfg: {opts: {}}`
|
|
51
|
+
re-parsed as `cfg: null`, and the second emit then differed from the first.
|
|
52
|
+
Empty mappings now emit `key: {}` at every depth. That is the spelling a
|
|
53
|
+
sequence item (`- {}`) and a wholly empty `$ext: {}` already used, so an
|
|
54
|
+
emptied container survives the round-trip as the value a consumer stored.
|
|
55
|
+
|
|
56
|
+
<!-- seed: commits since v0.108.1, confirm the entries above cover them, then delete this comment
|
|
57
|
+
- docs(canon): record that @0.81.0 is the oldest tag that exists
|
|
58
|
+
- docs: leave the applied migration guide untouched
|
|
59
|
+
- docs: dense-prose pass on the DTO backfill
|
|
60
|
+
- test(core): drop the vacuous V0_81_0 body-import test
|
|
61
|
+
- fix(core): restore the V0_82_0 read shim; 0.82.0 was never yanked (#1327)
|
|
62
|
+
- chore(deps): bump the cargo group with 2 updates
|
|
63
|
+
- chore(deps): bump taiki-e/install-action in the actions group
|
|
64
|
+
- fix(core): restore the V0_81_0 storage read shim (#1327)
|
|
65
|
+
- docs: changelog entry for the simplify sweep
|
|
66
|
+
- refactor(core)!: apply simplify-review cleanups to the session seam
|
|
67
|
+
- docs(pdf): trim test helper doc to its contract
|
|
68
|
+
- refactor(core/document): apply simplify-review cleanups
|
|
69
|
+
- refactor(pdf): apply simplify-review cleanups
|
|
70
|
+
- refactor(typst): apply simplify-review cleanups
|
|
71
|
+
- refactor(core/quill): apply simplify-review cleanups
|
|
72
|
+
- refactor(content): apply simplify-review cleanups
|
|
73
|
+
- fix: an empty mapping emits as `{}` rather than losing its key
|
|
74
|
+
-->
|
|
75
|
+
|
|
76
|
+
|
|
77
|
+
## v0.108.1 - 2026-08-19
|
|
78
|
+
|
|
79
|
+
- fix: **a content cell under `variants:` is readable at its codec.**
|
|
80
|
+
`schema_at`, the walk behind `reader.get_content_at`, stepped `items` and
|
|
81
|
+
`properties` where conform steps `variants` as well, so a key into a variant
|
|
82
|
+
container fell to the catch-all and answered `edit::field_not_content` naming
|
|
83
|
+
`enum` — for a cell the same config declares `plaintext`. Such a cell stored,
|
|
84
|
+
conformed, seeded, validated and rendered, and nothing could read it back, so
|
|
85
|
+
no consumer could mount a content editor over it. The walk unions the worlds,
|
|
86
|
+
so a cell of a world that is not live reads absent rather than raising, as a
|
|
87
|
+
stale row index does; a name no world declares is `edit::unknown_field`, and a
|
|
88
|
+
variantless enum stays a scalar. The write is unchanged — a variant container
|
|
89
|
+
has no per-cell op address and needs none, committing whole.
|
|
90
|
+
|
|
3
91
|
## v0.108.0 - 2026-08-18
|
|
4
92
|
|
|
5
93
|
- fix: **the value ladder is cut per cell, so the plate is total at every
|
package/backends/pdfform/wasm.js
CHANGED
|
@@ -196,7 +196,8 @@ export class Document {
|
|
|
196
196
|
* and [`reader.getContent`](Self::reader_get_content) with the path spelled
|
|
197
197
|
* out. `path` is a `PathStep[]` from the field to the leaf — `[0]` an
|
|
198
198
|
* element of an `array<richtext>`, `["motto"]` an `object`'s content
|
|
199
|
-
* property, `[1, "notes"]` a leaf under both
|
|
199
|
+
* property, `[1, "notes"]` a leaf under both, `["controlled_by"]` a
|
|
200
|
+
* variant's cell.
|
|
200
201
|
*
|
|
201
202
|
* The codec is the leaf's declared type's, so the caller stops deciding
|
|
202
203
|
* what an element's stored bytes mean. Total over the storage form, as the
|
|
Binary file
|
package/backends/typst/wasm.js
CHANGED
|
@@ -196,7 +196,8 @@ export class Document {
|
|
|
196
196
|
* and [`reader.getContent`](Self::reader_get_content) with the path spelled
|
|
197
197
|
* out. `path` is a `PathStep[]` from the field to the leaf — `[0]` an
|
|
198
198
|
* element of an `array<richtext>`, `["motto"]` an `object`'s content
|
|
199
|
-
* property, `[1, "notes"]` a leaf under both
|
|
199
|
+
* property, `[1, "notes"]` a leaf under both, `["controlled_by"]` a
|
|
200
|
+
* variant's cell.
|
|
200
201
|
*
|
|
201
202
|
* The codec is the leaf's declared type's, so the caller stops deciding
|
|
202
203
|
* what an element's stored bytes mean. Total over the storage form, as the
|
|
Binary file
|
package/core/wasm.js
CHANGED
|
@@ -196,7 +196,8 @@ export class Document {
|
|
|
196
196
|
* and [`reader.getContent`](Self::reader_get_content) with the path spelled
|
|
197
197
|
* out. `path` is a `PathStep[]` from the field to the leaf — `[0]` an
|
|
198
198
|
* element of an `array<richtext>`, `["motto"]` an `object`'s content
|
|
199
|
-
* property, `[1, "notes"]` a leaf under both
|
|
199
|
+
* property, `[1, "notes"]` a leaf under both, `["controlled_by"]` a
|
|
200
|
+
* variant's cell.
|
|
200
201
|
*
|
|
201
202
|
* The codec is the leaf's declared type's, so the caller stops deciding
|
|
202
203
|
* what an element's stored bytes mean. Total over the storage form, as the
|
package/core/wasm_bg.wasm
CHANGED
|
Binary file
|
package/package.json
CHANGED
package/runtime/runtime.d.ts
CHANGED
|
@@ -771,10 +771,10 @@ export declare class DocumentReader {
|
|
|
771
771
|
/**
|
|
772
772
|
* Read the `Content` nested inside the composite field at `addr`, at `path`:
|
|
773
773
|
* `[0]` an element of an `array<richtext>`, `["motto"]` an object's content
|
|
774
|
-
* property, `[1, "notes"]` a leaf under both
|
|
775
|
-
*
|
|
776
|
-
*
|
|
777
|
-
* {@link getContent}.
|
|
774
|
+
* property, `[1, "notes"]` a leaf under both, `["controlled_by"]` a variant's
|
|
775
|
+
* cell. The codec is the leaf's declared type's, resolved through the field
|
|
776
|
+
* schema's `items` / `properties` / `variants`, so the element's storage
|
|
777
|
+
* form is not the caller's business. The empty path is {@link getContent}.
|
|
778
778
|
*
|
|
779
779
|
* `undefined` for an absent field and for a path that names nothing in the
|
|
780
780
|
* stored value: a repeater's row index goes stale between derive and read,
|
package/runtime/runtime.js
CHANGED
|
@@ -1205,7 +1205,8 @@ export class DocumentReader {
|
|
|
1205
1205
|
/**
|
|
1206
1206
|
* Read the `Content` nested inside the composite field at `addr`, at `path`:
|
|
1207
1207
|
* `[0]` an `array<richtext>` element, `["motto"]` an object's content property,
|
|
1208
|
-
* `[1, "notes"]` a leaf under both
|
|
1208
|
+
* `[1, "notes"]` a leaf under both, `["controlled_by"]` a variant's cell. The
|
|
1209
|
+
* codec is the leaf's declared type's.
|
|
1209
1210
|
* `undefined` for an absent field and for a path that names nothing stored;
|
|
1210
1211
|
* throws `UnknownField`, `FieldNotContent` when `path` resolves to no content
|
|
1211
1212
|
* leaf, `FieldDecode` anchored at the addressed path, and `IndexOutOfRange`.
|