@quillmark/wasm 0.108.1 → 0.108.3

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 CHANGED
@@ -1,5 +1,94 @@
1
1
  # Changelog
2
2
 
3
+ ## v0.108.3 - 2026-08-21
4
+
5
+ - fix(typst): **a paragraph holding one bare `/` renders instead of failing the
6
+ compile.** Typst's heading `=`, list `-`/`+`/`N.`, and term `/` markers fire
7
+ on a space after them *or* on the line ending there; the emitter's
8
+ line-anchor guard tested only for the space, so a run that was one bare
9
+ marker reached Typst unescaped — `/` as a term list whose colon is missing
10
+ (`expected colon`), the other four as an empty heading, bullet or enum item.
11
+ The guard now takes Typst's own test, and covers a list item's body head as
12
+ well as column 0, that being a line start the parser reads as one.
13
+
14
+ - fix(typst): **bold text, a table cell or an indented paragraph opening with
15
+ `-`, `=`, `+`, `/` or `N.` renders as that text.** Typst reads the head of
16
+ every content block `[…]` as a line start of its own, so the marker in
17
+ `**/ x**` or in a table cell reached it as a term list whose colon is missing
18
+ and failed the compile, while `**- x**` drew a bullet list inside the bold.
19
+ Indentation is trivia and holds that line start open behind it, so a
20
+ paragraph beginning ` / x` failed the same way. The line-anchor guard now
21
+ covers every position Typst reads as a line start.
22
+
23
+ - fix(typst): **text directly after inline code, bold or an image renders when
24
+ it opens with `(` or `.name`.** Typst reads a `(` directly after a `#…`
25
+ expression as that call's arguments and a `.` before an identifier as a field
26
+ access, so the emitter's own `#raw(…)`, `#strong[…]` and `#image(…)` handed
27
+ the text behind them to Typst as code — `` `x`(y) `` became a call on
28
+ content, which fails the compile. Such a run now takes the same `\` prefix
29
+ the line-anchor guard uses. Debug builds parse every emission with Typst's
30
+ parser, so markup that reaches it as syntax fails a test rather than a render.
31
+
32
+ <!-- seed: commits since v0.108.2, confirm the entries above cover them, then delete this comment
33
+ - fix(typst): stop a `#…` expression running on into the text behind it
34
+ - fix(typst): guard the line anchor at every position Typst reads as one
35
+ - fix(typst): escape a line-anchor marker that ends its run
36
+ -->
37
+
38
+
39
+ ## v0.108.2 - 2026-08-20
40
+
41
+ - fix(core): **storage blobs tagged `@0.81.0` and `@0.82.0` load again.** Both
42
+ tags migrate forward on read instead of failing as an unknown schema version.
43
+ Migrations chain (`V0_81_0 → V0_82_0 → V0_92_0 → V0_93_0`); the write path is
44
+ untouched, so re-serializing a migrated row emits `@0.93.0`.
45
+
46
+ The `V0_82_0` hop is **lossy in one place**: the `$id` payload item is
47
+ dropped, the live model having no counterpart for it. The alternative is
48
+ refusing the row. A consumer that kept a key under `$id` re-establishes it
49
+ under a `$ext` namespace it owns.
50
+
51
+ This reverses the #929 retirement, whose two premises were both wrong. Rows
52
+ do predate `@0.92.0` — #1327 reports stored `@0.81.0` ones. And `0.82.0` was
53
+ not yanked: every published Quillmark version is live on crates.io, npm, and
54
+ PyPI. Because no yank happened, `@0.82.0` names a shape
55
+ union rather than a frozen format — every release from `0.83.0` through
56
+ `0.91.0` stamped it — so the restored reader accepts the union (#1327)
57
+
58
+ - refactor!: **one definition per mechanism across the rust crates.** A
59
+ whole-codebase simplify pass: the typst session compiles through one
60
+ `recompile` pipeline whose derived tables (regions, span windows, page hashes)
61
+ are built per commit instead of per query; the pdf reader's scan plumbing
62
+ (`object_dict`, `open_trailer`, `dict_end`, `ws_end`) and the page-dict array
63
+ splice are single definitions shared by stamp and flatten; the flattened PDF
64
+ is shared by `Arc` instead of copied per render; emission, prescan, payload
65
+ assembly and validation in core lose their duplicated dispatch and their
66
+ per-keystroke deep clones. Two outputs shift: a blank pdfform document returns
67
+ the base PDF unchanged rather than appending a revision carrying two
68
+ unreferenced font objects, and three `quillmark-pdf` parse-failure messages
69
+ share one `dict not parseable` spelling (codes unchanged). Dead public API is
70
+ deleted: `FileTreeNode::{file_exists, dir_exists, list_files,
71
+ list_subdirectories}`, `Payload::contains_key`, `PayloadItem::nested_comments`,
72
+ `QuillValue::{string, integer, bool, null}` (the `From` impls and `from_json`
73
+ are the constructors), `FieldSpec::{with_schema_field, with_value,
74
+ with_tooltip}` (assign the fields), and `quillmark-content`'s
75
+ `strip_bidi_formatting` / `fix_html_comment_fences` (internal to
76
+ `normalize_markdown`). None had a caller in the workspace or bindings.
77
+
78
+ - fix: **an empty mapping emits as `{}` rather than losing its key.** `emit_field`
79
+ dropped an empty-object field entirely, which composes with the block form of
80
+ its parent into markdown no parser accepts: a `$ext` whose every namespace
81
+ emptied wrote `$ext:` with no children, and re-parsed as null. That is the
82
+ `parse::invalid_structure` a `@quillmark/svelte` host hit on save, once a
83
+ tips-card dismissal had cleared `$ext.editor.tips`. One level down the same
84
+ rule ran silent: `$ext` is the only slot type-checked, so an inner mapping
85
+ turned null and the document parsed clean, handing a consumer back a type it
86
+ never wrote. Plain user fields carried that loss too — `cfg: {opts: {}}`
87
+ re-parsed as `cfg: null`, and the second emit then differed from the first.
88
+ Empty mappings now emit `key: {}` at every depth. That is the spelling a
89
+ sequence item (`- {}`) and a wholly empty `$ext: {}` already used, so an
90
+ emptied container survives the round-trip as the value a consumer stored.
91
+
3
92
  ## v0.108.1 - 2026-08-19
4
93
 
5
94
  - fix: **a content cell under `variants:` is readable at its codec.**
@@ -14,11 +103,6 @@
14
103
  variantless enum stays a scalar. The write is unchanged — a variant container
15
104
  has no per-cell op address and needs none, committing whole.
16
105
 
17
- <!-- seed: commits since v0.108.0, confirm the entries above cover them, then delete this comment
18
- - fix: a content cell under `variants:` reads at its codec
19
- -->
20
-
21
-
22
106
  ## v0.108.0 - 2026-08-18
23
107
 
24
108
  - fix: **the value ladder is cut per cell, so the plate is total at every
Binary file
Binary file
package/core/wasm_bg.wasm CHANGED
Binary file
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@quillmark/wasm",
3
- "version": "0.108.1",
3
+ "version": "0.108.3",
4
4
  "description": "WebAssembly bindings for Quillmark, a schema-driven document engine",
5
5
  "type": "module",
6
6
  "license": "Apache-2.0",