@quillmark/wasm 0.65.1 → 0.66.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/README.md CHANGED
@@ -11,9 +11,12 @@ Use Quillmark in browsers/Node.js with explicit in-memory trees (`Map<string, Ui
11
11
  ## Build
12
12
 
13
13
  ```bash
14
- wasm-pack build --target bundler --scope quillmark
14
+ bash scripts/build-wasm.sh
15
15
  ```
16
16
 
17
+ The script builds for `bundler` and `experimental-nodejs-module` targets with
18
+ `--weak-refs` enabled (see [Lifecycle](#lifecycle)).
19
+
17
20
  ## Test
18
21
 
19
22
  ```bash
@@ -51,11 +54,30 @@ Create engine.
51
54
  Build + validate + attach backend. Returns a render-ready `Quill`.
52
55
 
53
56
  ### `Document.fromMarkdown(markdown)`
54
- Parse markdown to parsed document.
57
+ Parse markdown to a parsed document. Throws a JS `Error` (with `.diagnostics`
58
+ attached, see [Errors](#errors)) on any parse failure, including missing
59
+ `QUILL`, malformed YAML, and inputs over the 10 MB `parse::input_too_large`
60
+ limit.
55
61
 
56
62
  ### `doc.toMarkdown()`
57
63
  Emit canonical Quillmark Markdown. Type-fidelity round-trip safe:
58
- `Document.fromMarkdown(doc.toMarkdown())` returns a document equal to `doc`.
64
+ `Document.fromMarkdown(doc.toMarkdown())` returns a document equal to `doc`
65
+ under [`doc.equals`](#docequalsother). The output is **not** guaranteed
66
+ byte-equal to the original source — YAML quoting, key ordering, and
67
+ whitespace are normalised. Use `equals` (not string comparison) to test
68
+ semantic equality.
69
+
70
+ ### `doc.equals(other)`
71
+ Structural equality between two `Document` handles. Compares `main` and
72
+ `cards` by value; parse-time `warnings` are intentionally excluded.
73
+
74
+ Use this to debounce upstream prop updates: keep the last parsed `Document`
75
+ and compare instead of re-parsing on every keystroke.
76
+
77
+ ### `doc.cardCount`
78
+ O(1) getter for the number of composable cards (excluding the main card).
79
+ Use this to validate indices before calling card mutators (`removeCard`,
80
+ `updateCardField`, etc.) without allocating the full `cards` array.
59
81
 
60
82
  ### `quill.render(parsed, opts?)`
61
83
  Render with a pre-parsed `Document`.
@@ -65,15 +87,36 @@ Open once, render all or selected pages (`opts.pages`).
65
87
 
66
88
  ### Errors
67
89
 
68
- Every method that can fail throws a JS `Error` with a flat shape:
90
+ Every method that can fail throws a JS `Error` with `.diagnostics` attached:
69
91
 
70
92
  ```ts
71
93
  { message: string, diagnostics: Diagnostic[] }
72
94
  ```
73
95
 
74
96
  `diagnostics` is always non-empty — length 1 for most failures, length N for
75
- backend compilation errors. Read `err.diagnostics[0]` for the primary
76
- diagnostic; iterate the array for compilation failures.
97
+ backend compilation errors. `message` is derived from `diagnostics`
98
+ (`diagnostics[0].message` for single-diagnostic errors; an aggregate
99
+ `"<N> error(s): <first.message>"` summary for compilation failures).
100
+
101
+ Read `err.diagnostics[0]` for the primary diagnostic; iterate the array for
102
+ compilation failures. The same shape applies to every throw site:
103
+
104
+ - `Document.fromMarkdown` — parse errors (missing `QUILL`, YAML errors,
105
+ `parse::input_too_large` for inputs > 10 MB).
106
+ - `Document` mutators (`setField`, `updateCardField`, etc.) — `EditError`
107
+ variants (`ReservedName`, `InvalidFieldName`, `InvalidTagName`,
108
+ `IndexOutOfRange`) appear in `diagnostics[0].message` with the
109
+ `[EditError::<Variant>]` prefix.
110
+ - `quill.render` / `session.render` — backend compilation failures and
111
+ validation errors.
112
+
113
+ ### Lifecycle
114
+
115
+ The wasm bindings are built with `--weak-refs`, so dropped `Document`,
116
+ `Quill`, and `RenderSession` handles are reclaimed by `FinalizationRegistry`
117
+ without manual `.free()` discipline. `.free()` is still emitted as an eager
118
+ teardown hook for callers that want deterministic release. Requires
119
+ Node 14.6+ / current evergreen browsers (all supported targets).
77
120
 
78
121
  ## Notes
79
122
 
package/bundler/wasm.d.ts CHANGED
@@ -88,6 +88,17 @@ export class Document {
88
88
  * history of either handle.
89
89
  */
90
90
  clone(): Document;
91
+ /**
92
+ * Structural equality against another `Document`.
93
+ *
94
+ * Compares `main` and `cards` by value (matching core's [`PartialEq`]).
95
+ * Parse-time `warnings` are intentionally excluded — they describe the
96
+ * source text, not the document's content.
97
+ *
98
+ * Use this to debounce upstream prop updates: keep the last parsed
99
+ * `Document` and compare instead of re-parsing on every keystroke.
100
+ */
101
+ equals(other: Document): boolean;
91
102
  /**
92
103
  * Parse markdown into a typed Document.
93
104
  *
@@ -228,6 +239,13 @@ export class Document {
228
239
  * Mutators never modify `warnings`.
229
240
  */
230
241
  updateCardField(index: number, name: string, value: any): void;
242
+ /**
243
+ * Number of composable cards (excludes the main card).
244
+ *
245
+ * O(1). Use this to validate indices before calling card mutators
246
+ * instead of allocating the full `cards` array.
247
+ */
248
+ readonly cardCount: number;
231
249
  /**
232
250
  * Ordered list of composable card blocks as typed `Card` objects.
233
251
  */
@@ -29,6 +29,17 @@ export class Document {
29
29
  const ptr = this.__destroy_into_raw();
30
30
  wasm.__wbg_document_free(ptr, 0);
31
31
  }
32
+ /**
33
+ * Number of composable cards (excludes the main card).
34
+ *
35
+ * O(1). Use this to validate indices before calling card mutators
36
+ * instead of allocating the full `cards` array.
37
+ * @returns {number}
38
+ */
39
+ get cardCount() {
40
+ const ret = wasm.document_cardCount(this.__wbg_ptr);
41
+ return ret >>> 0;
42
+ }
32
43
  /**
33
44
  * Ordered list of composable card blocks as typed `Card` objects.
34
45
  * @returns {Card[]}
@@ -50,6 +61,23 @@ export class Document {
50
61
  const ret = wasm.document_clone(this.__wbg_ptr);
51
62
  return Document.__wrap(ret);
52
63
  }
64
+ /**
65
+ * Structural equality against another `Document`.
66
+ *
67
+ * Compares `main` and `cards` by value (matching core's [`PartialEq`]).
68
+ * Parse-time `warnings` are intentionally excluded — they describe the
69
+ * source text, not the document's content.
70
+ *
71
+ * Use this to debounce upstream prop updates: keep the last parsed
72
+ * `Document` and compare instead of re-parsing on every keystroke.
73
+ * @param {Document} other
74
+ * @returns {boolean}
75
+ */
76
+ equals(other) {
77
+ _assertClass(other, Document);
78
+ const ret = wasm.document_equals(this.__wbg_ptr, other.__wbg_ptr);
79
+ return ret !== 0;
80
+ }
53
81
  /**
54
82
  * Parse markdown into a typed Document.
55
83
  *
Binary file
@@ -5,8 +5,10 @@ export const __wbg_document_free: (a: number, b: number) => void;
5
5
  export const __wbg_quill_free: (a: number, b: number) => void;
6
6
  export const __wbg_quillmark_free: (a: number, b: number) => void;
7
7
  export const __wbg_rendersession_free: (a: number, b: number) => void;
8
+ export const document_cardCount: (a: number) => number;
8
9
  export const document_cards: (a: number) => number;
9
10
  export const document_clone: (a: number) => number;
11
+ export const document_equals: (a: number, b: number) => number;
10
12
  export const document_fromMarkdown: (a: number, b: number, c: number) => void;
11
13
  export const document_insertCard: (a: number, b: number, c: number, d: number) => void;
12
14
  export const document_main: (a: number) => number;
@@ -88,6 +88,17 @@ export class Document {
88
88
  * history of either handle.
89
89
  */
90
90
  clone(): Document;
91
+ /**
92
+ * Structural equality against another `Document`.
93
+ *
94
+ * Compares `main` and `cards` by value (matching core's [`PartialEq`]).
95
+ * Parse-time `warnings` are intentionally excluded — they describe the
96
+ * source text, not the document's content.
97
+ *
98
+ * Use this to debounce upstream prop updates: keep the last parsed
99
+ * `Document` and compare instead of re-parsing on every keystroke.
100
+ */
101
+ equals(other: Document): boolean;
91
102
  /**
92
103
  * Parse markdown into a typed Document.
93
104
  *
@@ -228,6 +239,13 @@ export class Document {
228
239
  * Mutators never modify `warnings`.
229
240
  */
230
241
  updateCardField(index: number, name: string, value: any): void;
242
+ /**
243
+ * Number of composable cards (excludes the main card).
244
+ *
245
+ * O(1). Use this to validate indices before calling card mutators
246
+ * instead of allocating the full `cards` array.
247
+ */
248
+ readonly cardCount: number;
231
249
  /**
232
250
  * Ordered list of composable card blocks as typed `Card` objects.
233
251
  */
package/node-esm/wasm.js CHANGED
@@ -33,6 +33,17 @@ export class Document {
33
33
  const ptr = this.__destroy_into_raw();
34
34
  wasm.__wbg_document_free(ptr, 0);
35
35
  }
36
+ /**
37
+ * Number of composable cards (excludes the main card).
38
+ *
39
+ * O(1). Use this to validate indices before calling card mutators
40
+ * instead of allocating the full `cards` array.
41
+ * @returns {number}
42
+ */
43
+ get cardCount() {
44
+ const ret = wasm.document_cardCount(this.__wbg_ptr);
45
+ return ret >>> 0;
46
+ }
36
47
  /**
37
48
  * Ordered list of composable card blocks as typed `Card` objects.
38
49
  * @returns {Card[]}
@@ -54,6 +65,23 @@ export class Document {
54
65
  const ret = wasm.document_clone(this.__wbg_ptr);
55
66
  return Document.__wrap(ret);
56
67
  }
68
+ /**
69
+ * Structural equality against another `Document`.
70
+ *
71
+ * Compares `main` and `cards` by value (matching core's [`PartialEq`]).
72
+ * Parse-time `warnings` are intentionally excluded — they describe the
73
+ * source text, not the document's content.
74
+ *
75
+ * Use this to debounce upstream prop updates: keep the last parsed
76
+ * `Document` and compare instead of re-parsing on every keystroke.
77
+ * @param {Document} other
78
+ * @returns {boolean}
79
+ */
80
+ equals(other) {
81
+ _assertClass(other, Document);
82
+ const ret = wasm.document_equals(this.__wbg_ptr, other.__wbg_ptr);
83
+ return ret !== 0;
84
+ }
57
85
  /**
58
86
  * Parse markdown into a typed Document.
59
87
  *
Binary file
@@ -5,8 +5,10 @@ export const __wbg_document_free: (a: number, b: number) => void;
5
5
  export const __wbg_quill_free: (a: number, b: number) => void;
6
6
  export const __wbg_quillmark_free: (a: number, b: number) => void;
7
7
  export const __wbg_rendersession_free: (a: number, b: number) => void;
8
+ export const document_cardCount: (a: number) => number;
8
9
  export const document_cards: (a: number) => number;
9
10
  export const document_clone: (a: number) => number;
11
+ export const document_equals: (a: number, b: number) => number;
10
12
  export const document_fromMarkdown: (a: number, b: number, c: number) => void;
11
13
  export const document_insertCard: (a: number, b: number, c: number, d: number) => void;
12
14
  export const document_main: (a: number) => number;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@quillmark/wasm",
3
- "version": "0.65.1",
3
+ "version": "0.66.0",
4
4
  "description": "WebAssembly bindings for quillmark",
5
5
  "type": "module",
6
6
  "license": "MIT OR Apache-2.0",