json-inline-doc
v2.0.1
Published
Add inline comments on stringified JSON (JSONC), or generate from JSON schema
Downloads
20
Readme
JSON Inline Doc
Add inline comments on stringified JSON (JSONC), or generate from JSON schema
Use case: Using JSON for configuration and provide inline documentation as comments for users.
JSONC is JSON with JavaScript style comments. Please note that original JSON does not support comments.
Installation:
npm install json-inline-docExample - Comments Generated from JSON Schema
import { SchemaMetadataWriter } from 'json-inline-doc';
// Create a writer with a schema
const w: SchemaMetadataWriter = new SchemaMetadataWriter({
"description": "Cluster Configuration",
"type": "object",
"properties": {
"name": {
"type": "string",
"description": "Cluster name"
}
},
"required": []
});
// The API is the same as JSON.stringify
w.stringify({ name: 'Sample Cluster' }, null, 4);Output:
/**
* @type object
* @description Cluster Configuration
*/
{
/**
* @type string
* @description Cluster name
*/
"name": "Sample Cluster"
}Example - Custom Comments
import { CustomCommentWriter } from 'json-inline-doc';
// Create a writer
const w: CustomCommentWriter = new CustomCommentWriter();
// Add custom comments to fields
w.addComments([], [{ type: 'line', content: 'test' }]);
w.addComments(['test'], [{ type: 'block', content: 'test2' }]);
w.addComments(['test', 1], [{ type: 'end', content: 'test3' }]);
w.addComments(['test', undefined, undefined], [{ type: 'line', content: 'test4' }]);
w.addComments(['test', undefined, 'test2'], [{ type: 'block', content: path => path.toString() }]);
// The API is the same as JSON.stringify
console.log(w.stringify({ test: [{ test2: 3 }, { test2: 4 }, 3, [5]] }, null, 4));Output:
// test
{
/**
* test2
*/
"test": [
{
/**
* test,0,test2
*/
"test2": 3
},
{
"test2": 4
}, // test3
3,
[
// test4
5
]
]
}For more detailed examples, please see the test cases.
API Documentation
All code is written in TypeScript which can be self-explanatory.
Writers
JSONCommentWriterBase
The abstract base class of all writers.
writer = new JSONCommentWriterBase(configuration)
- Note: The above line of code is only for explanation. This class is abstract - do not try to
newa instance by yourself! configuration: object (optional)emptyLineBeforeComments: boolean (default true)Add a blank line before every
blockandlinecomment, except comments of the followings:- The root object
- The first item in array
- The first key-value pair in object
Not supported if
spacewhen callingstringifyis 0.spaceAroundCommentSymbol: boolean (default true)Add space around '//', '/*' and '*/'. '/*' and '*/' will not be affected by this configuration if
styledBlockCommentis true.styledBlockComment: boolean (default true)Make block comment styled:
- Asterisk (' * ') at the beginning of each line
- The first line being '/**'
- The last line being ' */'
Not supported if
spacewhen callingstringifyis 0. (Except for comments of root object)maxLineLength: number (default 80)Maximum line length of each line of comment. Lines will be auto wrapped if exceeded. If any non-positive number is specified, auto wrapping will be disabled.
Not supported if
spacewhen callingstringifyis 0. (Except for comments of root object)
writer.stringify(value, replacer, space)
- Convert value to JSON string with comments.
- The signature is the same as
JSON.stringify - JSON stringify implementation is based on the following code: https://github.com/douglascrockford/JSON-js/blob/2a76286e00cdc1e98fbc9e9ec6589563a3a4c3bb/json2.js
CustomCommentWriter
A class of JSON comment writer which supports custom comments for fields specified by path.
writer = new CustomCommentWriter(configuration)
- Please refer to the constructor of JSONCommentWriterBase.
writer.addComments(selector, comments)
Add custom
commentsto fields specified byselector.selector: (string | number | undefined)[] (required)A path of keys.
undefinedcan be used to match any other key not matched on that level. An empty array matches the root object.comments: IJSONComment[] (required)Comments to be shown when the selector matches.
SchemaMetadataWriter
A class of JSON comment writer generating comments for fields specified in JSON schema.
writer = new SchemaMetadataWriter(schemaObject, commentGenerator, configuration)
Construct a new SchemaMetadataWriter.
schemaObject: JSONSchema (required)A fully dereferenced JSON schema object containing no
$ref, which can be obtained using libraries likejson-schema-ref-parser.dereferencewithcircularbeing true.This object is allowed to be recursive.
commentGenerator: function (defaults to a simple schema comment generator)A function to generate comment string from the schema of a field.
Signature: (schema: JSONSchema) => IJSONComment | undefined
configuration: object (optional)Please refer to the constructor of JSONCommentWriterBase.
Types
IJSONComment
Represents a single comment. Can be an object or a string.
When being a string:
The comment will be assumed to be a block comment (see below), and the string will be the content of comment.
When being an object:
type: 'block' | 'line' | 'end' (required)Type of the comment:
block- block comment wrapped with '/*' and '*/' before the itemline- line comment beginning with '//' before the itemend- line comment at the end of the item on the same line
lineandendare not supported ifspacewhen callingstringifyis 0. (Except for comments of root object)content: string or function (required)Content of the comment. Could be:
- A single-line or multi-line string
- A function to be called when stringifying the matched field.
- Signature: (matchedFieldPath: (string | number)[]) => string | undefined
- Return
undefinedto omit.
- '*/' will be escaped automatically if type is
block.
