# 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 `