diff --git a/docs/index.html b/docs/index.html
index 7367112..df3a0a1 100644
--- a/docs/index.html
+++ b/docs/index.html
@@ -365,14 +365,15 @@ footer { border-top: 1px solid var(--border); padding-block: 2.5rem; color: var(
Diagnosability
- The 0.3.0 release exists because of this. A mapping layer that loses your data and reports
+ The 0.3.0 release existed because of this. A mapping layer that loses your data and reports
success is worse than one that stops, so every silent failure found in the engine was turned
into an error that names the cause and the way out.
cereale reads the metadata that only a standard decorator transform emits, so
- which compiler you use decides whether it works at all. The three โ rows are executed by a
+ which compiler you use decides whether it works at all. The three โ rows in the first table are
+ executed by a
test on every CI run rather than asserted here โ each one compiles a decorated class with
that tool and checks the metadata arrived. The โ row cannot be: oxc ships inside a native
binary with no standalone transform API, so it was established by hand, and the plugin below
@@ -678,7 +681,7 @@ Break the cycle with @JsonIgnore() on the back-reference, or supply a
- Each of these was set up and run before it was written down.
+ Each of these was set up and run before it was written down, on 2026-08-05, against the
+ versions listed.
FRAMEWORKS.md
has the full recipe for every one, including the two that need the precompiled route.
Getting started not on npm yet installing it today
+
+ If you are using a bundler, do not use it. It is the whole library in one
+ file, so nothing can be dropped from it. The default entry point tree-shakes; this one
+ cannot, because there is nothing left to shake.
+ Bundle size
+ Sixty-eight decorators is a lot to ship to a browser, so none of the ones you did not
+ import are shipped. Minified bytes, measured through all three bundlers.
+
+ Import
+ Every rule is a top-level call. rollup proves such a call side-effect-free by reading
+ the factory; esbuild and webpack will not. Without a
+
+ It was already producing 1,823 bytes and hid the problem. That is the argument for
+ measuring through more than one bundler, and it is why
+ a test
+ now pins the property rather than the prose.
+ Nothing fails quietly
The toolchain cost, stated plainly
- Transformer Works Setting
+ tscโ experimentalDecorators: false, target: ES2022+tsc 5.2+โ experimentalDecorators: false, target: ES2022+esbuild โ experimentalDecorators: false via tsconfigRaw, plus esbuild's own top-level target: es2022 โ its default esnext leaves the decorators in placeswc โ jsc.transform.decoratorVersion: "2022-03"
@@ -701,15 +704,16 @@ Break the cycle with @JsonIgnore() on the back-reference, or supply a
oxc โ used by Vite 8 and Vitest 4 โ see below Angular 21 โ Flip the scaffolded experimentalDecorators to false โ Angular does not need it
- React, Vue, Svelte… โ Any Vite 8 app โ add the plugin below
+ Bun โ Nothing Bun 1.3 โ Nothing Node + tscโ Just the flag
- Next.js 16 ~ Not inline โ keep models in a package compiled by tsc
+ NestJS 11 ~ Not inline โ its DI needs emitDecoratorMetadata; same precompiled routeNestJS 11.1 ~ Not inline โ its DI needs emitDecoratorMetadata; same precompiled routeTwo settings, and one caveat
+ Two settings, one caveat, and two ways in
git clone https://github.com/Avalon-Vanguard/cereale
+
+npm install ../cereale/cereale-0.4.0.tgzgit clone https://github.com/avalon-vanguard/cereale
cd cereale
npm install && npm run build
-npm pack # โ cereale-0.3.0.tgz
+npm pack # โ cereale-0.4.0.tgz
# then, from your own project
-npm install ../cereale/cereale-0.3.0.tgznpm install cereale does not resolve to
@@ -784,6 +788,95 @@ npm install ../cereale/cereale-0.3.0.tgz
No bundler at all
+ cereale/min is the whole library flattened into one
+ minified ES module โ 33.9 KB, 9.6 KB gzipped โ for import maps,
+ a bare <script type="module">, Deno and Workers.
+
+ <script type="importmap">
+ { "imports": { "cereale": "./node_modules/cereale/dist/cereale.min.js" } }
+</script>
+<script type="module">
+ import { IsString, toInstanceSync } from 'cereale';
+</script>You pay for the decorators you name
+
+
+
+
+
+
+ What you import
+ esbuild rollup webpack
+
+ flattenErrors394 367 394
+ one decorator 1,837 1,823 1,818
+ validateSync3,722 3,554 3,738
+ toPlainSync7,744 7,769 7,771
+ toInstanceSync7,900 7,942 7,944
+ a typical DTO 10,395 10,402 10,360
+
+ the whole library 26,266 25,671 26,879 Reading and writing drop independently
+ toInstanceSync and you do not pay for the
+ serializer. The validator stays in both, because
+ validate defaults to
+ true โ a real reference, not a missed optimisation.
+ It did not come for free
+ /*#__PURE__*/ on each, one decorator cost
+ 4,909 bytes instead of 1,837. Nothing failed โ the library was just
+ three times heavier in every bundle, and the only way to find out was to measure.
+ rollup alone would have shown nothing
+
0.3.0 lives in the repository. npm install cereale does not
+
0.4.0 lives in the repository. npm install cereale does not
resolve to this library โ build it from source until it is published.