| # comment-parser | |
| `comment-parser` is a library helping to handle Generic JSDoc-style comments. It is | |
| - **language-agnostic** – no semantics enforced. You decide what tags are and what they mean. And it can be used with any language supporting `/** */` source comments. | |
| - **no dependencies** – it is compact and environment-agnostic, can be run on both the server and browser sides | |
| - **highly customizable** – with a little code you can deeply customize how comments are parsed | |
| - **bidirectional** - you can write comment blocks back to the source after updating or formatting | |
| - **strictly typed** - comes with generated `d.ts` data definitions since written in TypeScript | |
| ```sh | |
| npm install comment-parser | |
| ``` | |
| > 💡 Check out the [Playground](https://syavorsky.github.io/comment-parser) | |
| > 💡 Previous version lives in [0.x](https://github.com/syavorsky/comment-parser/tree/0.x) branch | |
| Lib mainly provides two pieces [Parser](#Parser) and [Stringifier](#Stringifier). | |
| ## Parser | |
| Let's go over string parsing: | |
| ```js | |
| const { parse } = require('comment-parser/lib') | |
| const source = ` | |
| /** | |
| * Description may go | |
| * over few lines followed by @tags | |
| * @param {string} name the name parameter | |
| * @param {any} value the value of any type | |
| */` | |
| const parsed = parse(source) | |
| ``` | |
| Lib source code is written in TypeScript and all data shapes are conveniently available for your IDE of choice. All types described below can be found in [primitives.ts](src/primitives.ts) | |
| The input source is first parsed into lines, then lines split into tokens, and finally, tokens are processed into blocks of tags | |
| ### Block | |
| ```js | |
| /** | |
| * Description may go | |
| * over multiple lines followed by @tags | |
| * @param {string} name the name parameter | |
| * @param {any} value the value parameter | |
| */ | |
| ``` | |
| ### Description | |
| ```js | |
| /** | |
| * Description may go | |
| * over multiple lines followed by @tags | |
| ``` | |
| ### Tags | |
| ```js | |
| * @param {string} name the name parameter | |
| ``` | |
| ```js | |
| * @param {any} value the value parameter | |
| */ | |
| ``` | |
| ### Tokens | |
| ``` | |
| |line|start|delimiter|postDelimiter|tag |postTag|name |postName|type |postType|description |end| | |
| |----|-----|---------|-------------|------|-------|-----|--------|--------|--------|--------------------------------|---| | |
| | 0|{2} |/** | | | | | | | | | | | |
| | 1|{3} |* |{1} | | | | | | |Description may go | | | |
| | 2|{3} |* |{1} | | | | | | |over few lines followed by @tags| | | |
| | 3|{3} |* |{1} |@param|{1} |name |{1} |{string}|{1} |the name parameter | | | |
| | 4|{3} |* |{1} |@param|{1} |value|{1} |{any} |{1} |the value of any type | | | |
| | 5|{3} | | | | | | | | | |*/ | | |
| ``` | |
| ### Result | |
| The result is an array of Block objects, see the full output on the [playground](https://syavorsky.github.io/comment-parser) | |
| ```js | |
| [{ | |
| // uppper text of the comment, overall block description | |
| description: 'Description may go over multiple lines followed by @tags', | |
| // list of block tags: @param, @param | |
| tags: [{ | |
| // tokens.tag without "@" | |
| tag: 'param', | |
| // unwrapped tokens.name | |
| name: 'name', | |
| // unwrapped tokens.type | |
| type: 'string', | |
| // true, if tokens.name is [optional] | |
| optional: false, | |
| // default value if optional [name=default] has one | |
| default: undefined, | |
| // tokens.description assembled from a siongle or multiple lines | |
| description: 'the name parameter', | |
| // problems occured while parsing this tag section, subset of ../problems array | |
| problems: [], | |
| // source lines processed for extracting this tag, "slice" of the ../source item reference | |
| source: [ ... ], | |
| }, ... ], | |
| // source is an array of `Line` items having the source | |
| // line number and `Tokens` that can be assembled back into | |
| // the line string preserving original formatting | |
| source: [{ | |
| // source line number | |
| number: 1, | |
| // source line string | |
| source: "/**", | |
| // source line tokens | |
| tokens: { | |
| // indentation | |
| start: "", | |
| // delimiter, either '/**', '*/', '*', or ''. Mid lines may have no delimiters | |
| delimiter: "/**", | |
| // space between delimiter and tag | |
| postDelimiter: "", | |
| // tag starting with "@" | |
| tag: "", | |
| // space between tag and type | |
| postTag: "", | |
| // name with no whitespaces or "multiple words" wrapped into quotes. May occure in [name] and [name=default] forms | |
| name: "", | |
| // space between name and type | |
| postName: "", | |
| // type is has to be {wrapped} into curlies otherwise will be omitted | |
| type: "", | |
| // space between type and description | |
| postType: "", | |
| // description is basicaly rest of the line | |
| description: "", | |
| // closing */ marker if present | |
| end: "" | |
| } | |
| }, ... ], | |
| // problems occured while parsing the block | |
| problems: [], | |
| }]; | |
| ``` | |
| While `.source[].tokens` are not providing readable annotation information, they are essential for tracing data origins and assembling string blocks with `stringify` | |
| ### options | |
| ```ts | |
| interface Options { | |
| // start count for source line numbers | |
| startLine: number; | |
| // escaping chars sequence marking wrapped content literal for the parser | |
| fence: string; | |
| // block and comment description compaction strategy | |
| spacing: 'compact' | 'preserve'; | |
| // tokenizer functions extracting name, type, and description out of tag, see Tokenizer | |
| tokenizers: Tokenizer[]; | |
| } | |
| ``` | |
| examples | |
| - [default config](https://syavorsky.github.io/comment-parser/#parse-defaults) | |
| - [line numbers control](https://syavorsky.github.io/comment-parser/#parse-line-numbering) | |
| - [description spacing](https://syavorsky.github.io/comment-parser/#parse-spacing) | |
| - [escaping](https://syavorsky.github.io/comment-parser/#parse-escaping) | |
| - [explore the origin source](https://syavorsky.github.io/comment-parser/#parse-source-exploration) | |
| [suggest more examples](https://github.com/syavorsky/comment-parser/issues/new?title=example+suggestion%3A+...&labels=example,parser) | |
| ## Stringifier | |
| The stringifier is an important piece used by other tools updating the source code. It goes over `Block.source[].tokens` items and assembles them back to the string. It might be used with various transforms applied before stringifying. | |
| ```js | |
| const { parse, stringify, transforms: {flow, align, indent} } = require('comment-parser'); | |
| const source = ` | |
| /** | |
| * Description may go | |
| * over multiple lines followed by @tags | |
| * | |
| * @my-tag {my.type} my-name description line 1 | |
| description line 2 | |
| * description line 3 | |
| */`; | |
| const parsed = parse(source); | |
| const transform = flow(align(), indent(0)) | |
| console.log(stringify(transform(parsed[0]))); | |
| ``` | |
| ### Result | |
| ```js | |
| /** | |
| * Description may go | |
| * over multiple lines followed by @tags | |
| * | |
| * @my-tag {my.type} my-name description line 1 | |
| description line 2 | |
| * description line 3 | |
| */ | |
| ``` | |
| examples | |
| - [format comments](https://syavorsky.github.io/comment-parser/#stringify-formatting) | |
| [suggest more examples](https://github.com/syavorsky/comment-parser/issues/new?title=example+suggestion%3A+...&labels=example,stringifier) | |
| ## Migrating from 0.x version | |
| Code of pre-1.0 version is forked into [0.x](https://github.com/syavorsky/comment-parser/tree/0.x) and will phase out eventually. Please file the issue if you find some previously existing functionality can't be achieved with 1.x API. Check out [migration notes](migrate-1.0.md). |