123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214 |
- "use strict";
-
- Object.defineProperty(exports, "__esModule", {
- value: true
- });
- exports.default = void 0;
-
- var _commentParser = require("comment-parser");
-
- /**
- * Transform based on https://github.com/syavorsky/comment-parser/blob/master/src/transforms/align.ts
- *
- * It contains some customizations to align based on the tags, and some custom options.
- */
- const {
- rewireSource
- } = _commentParser.util;
- const zeroWidth = {
- name: 0,
- start: 0,
- tag: 0,
- type: 0
- };
-
- const shouldAlign = (tags, index, source) => {
- const tag = source[index].tokens.tag.replace('@', '');
- const includesTag = tags.includes(tag);
-
- if (includesTag) {
- return true;
- }
-
- if (tag !== '') {
- return false;
- }
-
- for (let iterator = index; iterator >= 0; iterator--) {
- const previousTag = source[iterator].tokens.tag.replace('@', '');
-
- if (previousTag !== '') {
- if (tags.includes(previousTag)) {
- return true;
- }
-
- return false;
- }
- }
-
- return true;
- };
-
- const getWidth = tags => {
- return (width, {
- tokens
- }, index, source) => {
- if (!shouldAlign(tags, index, source)) {
- return width;
- }
-
- return {
- name: Math.max(width.name, tokens.name.length),
- start: tokens.delimiter === _commentParser.Markers.start ? tokens.start.length : width.start,
- tag: Math.max(width.tag, tokens.tag.length),
- type: Math.max(width.type, tokens.type.length)
- };
- };
- };
-
- const space = len => {
- return ''.padStart(len, ' ');
- };
-
- const alignTransform = ({
- customSpacings,
- tags,
- indent,
- preserveMainDescriptionPostDelimiter
- }) => {
- let intoTags = false;
- let width;
-
- const alignTokens = tokens => {
- const nothingAfter = {
- delim: false,
- name: false,
- tag: false,
- type: false
- };
-
- if (tokens.description === '') {
- nothingAfter.name = true;
- tokens.postName = '';
-
- if (tokens.name === '') {
- nothingAfter.type = true;
- tokens.postType = '';
-
- if (tokens.type === '') {
- nothingAfter.tag = true;
- tokens.postTag = '';
- /* istanbul ignore next: Never happens because the !intoTags return. But it's here for consistency with the original align transform */
-
- if (tokens.tag === '') {
- nothingAfter.delim = true;
- }
- }
- }
- } // Todo: Avoid fixing alignment of blocks with multiline wrapping of type
-
-
- if (tokens.tag === '' && tokens.type) {
- return tokens;
- }
-
- const spacings = {
- postDelimiter: (customSpacings === null || customSpacings === void 0 ? void 0 : customSpacings.postDelimiter) || 1,
- postName: (customSpacings === null || customSpacings === void 0 ? void 0 : customSpacings.postName) || 1,
- postTag: (customSpacings === null || customSpacings === void 0 ? void 0 : customSpacings.postTag) || 1,
- postType: (customSpacings === null || customSpacings === void 0 ? void 0 : customSpacings.postType) || 1
- };
- tokens.postDelimiter = nothingAfter.delim ? '' : space(spacings.postDelimiter);
-
- if (!nothingAfter.tag) {
- tokens.postTag = space(width.tag - tokens.tag.length + spacings.postTag);
- }
-
- if (!nothingAfter.type) {
- tokens.postType = space(width.type - tokens.type.length + spacings.postType);
- }
-
- if (!nothingAfter.name) {
- // If post name is empty for all lines (name width 0), don't add post name spacing.
- tokens.postName = width.name === 0 ? '' : space(width.name - tokens.name.length + spacings.postName);
- }
-
- return tokens;
- };
-
- const update = (line, index, source) => {
- const tokens = { ...line.tokens
- };
-
- if (tokens.tag !== '') {
- intoTags = true;
- }
-
- const isEmpty = tokens.tag === '' && tokens.name === '' && tokens.type === '' && tokens.description === ''; // dangling '*/'
-
- if (tokens.end === _commentParser.Markers.end && isEmpty) {
- tokens.start = indent + ' ';
- return { ...line,
- tokens
- };
- }
- /* eslint-disable indent */
-
-
- switch (tokens.delimiter) {
- case _commentParser.Markers.start:
- tokens.start = indent;
- break;
-
- case _commentParser.Markers.delim:
- tokens.start = indent + ' ';
- break;
-
- default:
- tokens.delimiter = ''; // compensate delimiter
-
- tokens.start = indent + ' ';
- }
- /* eslint-enable */
-
-
- if (!intoTags) {
- if (tokens.description === '') {
- tokens.postDelimiter = '';
- } else if (!preserveMainDescriptionPostDelimiter) {
- tokens.postDelimiter = ' ';
- }
-
- return { ...line,
- tokens
- };
- } // Not align.
-
-
- if (!shouldAlign(tags, index, source)) {
- return { ...line,
- tokens
- };
- }
-
- return { ...line,
- tokens: alignTokens(tokens)
- };
- };
-
- return ({
- source,
- ...fields
- }) => {
- width = source.reduce(getWidth(tags), { ...zeroWidth
- });
- return rewireSource({ ...fields,
- source: source.map(update)
- });
- };
- };
-
- var _default = alignTransform;
- exports.default = _default;
- module.exports = exports.default;
- //# sourceMappingURL=alignTransform.js.map
|