| # CLAUDE.md |
| |
| This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository. |
| |
| ## Commands |
| |
| ```bash |
| npm run build # Compile TypeScript → es6/, lib/ (CommonJS), browser/ |
| npm test # Prettier check + Jest (also runs build first via pretest) |
| npm run format # Auto-fix formatting with Prettier |
| ``` |
| |
| Run a single test file: |
| ```bash |
| npm test -- tests/unit/parser.spec.ts |
| ``` |
| |
| Run tests matching a pattern: |
| ```bash |
| npm test -- --testNamePattern "block with tags" |
| ``` |
| |
| ## Architecture |
| |
| `comment-parser` is a zero-dependency JSDoc comment parser. It converts `/** */` comment strings into structured data and back (bidirectional). |
| |
| ### Parse pipeline |
| |
| ``` |
| raw source string |
| → source-parser (splits into Line[] with Tokens per line) |
| → block-parser (groups lines into description block + tag sections) |
| → spec-parser (runs tokenizers on each tag section → Spec[]) |
| → Block[] |
| ``` |
| |
| Each stage is independently configurable. The public `parse(source, options)` function wires them together. |
| |
| ### Key data types (`src/primitives.ts`) |
| |
| - **`Block`** — one `/** */` comment; has `description`, `tags` (Spec[]), `source` (Line[]), `problems` |
| - **`Spec`** — one `@tag`; has `tag`, `type`, `name`, `optional`, `default`, `description`, `source` |
| - **`Line`** — a raw source line with its `tokens` |
| - **`Tokens`** — fine-grained breakdown of a line: `start`, `delimiter`, `postDelimiter`, `tag`, `postTag`, `type`, `postType`, `name`, `postName`, `description`, `end`, `lineEnd` |
| |
| ### Module layout |
| |
| | Directory | Responsibility | |
| |-----------|---------------| |
| | `src/parser/` | `index.ts` (factory), `source-parser.ts`, `block-parser.ts`, `spec-parser.ts` | |
| | `src/parser/tokenizers/` | `tag.ts`, `type.ts`, `name.ts`, `description.ts` — each extracts one Tokens field | |
| | `src/stringifier/` | Converts Block/Tokens back to source string; `inspect.ts` for debugging | |
| | `src/transforms/` | Post-parse transformations: `align`, `indent`, `crlf`, composed via `flow` | |
| | `src/util.ts` | `seedBlock`, `seedTokens`, `rewireSpecs`, `rewireSource` helpers | |
| |
| ### Customization points |
| |
| Tokenizers and the source-line parser are injected via options, so callers can override any parsing step. Transforms are pure functions composed with `transforms.flow(...)`. |
| |
| ### Build outputs |
| |
| - `es6/` — ES modules (primary dev target, what `exports["."]` points to for ESM consumers) |
| - `lib/` — CommonJS (`.cjs` extensions, generated by `convert-extension`) |
| - `browser/` — IIFE bundle via Rollup |
| |
| ## Playground |
| |
| The live demo at `https://syavorsky.github.io/comment-parser` is hosted in a separate public repo: `syavorsky/syavorsky.github.io`, under the `comment-parser/` directory. It is not auto-deployed from this repo — the bundled library is updated manually. |
| |
| To update the playground to a new version, in the `syavorsky/syavorsky.github.io` repo: |
| |
| ```bash |
| cd syavorsky.github.io |
| ./comment-parser/upgrade.sh <version> # e.g. ./comment-parser/upgrade.sh 1.4.5 |
| ``` |
| |
| This script: |
| 1. Installs the specified version of `comment-parser` from npm |
| 2. Copies `browser/index.js` and `tests/e2e/examples.js` into `comment-parser/lib/` |
| 3. Updates `comment-parser/lib/VERSION` |
| 4. Updates the version label in `comment-parser/index.html` |
| 5. Commits `package.json`, `package-lock.json`, and `comment-parser/` |
| |
| ## Branching |
| |
| Always work on a dedicated branch, never directly on `main`: |
| |
| - **GitHub issue** → `issue-186/non-optional-defaults` |
| - **Bug without an issue** → `bug/short-description` |
| - **Feature without an issue** → `feature/short-description` |
| |
| ## Versioning & releases |
| |
| PRs **must** include a changeset file or carry the `skip-changeset` label (enforced by CI). |
| |
| `npm run release:add` is interactive and can't be automated. Instead, create the changeset file directly: |
| |
| ```bash |
| # .changeset/<random-name>.md |
| --- |
| 'comment-parser': patch |
| --- |
| |
| Description of the fix or change. |
| ``` |
| |
| Use `patch` for bug fixes, `minor` for new features, `major` for breaking changes. The filename can be anything unique (e.g. use a random word combo). |
| |
| Add the changeset file as a separate commit alongside the code changes. |
| |
| ### Full release flow |
| |
| ```bash |
| npm run release:version # bumps version, updates CHANGELOG, commits |
| npm run release:publish # publishes to npm, pushes tags |
| ``` |
| |
| After publishing, update the playground (see above). |
| |
| CI tests against Node 20, 22, and 24. |