Skip to content

Commit

Permalink
feat(prettier-plugin-jsdoc): add exp support for blocks without tags
Browse files Browse the repository at this point in the history
  • Loading branch information
homer0 committed Apr 22, 2022
1 parent 7fe3e93 commit 32810ed
Show file tree
Hide file tree
Showing 6 changed files with 89 additions and 9 deletions.
12 changes: 12 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,8 @@ A [Prettier](https://prettier.io) plugin to format [JSDoc](https://jsdoc.app) bl
- [Custom width](#custom-width)
- [Turn the plugin on and off](#turn-the-plugin-on-and-off)
- [Let the plugin know that it's being extended](#let-the-plugin-know-that-its-being-extended)
- [⚠️ Experimental](#experimental)
- [Parse comments without tags](#parse-comments-without-tags)

#### @description tag

Expand Down Expand Up @@ -848,6 +850,16 @@ Whether or not the plugin will parse and transform JSDoc blocks.

This will prevent the plugin from running from the original package. The idea is for it to be enabled when the plugin is being extended on the implementation.

#### ⚠️ Experimental

##### Parse comments without tags

| Option | Type | Default |
| ------ | ---- | ------- |
| `jsdocExperimentalFormatCommentsWithoutTags` | boolean | `false` |

By default, the plugin will only parse comments with tags. Use this option, at your own risk, if you want to format blocks without tags.

### 🚫 Ignoring blocks

If you have some blocks where you don't the plugin to make any modification, you can add the `@prettierignore` tag and it/they will be skipped:
Expand Down
7 changes: 7 additions & 0 deletions src/fns/getOptions.js
Original file line number Diff line number Diff line change
Expand Up @@ -320,6 +320,13 @@ const getOptions = () => ({
description:
"Whether or not to use a single line JSDoc block when there's only one tag.",
},
jsdocExperimentalFormatCommentsWithoutTags: {
type: 'boolean',
category: 'jsdoc',
default: false,
description:
'Whether or not to format comments without tags as if they were JSDoc comments.',
},
});

/**
Expand Down
25 changes: 17 additions & 8 deletions src/fns/getParsers.js
Original file line number Diff line number Diff line change
Expand Up @@ -122,11 +122,20 @@ const hasNoTags = (info) =>
/**
* Checks whether or not a comment should be ignored.
*
* @param {ParsingInformation} info The parsed information of the comment.
* @returns {boolean}
* @callback ShouldIgnoreCommentFn
* @param {PrettierOptions} options The options sent to the plugin.
* @param {ParsingInformation} info The parsed information of the comment.
*/
const shouldIgnoreComment = (info) =>
R.anyPass([get(hasNoTags), get(hasIgnoreTag)])(info);

/**
* @type {ShouldIgnoreCommentFn}
*/
const shouldIgnoreComment = R.curry((options, info) =>
R.allPass([
R.anyPass([get(hasNoTags), get(hasIgnoreTag)]),
R.always(!options.jsdocExperimentalFormatCommentsWithoutTags),
])(info),
);

/**
* A function that formats the block and/or tags on a comment before being processed and
Expand All @@ -147,6 +156,7 @@ const shouldIgnoreComment = (info) =>

/**
* @callback ProcessCommentsFn
* @param {PrettierOptions} options The options sent to the plugin.
* @param {Array} nodes The list comments found on the AST.
* @param {CommentFormatterFn} formatterFn The function that formats and prepares the
* parsed information so it can be processed.
Expand All @@ -157,11 +167,11 @@ const shouldIgnoreComment = (info) =>
/**
* @type {ProcessCommentsFn}
*/
const processComments = R.curry((nodes, formatterFn, processorFn) =>
const processComments = R.curry((options, nodes, formatterFn, processorFn) =>
R.compose(
R.forEach(
R.compose(
R.ifElse(shouldIgnoreComment, R.identity, processorFn),
R.ifElse(shouldIgnoreComment(options), R.identity, processorFn),
formatterFn,
get(generateCommentData),
),
Expand Down Expand Up @@ -289,9 +299,8 @@ const createParser = (originalParser, checkExtendOption) => (text, parsers, opti
get(formatCommentBlock)(options),
);
const renderer = getRenderer(options);

if (ast.comments && ast.comments.length) {
get(processComments)(ast.comments, formatter, (info) => {
get(processComments)(options, ast.comments, formatter, (info) => {
const { comment, column, block } = info;
comment.value = renderer(column, block);
});
Expand Down
4 changes: 3 additions & 1 deletion src/fns/render.js
Original file line number Diff line number Diff line change
Expand Up @@ -314,7 +314,9 @@ const render = R.curry((options, column, block) => {
}

lines.push(...get(splitText)(description, width));
lines.push(...new Array(options.jsdocLinesBetweenDescriptionAndTags).fill(''));
if (block.tags.length) {
lines.push(...new Array(options.jsdocLinesBetweenDescriptionAndTags).fill(''));
}
}

if (options.jsdocUseColumns) {
Expand Down
29 changes: 29 additions & 0 deletions test/e2e/fixtures/text.fixture.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
module.exports = { jsdocExperimentalFormatCommentsWithoutTags: true };

//# input

/**
* Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi tincidunt, purus id maximus pellentesque, nisi mi cursus lacus, quis consequat eros nulla ac eros. Suspendisse malesuada placerat neque, vitae iaculis leo lobortis et. Phasellus pellentesque ut diam a feugiat. Mauris quis nisi id lacus lobortis feugiat. Nam volutpat cursus odio ut facilisis. Duis vitae venenatis neque, ac lacinia dui. Aliquam convallis rutrum risus, id dictum tellus pharetra ut. Nulla quis nisi laoreet arcu accumsan convallis. Nulla auctor auctor placerat. Donec malesuada sodales mauris, id convallis ex interdum a.
*
* Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi tincidunt, purus id maximus pellentesque, nisi mi cursus lacus, quis consequat eros nulla ac eros. Suspendisse malesuada placerat neque, vitae iaculis leo lobortis et. Phasellus pellentesque ut diam a feugiat. Mauris quis nisi id lacus lobortis feugiat. Nam volutpat cursus odio ut facilisis. Duis vitae venenatis neque, ac lacinia dui. Aliquam convallis rutrum risus, id dictum tellus pharetra ut. Nulla quis nisi laoreet arcu accumsan convallis. Nulla auctor auctor placerat. Donec malesuada sodales mauris, id convallis ex interdum a.
*/

//# output

/**
* Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi tincidunt, purus id maximus
* pellentesque, nisi mi cursus lacus, quis consequat eros nulla ac eros. Suspendisse malesuada
* placerat neque, vitae iaculis leo lobortis et. Phasellus pellentesque ut diam a feugiat. Mauris
* quis nisi id lacus lobortis feugiat. Nam volutpat cursus odio ut facilisis. Duis vitae venenatis
* neque, ac lacinia dui. Aliquam convallis rutrum risus, id dictum tellus pharetra ut. Nulla quis
* nisi laoreet arcu accumsan convallis. Nulla auctor auctor placerat. Donec malesuada sodales
* mauris, id convallis ex interdum a.
*
* Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi tincidunt, purus id maximus
* pellentesque, nisi mi cursus lacus, quis consequat eros nulla ac eros. Suspendisse malesuada
* placerat neque, vitae iaculis leo lobortis et. Phasellus pellentesque ut diam a feugiat. Mauris
* quis nisi id lacus lobortis feugiat. Nam volutpat cursus odio ut facilisis. Duis vitae venenatis
* neque, ac lacinia dui. Aliquam convallis rutrum risus, id dictum tellus pharetra ut. Nulla quis
* nisi laoreet arcu accumsan convallis. Nulla auctor auctor placerat. Donec malesuada sodales
* mauris, id convallis ex interdum a.
*/
21 changes: 21 additions & 0 deletions test/unit/fns/render.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -674,6 +674,27 @@ describe('render', () => {
jsdocPrintWidth: 80,
},
},
{
it: 'should render without tags',
input: {
description: [
'lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas',
'sollicitudin non justo quis placerat. Quisque eu dignissim tellus, ut',
'sodales lectus',
].join(' '),
tags: [],
},
output: [
'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas',
'sollicitudin non justo quis placerat. Quisque eu dignissim tellus, ut sodales',
'lectus.',
],
column: 0,
options: {
...defaultOptions,
printWidth: 80,
},
},
];

it.each(cases)('should correctly format the case %#', (caseInfo) => {
Expand Down

0 comments on commit 32810ed

Please sign in to comment.