{"_id":"@dornick/parsers","name":"@dornick/parsers","dist-tags":{"latest":"0.1.0"},"versions":{"0.1.0":{"name":"@dornick/parsers","version":"0.1.0","description":"File parser registry for Dornick. Lazy VFS sub-mounts under /user/files/<id>/parsed/*. Built-in CSV/JSON/text; companion packages add PDF, DOCX, XLSX, OCR, ML, audio.","type":"module","main":"./dist/index.js","module":"./dist/index.js","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"scripts":{"build":"tsup","dev":"tsup --watch","test":"vitest run","typecheck":"tsc --noEmit","clean":"rm -rf dist"},"dependencies":{"@dornick/capabilities":"0.1.0"},"devDependencies":{"tsup":"^8.3.0","typescript":"^5.5.4","vitest":"^4.1.7"},"license":"MIT","sideEffects":false,"publishConfig":{"access":"public"},"gitHead":"622e4ebed9c3aebadd808a2dd1f5f29c7d226040","_id":"@dornick/parsers@0.1.0","_nodeVersion":"26.7.0","_npmVersion":"11.19.0","dist":{"integrity":"sha512-PPqxNw8cQMtnoH44xCAiO0KlPd54f5xhftXEB/y/E6AfhfiFY1apn6HUZeH31ipn75wld98jfi8KWhxDmY5KIQ==","shasum":"4455add9524c88ef855ddd985df0b9555af3c91d","tarball":"https://registry.npmjs.org/@dornick/parsers/-/parsers-0.1.0.tgz","fileCount":5,"unpackedSize":40687,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIEFrAW17rYS0lWovlEy+QVeUJk+uJHezy5wSPO/uwpLDAiBR9Ri5/b7yf6a/9jamFLFQW3qWhRd4PP/wmky6d3LL8g=="}]},"_npmUser":{"name":"dipankarsarkar","email":"me@dipankar.name"},"directories":{},"maintainers":[{"name":"dipankarsarkar","email":"me@dipankar.name"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/parsers_0.1.0_1788784929117_0.27636512967751536"},"_hasShrinkwrap":false}},"time":{"created":"2026-09-07T12:42:08.985Z","0.1.0":"2026-09-07T12:42:09.294Z","modified":"2026-09-07T12:42:09.545Z"},"maintainers":[{"name":"dipankarsarkar","email":"me@dipankar.name"}],"description":"File parser registry for Dornick. Lazy VFS sub-mounts under /user/files/<id>/parsed/*. Built-in CSV/JSON/text; companion packages add PDF, DOCX, XLSX, OCR, ML, audio.","license":"MIT","readme":"# @dornick/parsers\n\n**File parser registry for Dornick — lazy VFS sub-mounts under `/user/files/<id>/parsed/*`.**\n\nEach parser materialises text or structured artifacts from an uploaded file. They register with a `ParserRegistry`; reads against `/user/files/<id>/parsed/<sub>` look up the matching parser and run it on demand, caching the result. WASM dependencies inside companion packages (`@dornick/parsers-pdf`, `@dornick/parsers-office`, `@dornick/parsers-ocr`, `@dornick/parsers-ml`, `@dornick/parsers-audio`) load only when first accessed.\n\n[![npm](https://img.shields.io/npm/v/@dornick/parsers.svg?style=flat&color=4c1)](https://www.npmjs.com/package/@dornick/parsers)\n[![bundle](https://img.shields.io/bundlephobia/minzip/@dornick/parsers?label=gzipped&style=flat&color=4c1)](https://bundlephobia.com/package/@dornick/parsers)\n[![license](https://img.shields.io/npm/l/@dornick/parsers.svg?style=flat&color=blue)](../../LICENSE)\n\n## Install\n\n```sh\nnpm i @dornick/parsers\n```\n\nCapability-aware via a peer of `@dornick/capabilities`.\n\n## Built-in parsers\n\nThree batteries-included parsers ship in this package:\n\n| Parser | Matches | Produces |\n|---|---|---|\n| `textParser` | `.txt`, `.md`, `.log`, `.yaml`, anything `text/*` | `text.txt` |\n| `jsonParser` | `.json`, `application/json` | `pretty.json`, `summary.txt` |\n| `csvParser` | `.csv`, `.tsv`, `text/csv` | `rows.jsonl`, `summary.txt` |\n\nThe CSV parser handles RFC 4180-style quoting + escaped quotes + multi-line cells, without any runtime dependency.\n\n## Use\n\n```ts\nimport { Dornick } from \"@dornick/core\";\nimport { ParserRegistry, BUILTIN_PARSERS } from \"@dornick/parsers\";\n\nconst parsers = new ParserRegistry(dornick.capabilities);\nfor (const p of BUILTIN_PARSERS) parsers.add(p);\n\n// Pass via DornickOptions (planned wiring in @dornick/core)\nnew Dornick({ config, transport, parsers });\n```\n\nThe model then reads `/user/files/<id>/parsed/rows.jsonl` (CSV), `/parsed/text.txt` (plain text), etc. Companion parser packages slot in identically:\n\n```ts\nimport { pdfTextParser } from \"@dornick/parsers-pdf\";   // future package\nimport { mammothParser, xlsxParser } from \"@dornick/parsers-office\";\nparsers.add(pdfTextParser);\nparsers.add(mammothParser);\nparsers.add(xlsxParser);\n```\n\n## Define your own\n\n```ts\nimport { defineSkill } from \"@dornick/skills\";   // unrelated — for context\nimport type { FileParser } from \"@dornick/parsers\";\n\nexport const exifParser: FileParser = {\n  name: \"exif\",\n  description: \"Read EXIF metadata from JPEG/PNG uploads.\",\n  requires: [\"wasm\"],                          // capability gate\n  matches: (file) => file.mimeType.startsWith(\"image/\"),\n  paths: () => [\"exif.json\"],\n  parse: async (file, sub) => {\n    if (sub !== \"exif.json\") throw new Error(`exif does not produce ${sub}`);\n    const { extractExif } = await import(\"./_lazy/exif.js\");\n    return JSON.stringify(await extractExif(file.base64), null, 2);\n  },\n};\n```\n\nTwo rules:\n\n1. **Be lazy** — dynamic-import any heavy dependency inside `parse()`, not at module load.\n2. **Declare your gate** — list every required `BrowserCapabilities` dot-path in `requires`. The registry filters you out on browsers that can't run you.\n\n## Capability gating\n\n`ParserRegistry.lookup` and `ParserRegistry.paths` consult the registry's `CapabilityRegistry`. A parser declaring `requires: [\"webgpu\", \"crossOriginIsolated\"]` simply doesn't appear in `paths()` output or `read()` resolution on a browser without WebGPU. The model never sees an affordance that can't run.\n\n## Links\n\n- [Concept: Parsers](https://docs.neullabs.com/dornick/concepts/parsers/)\n- [Repo & root README](https://github.com/neul-labs/dornick)\n\n## License\n\nMIT — © Dipankar Sarkar\n","readmeFilename":"README.md","_rev":"1-6f2edc0e2f47af23ad064de20f79c445"}