All files / src/utils parseJsDoc.js

95.65% Statements 22/23
95.24% Branches 20/21
100% Functions 9/9
95.65% Lines 22/23
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90                                                        14x 5x 9x   1x 2x   8x   1x   7x       7x 1x   6x         13x 14x   13x 7x         6x         13x     13x 14x   7x                   13x   13x            
/*
 * Copyright (c) 2015, Facebook, Inc.
 * All rights reserved.
 *
 * This source code is licensed under the BSD-style license found in the
 * LICENSE file in the root directory of this source tree. An additional grant
 * of patent rights can be found in the PATENTS file in the same directory.
 *
 * @flow
 */
 
import doctrine from 'doctrine';
 
type JsDoc = {
  description: ?string;
  params: [{
    name: string;
    description: ?string;
    type: ?{name: string};
    optional?: boolean;
  }];
  returns: ?{
    description: ?string;
    type: ?{name: string};
  };
};
 
function getType(tag) {
  if (!tag.type) {
    return null;
  } else if (tag.type.type === 'UnionType') {
    // union type
    return {name: 'union', value: tag.type.elements.map(function (element) {
      return element.name;
    })};
  } else if (tag.type.type === 'AllLiteral') {
    // return {*}
    return {name: 'mixed'};
  }
  return {name: tag.type.name ? tag.type.name : tag.type.expression.name};
}
 
function getOptional(tag) {
  if (tag.type && tag.type.type && tag.type.type === 'OptionalType') {
    return true;
  }
  return;
}
 
// Add jsdoc @return description.
function getReturnsJsDoc(jsDoc) {
  const returnTag = jsDoc.tags.find(
    tag => tag.title === 'return' || tag.title === 'returns'
  );
  if (returnTag) {
    return {
      description: returnTag.description,
      type: getType(returnTag),
    };
  }
  return null;
}
 
// Add jsdoc @param descriptions.
function getParamsJsDoc(jsDoc) {
  Iif (!jsDoc.tags) {
    return [];
  }
  return jsDoc.tags
    .filter(tag => tag.title === 'param')
    .map(tag => {
      return {
        name: tag.name,
        description: tag.description,
        type: getType(tag),
        optional: getOptional(tag),
      };
    });
}
 
export default function parseJsDoc(docblock: string): JsDoc {
  const jsDoc = doctrine.parse(docblock);
 
  return {
    description: jsDoc.description || null,
    params: getParamsJsDoc(jsDoc),
    returns: getReturnsJsDoc(jsDoc),
  };
}