prettier-plugin-jsdoc
Version:
Prettier plugin for format comment blocks and convert to standard Match with Visual studio and other IDE which support jsdoc and comments as markdown.
164 lines (163 loc) • 5.73 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.defaultOptions = exports.parsers = exports.options = exports.languages = void 0;
const parser_1 = require("./parser");
const parser_babel_1 = __importDefault(require("prettier/parser-babel"));
const parser_flow_1 = __importDefault(require("prettier/parser-flow"));
const parser_typescript_1 = __importDefault(require("prettier/parser-typescript"));
const prettier_1 = __importDefault(require("prettier"));
const utils_1 = require("./utils");
const options = {
jsdocSpaces: {
name: "jsdocSpaces",
type: "int",
category: "jsdoc",
default: 1,
description: "How many spaces will be used to separate tag elements.",
},
jsdocDescriptionWithDot: {
name: "jsdocDescriptionWithDot",
type: "boolean",
category: "jsdoc",
default: false,
description: "Should dot be inserted at the end of description",
},
jsdocDescriptionTag: {
name: "jsdocDescriptionTag",
type: "boolean",
category: "jsdoc",
default: false,
description: "Should description tag be used",
},
jsdocVerticalAlignment: {
name: "jsdocVerticalAlignment",
type: "boolean",
category: "jsdoc",
default: false,
description: "Should tags, types, names and description be aligned",
},
jsdocKeepUnParseAbleExampleIndent: {
name: "jsdocKeepUnParseAbleExampleIndent",
type: "boolean",
category: "jsdoc",
default: false,
description: "Should unParseAble example (pseudo code or no js code) keep its indentation",
},
jsdocSingleLineComment: {
name: "jsdocSingleLineComment",
type: "boolean",
category: "jsdoc",
default: true,
description: "Should compact single line comment",
},
jsdocSeparateReturnsFromParam: {
name: "jsdocSeparateReturnsFromParam",
type: "boolean",
category: "jsdoc",
default: false,
description: "Add an space between last @param and @returns",
},
tsdoc: {
name: "tsdoc",
type: "boolean",
category: "jsdoc",
default: false,
description: "Should format as tsdoc",
},
jsdocPrintWidth: {
name: "jsdocPrintWidth",
type: "int",
category: "jsdoc",
default: undefined,
description: "If You don't set value to jsdocPrintWidth, the printWidth will be use as jsdocPrintWidth.",
},
};
exports.options = options;
const defaultOptions = {
jsdocSpaces: options.jsdocSpaces.default,
jsdocPrintWidth: options.jsdocPrintWidth.default,
jsdocDescriptionWithDot: options.jsdocDescriptionWithDot.default,
jsdocDescriptionTag: options.jsdocDescriptionTag.default,
jsdocVerticalAlignment: options.jsdocVerticalAlignment.default,
jsdocKeepUnParseAbleExampleIndent: options.jsdocKeepUnParseAbleExampleIndent
.default,
jsdocSingleLineComment: options.jsdocSingleLineComment.default,
jsdocSeparateReturnsFromParam: options.jsdocSeparateReturnsFromParam
.default,
tsdoc: options.tsdoc.default,
};
exports.defaultOptions = defaultOptions;
const languages = prettier_1.default
.getSupportInfo()
.languages.filter(({ name }) => [
"JavaScript",
"Flow",
"JSX",
"TSX",
"TypeScript",
"Markdown",
"MDX",
].includes(name));
exports.languages = languages;
const parsers = {
// JS - Babel
get babel() {
const parser = parser_babel_1.default.parsers.babel;
return mergeParsers(parser, "babel");
},
get "babel-flow"() {
const parser = parser_babel_1.default.parsers["babel-flow"];
return mergeParsers(parser, "babel-flow");
},
get "babel-ts"() {
const parser = parser_babel_1.default.parsers["babel-ts"];
return mergeParsers(parser, "babel-ts");
},
// JS - Flow
get flow() {
const parser = parser_flow_1.default.parsers.flow;
return mergeParsers(parser, "flow");
},
// JS - TypeScript
get typescript() {
const parser = parser_typescript_1.default.parsers.typescript;
return mergeParsers(parser, "typescript");
// require("./parser-typescript").parsers.typescript;
},
get "jsdoc-parser"() {
// Backward compatible, don't use this in new version since 1.0.0
const parser = parser_babel_1.default.parsers["babel-ts"];
return mergeParsers(parser, "babel-ts");
},
};
exports.parsers = parsers;
function mergeParsers(originalParser, parserName) {
const jsDocParse = parser_1.getParser(originalParser.parse, parserName);
const jsDocPreprocess = (text, options) => {
const tsPluginParser = utils_1.findPluginByParser(parserName, options);
if (!tsPluginParser) {
return originalParser.preprocess
? // eslint-disable-next-line @typescript-eslint/ban-ts-comment
//@ts-ignore
originalParser.preprocess(text, options)
: text;
}
const preprocess = tsPluginParser.preprocess || originalParser.preprocess;
Object.assign(parser, {
...parser,
...tsPluginParser,
preprocess: jsDocPreprocess,
parse: jsDocParse,
});
return preprocess ? preprocess(text, options) : text;
};
const parser = {
...originalParser,
preprocess: jsDocPreprocess,
parse: jsDocParse,
};
return parser;
}