# Deployment Plan (Multi-Stage)
Each stage is independently shippable — don't wait for the whole list to do stage 1.
## Stage 1 — GitHub (source of truth)
- Public repo `codinglombok/LombokTableSheet`, Apache-2.0 `LICENSE`, branch protection on `main`.
- `.github/workflows/ci.yml` (included in this scaffold): install → typecheck → test → build on every PR.
- Tag releases `vX.Y.Z`; GitHub Releases auto-generated from conventional commits / changelog.
## Stage 2 — npm
```bash
npm login
npm publish --access public
```
- `package.json` already sets `"files"`, `"main"`, `"types"`, `"license": "Apache-2.0"`.
- Use `npm version patch|minor|major` + `npm publish` per release; CI can automate this on tag push.
## Stage 3 — unpkg / jsDelivr (CDN, zero-install usage)
Nothing to deploy — both CDNs mirror npm automatically once published.
**Import the subpaths you need, not `dist/index.js`.** The package barrel
re-exports the XLSX codec, which reaches `formats/zip.js` and its
`import { deflateRawSync } from 'node:zlib'`. A browser cannot resolve that
specifier, so importing the barrel makes the entire module graph fail to load —
the page renders nothing, and the only clue is a console error. This is not
hypothetical: it is what broke the Pages demo.
```html
```
The size guards in the CSV, JSON and HTML decoders used to call
`Buffer.byteLength()` — a Node global — and threw "Buffer is not defined" in a
browser even though they import nothing from `node:`. They now use an internal
`utf8ByteLength()` helper. `scripts/verify-pages-site.mjs` walks the reachable
module graph on every Pages build and fails if a `node:` import *or* a Node-only
global creeps back in, so this list stays honest.
Browser-safe today: `formats/csv.js`, `formats/json.js`, `formats/html.js`,
`adapters/dom.js`, `adapters/sheet.js`, `core/model.js`, `core/formula.js`,
`core/splitMerge.js`, `templates/registry.js`, `i18n/`, `plugins/`, `stats/`,
`engine/`. Node-only: `formats/zip.js` and `formats/xlsx.js` (which imports it),
and therefore `index.js` as well.
Bundlers (Vite, webpack, esbuild) are unaffected — they resolve `node:zlib`
through their own polyfill or externals configuration. Only direct
`