@quillmark/wasm 0.86.0 → 0.87.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/CHANGELOG.md CHANGED
@@ -1,5 +1,107 @@
1
1
  # Changelog
2
2
 
3
+ ## v0.87.0 - 2026-06-01
4
+
5
+ Arrays become first-class typed fields via a required `items` element
6
+ schema, datetime is unified under a single `type: datetime` accepting the
7
+ full YAML-1.1-style timestamp range (`FieldType::Date` is gone), and object
8
+ zero values are now shape-valid. This release tightens schema-load
9
+ validation in several places — empty `properties` maps and deeper array
10
+ nesting are now rejected — and consolidates the example/default conformance
11
+ checks behind one shared primitive. Documentation now ships from GitHub
12
+ Pages instead of Read the Docs.
13
+
14
+ ### Breaking changes
15
+
16
+ These are schema-load cutovers for `Quill.yaml` authors; full before/after
17
+ steps are in `docs/migrations/0.86-to-0.87.md`.
18
+
19
+ - **Array fields now require an `items` element schema** (#672). Arrays
20
+ previously carried a single untyped `Array` type; scalar arrays were
21
+ never coerced or validated element-wise and were always annotated
22
+ `array<string>`. Every array field must now declare `items`, and schema
23
+ load rejects arrays without it. The bare-`properties`-on-an-array form
24
+ (the old "typed table") is **removed** in favor of
25
+ `items: { type: object, properties: … }`. Migration for a typed table:
26
+
27
+ ```yaml
28
+ # before
29
+ rows:
30
+ type: array
31
+ properties: { name: { type: string }, qty: { type: integer } }
32
+ # after
33
+ rows:
34
+ type: array
35
+ items:
36
+ type: object
37
+ properties: { name: { type: string }, qty: { type: integer } }
38
+ ```
39
+
40
+ A scalar array adds `items` directly, e.g.
41
+ `counts: { type: array, items: { type: integer } }`. Elements now coerce
42
+ and validate against `items` (failing at the indexed path, e.g.
43
+ `counts[1]`), and blueprint annotations reflect the element type
44
+ (`array<integer>`, `array<markdown>`, …). Bundled quills and the
45
+ `usaf_memo` golden schema are migrated.
46
+ - **`FieldType::Date` removed; use `type: datetime`** (#679). `type: date`
47
+ no longer exists. `type: datetime` now accepts the full range from a bare
48
+ `YYYY-MM-DD` date through RFC 3339 with offset (seconds optional, `T` or
49
+ space separator). Datetime values gain calendar validation (e.g. Feb 30
50
+ is now rejected), and JSON Schema output emits `format: date-time` for
51
+ all datetime fields. The WASM `FieldType` union drops `"date"`. The
52
+ blueprint hint is now `datetime<YYYY-MM-DD[Thh:mm:ss]>`.
53
+ - **Empty `properties: {}` on an object field is rejected** (#678). An
54
+ empty properties map carries no information (the only conforming value is
55
+ `{}`) and is almost always a mistake. It is now treated like a missing
56
+ `properties` key and surfaces `quill::object_empty_properties`.
57
+ - **Deeper array nesting is rejected** (#673). The documented "one level of
58
+ nesting" contract is now enforced in a single recursive pass, closing a
59
+ gap where `array<object<array>>` and `object<array>` were silently
60
+ accepted. A typed table row and a typed dictionary may carry scalar
61
+ columns/properties only; deeper shapes fail with
62
+ `quill::nested_array_not_supported`.
63
+
64
+ ### Behavioral changes
65
+
66
+ - **Object zero values are now shape-valid** (#677). `zero_value` returned
67
+ a bare `{}` for every object field, which failed validation on any object
68
+ with `properties` (each absent property reported as `MustFillUnset`), so
69
+ the zero-filled render path broke for object fields. An object with
70
+ `properties` now recurses, zero-filling each property to its own
71
+ type-empty leaf. `{}` remains the zero only for the property-less edge
72
+ case.
73
+ - **`example:` values are now validated** (#680). The conformance check for
74
+ `example`/`default` literals recurses into array items and object
75
+ properties and validates datetime format — capabilities the old
76
+ load-time path lacked, so previously-unvalidated `example:` values are
77
+ now caught.
78
+
79
+ ### Documentation & infrastructure
80
+
81
+ - **Docs hosting moved from Read the Docs to GitHub Pages** (#671). A new
82
+ `docs.yml` workflow builds MkDocs (strict build as a PR check) and
83
+ deploys to Pages on a published release; RCs are skipped. `.readthedocs.yaml`
84
+ is removed and homepage/User Guide links point at the Pages URL.
85
+ - **Canon + docs: partial documents are first-class citizens** (#670). The
86
+ docs and binding READMEs no longer claim Must Fill fields must be supplied
87
+ before shipping. The only hard render gate is well-formedness (values
88
+ coerce, no surviving `<must-fill>` sentinel); completeness is a hint
89
+ surfaced by the form view. The `format-designer/` docs tree is renamed to
90
+ `quills/`.
91
+ - A Migration section overview page was added and wired into the nav (#674).
92
+
93
+ ### Internal
94
+
95
+ - Example/default validation is consolidated behind a single
96
+ `validate_schema_literal` conformance core shared by `quillmark-core`
97
+ config loading and the CLI `validate` command, with author-friendly
98
+ diagnostics preserved (#680).
99
+ - Array and markdown handling collapse into recursive passes over the
100
+ schema in both schema-shape validation and the Typst markdown transform
101
+ (#673).
102
+ - Doc/comment fixes from the array-items review (#675).
103
+
104
+
3
105
  ## v0.86.0 - 2026-05-31
4
106
 
5
107
  Documents now render even when incomplete, the canonical card-yaml fence
package/README.md CHANGED
@@ -249,10 +249,11 @@ canvas.style.height = `${result.layoutHeight}px`;
249
249
  A field's *cell* is inferred from whether its schema declares a `default:`:
250
250
 
251
251
  - **Must Fill** (no `default:`) — `quill.blueprint` renders `<must-fill>`
252
- in the value cell, and `quill.render(doc)` throws with
253
- `validation::must_fill_absent` when the field is absent at
254
- validate time, or `validation::must_fill_sentinel` when the
255
- `<must-fill>` sentinel survives into the document.
252
+ in the value cell. An absent Must Fill field is a non-fatal signal
253
+ (`validation::must_fill_absent`) the render path zero-fills it
254
+ silently. A surviving `<must-fill>` sentinel is fatal
255
+ (`validation::must_fill_sentinel`). Partial documents are
256
+ first-class; `quill.render(doc)` only throws for malformed input.
256
257
  - **Endorsed** (with `default:`) — `quill.blueprint` renders the
257
258
  default value followed by a `; delete-ok` annotation, and the default
258
259
  is used when the document omits the field.
package/bundler/wasm.d.ts CHANGED
@@ -117,7 +117,7 @@ export interface QuillCardBody {
117
117
  * field). There is no separate `required` axis.
118
118
  */
119
119
  export interface QuillFieldSchema {
120
- type: "string" | "number" | "integer" | "boolean" | "array" | "object" | "date" | "datetime" | "markdown";
120
+ type: "string" | "number" | "integer" | "boolean" | "array" | "object" | "datetime" | "markdown";
121
121
  description?: string;
122
122
  default?: unknown;
123
123
  example?: unknown;
Binary file
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@quillmark/wasm",
3
- "version": "0.86.0",
3
+ "version": "0.87.0",
4
4
  "description": "WebAssembly bindings for quillmark",
5
5
  "type": "module",
6
6
  "license": "MIT OR Apache-2.0",