📛 docs: badges on the README, and an install section that tells the truth

Five badges under the title: CI and Docs are live workflow badges (the Docs
one links to the deployed site), and Node, TypeScript and MIT are static,
tinted the brand brown from the landing page rather than shields' defaults.
No npm badge yet — the package is not on the registry, and a badge that
renders "not found" is worse than none. It gets added with the first publish.

The real fix hiding under the badges: Installation led with `npm install
cereale`, which does not resolve to this library — the name is unclaimed.
The section now says so and gives the clone/pack/install route the landing
page has carried since 0.4.0. Also synced the pins the page got and the
README missed (tsc 5.2+, Bun 1.3, NestJS 11.1), and the line describing the
docs site as "served from docs/ on main" now describes the Actions
deployment that replaced branch serving.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SAcqrz3FcadkYr3xG32CjK
This commit is contained in:
Claude
2026-08-20 14:10:35 +00:00
parent 73f0b88997
commit 41ea03f09b
+23 -6
View File
@@ -1,5 +1,11 @@
# Cereale # Cereale
[![CI](https://github.com/avalon-vanguard/cereale/actions/workflows/ci.yml/badge.svg?branch=main)](https://github.com/avalon-vanguard/cereale/actions/workflows/ci.yml)
[![Docs](https://github.com/avalon-vanguard/cereale/actions/workflows/pages.yml/badge.svg)](https://avalon-vanguard.github.io/cereale/)
[![Node ≥20](https://img.shields.io/badge/node-%E2%89%A520-a0784a)](https://github.com/avalon-vanguard/cereale/blob/main/package.json)
[![TypeScript 5.2+](https://img.shields.io/badge/TypeScript-5.2%2B-a0784a)](https://github.com/avalon-vanguard/cereale#installation)
[![License: MIT](https://img.shields.io/badge/license-MIT-a0784a)](LICENSE)
**Validated domain objects, not validated data.** **Validated domain objects, not validated data.**
Cereale maps JSON onto your own classes and gives you back real instances — with your methods, Cereale maps JSON onto your own classes and gives you back real instances — with your methods,
@@ -28,8 +34,9 @@ user.greet(); // your methods are still there
**[avalon-vanguard.github.io/cereale](https://avalon-vanguard.github.io/cereale/)** — an **[avalon-vanguard.github.io/cereale](https://avalon-vanguard.github.io/cereale/)** — an
interactive playground that runs this library in your browser, the full decorator reference, interactive playground that runs this library in your browser, the full decorator reference,
and the toolchain matrix. The page has no third-party dependencies — no CDN, no analytics, no webfonts; the only thing it and the toolchain matrix. The page has no third-party dependencies — no CDN, no analytics, no webfonts; the only thing it
fetches is its own vendored compiler, and only when you first press Run. It is served from fetches is its own vendored compiler, and only when you first press Run. It deploys from
`docs/` on `main`, and `npm run build:docs` rebuilds its assets to open locally. `docs/` on `main` through Actions once CI is green, and `npm run build:docs` rebuilds its
assets to open locally.
## Where it fits ## Where it fits
@@ -72,8 +79,18 @@ entity, anything with behaviour attached. Reach for Zod when you just want the d
## Installation ## Installation
Not on npm yet: `npm install cereale` does **not** resolve to this library — the name is
unclaimed on the registry. Installing straight from GitHub will not work either, because the
build output is not committed. Until the first publish, install from a clone:
```bash ```bash
npm install cereale git clone https://github.com/avalon-vanguard/cereale
cd cereale
npm install && npm run build
npm pack # → cereale-0.4.0.tgz
# then, from your own project
npm install ../cereale/cereale-0.4.0.tgz
``` ```
Cereale uses **TC39 standard decorators** (since 0.2.0), so no `experimentalDecorators` flag: Cereale uses **TC39 standard decorators** (since 0.2.0), so no `experimentalDecorators` flag:
@@ -104,7 +121,7 @@ inside a native binary with no standalone transform API.
| Transformer | Status | Notes | | Transformer | Status | Notes |
| --- | --- | --- | | --- | --- | --- |
| `tsc` | ✅ | With `experimentalDecorators: false` and `target: ES2022`+ | | `tsc` 5.2+ | ✅ | With `experimentalDecorators: false` and `target: ES2022`+ |
| esbuild | ✅ | `experimentalDecorators: false` via `tsconfigRaw`, **plus** esbuild's own top-level `target: es2022`. Its default `esnext` target leaves decorator syntax in the output | | esbuild | ✅ | `experimentalDecorators: false` via `tsconfigRaw`, **plus** esbuild's own top-level `target: es2022`. Its default `esnext` target leaves decorator syntax in the output |
| swc | ✅ | `jsc.transform.decoratorVersion: "2022-03"` | | swc | ✅ | `jsc.transform.decoratorVersion: "2022-03"` |
| **oxc** | ❌ | Used by **Vite 8** and **Vitest 4** — see below | | **oxc** | ❌ | Used by **Vite 8** and **Vitest 4** — see below |
@@ -118,10 +135,10 @@ was written. The short version:
| --- | --- | --- | | --- | --- | --- |
| **Angular** 21 | ✅ | Flip the scaffolded `experimentalDecorators` to `false`. Angular does not need it — `ngtsc` erases its own decorators itself | | **Angular** 21 | ✅ | Flip the scaffolded `experimentalDecorators` to `false`. Angular does not need it — `ngtsc` erases its own decorators itself |
| **React, Vue, Svelte, Solid, Astro, Nuxt** | ✅ | Any Vite 8 app: add the `cereale/vite` plugin below | | **React, Vue, Svelte, Solid, Astro, Nuxt** | ✅ | Any Vite 8 app: add the `cereale/vite` plugin below |
| **Bun** | ✅ | No configuration | | **Bun** 1.3 | ✅ | No configuration |
| **Node** + `tsc` | ✅ | Just the flag | | **Node** + `tsc` | ✅ | Just the flag |
| **Next.js** 16 | ⚠️ | Not inline: it derives both the SWC parser *and* the transform from one flag, so decorators either compile legacy or fail to parse. Keep your models in a package compiled by `tsc` | | **Next.js** 16 | ⚠️ | Not inline: it derives both the SWC parser *and* the transform from one flag, so decorators either compile legacy or fail to parse. Keep your models in a package compiled by `tsc` |
| **NestJS** 11 | ⚠️ | Not inline: its DI needs `emitDecoratorMetadata`. Same precompiled-package route — verified working alongside `@Injectable()` in a program with both legacy flags on | | **NestJS** 11.1 | ⚠️ | Not inline: its DI needs `emitDecoratorMetadata`. Same precompiled-package route — verified working alongside `@Injectable()` in a program with both legacy flags on |
**If you are on Vite 8 or Vitest 4**, oxc leaves decorator syntax in the output without **If you are on Vite 8 or Vitest 4**, oxc leaves decorator syntax in the output without
reporting anything: `vitest` prints `0 test` next to a bare `SyntaxError`, and `vite build` reporting anything: `vitest` prints `0 test` next to a bare `SyntaxError`, and `vite build`