150 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
		
		
			
		
	
	
			150 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| 
								 | 
							
								'use strict';
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Object.defineProperty(exports, '__esModule', {
							 | 
						||
| 
								 | 
							
								  value: true
							 | 
						||
| 
								 | 
							
								});
							 | 
						||
| 
								 | 
							
								exports.extract = extract;
							 | 
						||
| 
								 | 
							
								exports.strip = strip;
							 | 
						||
| 
								 | 
							
								exports.parse = parse;
							 | 
						||
| 
								 | 
							
								exports.parseWithComments = parseWithComments;
							 | 
						||
| 
								 | 
							
								exports.print = print;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function _os() {
							 | 
						||
| 
								 | 
							
								  const data = require('os');
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  _os = function _os() {
							 | 
						||
| 
								 | 
							
								    return data;
							 | 
						||
| 
								 | 
							
								  };
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  return data;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function _detectNewline() {
							 | 
						||
| 
								 | 
							
								  const data = _interopRequireDefault(require('detect-newline'));
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  _detectNewline = function _detectNewline() {
							 | 
						||
| 
								 | 
							
								    return data;
							 | 
						||
| 
								 | 
							
								  };
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  return data;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function _interopRequireDefault(obj) {
							 | 
						||
| 
								 | 
							
								  return obj && obj.__esModule ? obj : {default: obj};
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								 * Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * This source code is licensed under the MIT license found in the
							 | 
						||
| 
								 | 
							
								 * LICENSE file in the root directory of this source tree.
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								const commentEndRe = /\*\/$/;
							 | 
						||
| 
								 | 
							
								const commentStartRe = /^\/\*\*/;
							 | 
						||
| 
								 | 
							
								const docblockRe = /^\s*(\/\*\*?(.|\r?\n)*?\*\/)/;
							 | 
						||
| 
								 | 
							
								const lineCommentRe = /(^|\s+)\/\/([^\r\n]*)/g;
							 | 
						||
| 
								 | 
							
								const ltrimNewlineRe = /^(\r?\n)+/;
							 | 
						||
| 
								 | 
							
								const multilineRe = /(?:^|\r?\n) *(@[^\r\n]*?) *\r?\n *(?![^@\r\n]*\/\/[^]*)([^@\r\n\s][^@\r\n]+?) *\r?\n/g;
							 | 
						||
| 
								 | 
							
								const propertyRe = /(?:^|\r?\n) *@(\S+) *([^\r\n]*)/g;
							 | 
						||
| 
								 | 
							
								const stringStartRe = /(\r?\n|^) *\* ?/g;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function extract(contents) {
							 | 
						||
| 
								 | 
							
								  const match = contents.match(docblockRe);
							 | 
						||
| 
								 | 
							
								  return match ? match[0].trimLeft() : '';
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function strip(contents) {
							 | 
						||
| 
								 | 
							
								  const match = contents.match(docblockRe);
							 | 
						||
| 
								 | 
							
								  return match && match[0] ? contents.substring(match[0].length) : contents;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function parse(docblock) {
							 | 
						||
| 
								 | 
							
								  return parseWithComments(docblock).pragmas;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function parseWithComments(docblock) {
							 | 
						||
| 
								 | 
							
								  const line = (0, _detectNewline().default)(docblock) || _os().EOL;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  docblock = docblock
							 | 
						||
| 
								 | 
							
								    .replace(commentStartRe, '')
							 | 
						||
| 
								 | 
							
								    .replace(commentEndRe, '')
							 | 
						||
| 
								 | 
							
								    .replace(stringStartRe, '$1'); // Normalize multi-line directives
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  let prev = '';
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  while (prev !== docblock) {
							 | 
						||
| 
								 | 
							
								    prev = docblock;
							 | 
						||
| 
								 | 
							
								    docblock = docblock.replace(multilineRe, `${line}$1 $2${line}`);
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  docblock = docblock.replace(ltrimNewlineRe, '').trimRight();
							 | 
						||
| 
								 | 
							
								  const result = Object.create(null);
							 | 
						||
| 
								 | 
							
								  const comments = docblock
							 | 
						||
| 
								 | 
							
								    .replace(propertyRe, '')
							 | 
						||
| 
								 | 
							
								    .replace(ltrimNewlineRe, '')
							 | 
						||
| 
								 | 
							
								    .trimRight();
							 | 
						||
| 
								 | 
							
								  let match;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  while ((match = propertyRe.exec(docblock))) {
							 | 
						||
| 
								 | 
							
								    // strip linecomments from pragmas
							 | 
						||
| 
								 | 
							
								    const nextPragma = match[2].replace(lineCommentRe, '');
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    if (
							 | 
						||
| 
								 | 
							
								      typeof result[match[1]] === 'string' ||
							 | 
						||
| 
								 | 
							
								      Array.isArray(result[match[1]])
							 | 
						||
| 
								 | 
							
								    ) {
							 | 
						||
| 
								 | 
							
								      result[match[1]] = [].concat(result[match[1]], nextPragma);
							 | 
						||
| 
								 | 
							
								    } else {
							 | 
						||
| 
								 | 
							
								      result[match[1]] = nextPragma;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  return {
							 | 
						||
| 
								 | 
							
								    comments,
							 | 
						||
| 
								 | 
							
								    pragmas: result
							 | 
						||
| 
								 | 
							
								  };
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function print({comments = '', pragmas = {}}) {
							 | 
						||
| 
								 | 
							
								  const line = (0, _detectNewline().default)(comments) || _os().EOL;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  const head = '/**';
							 | 
						||
| 
								 | 
							
								  const start = ' *';
							 | 
						||
| 
								 | 
							
								  const tail = ' */';
							 | 
						||
| 
								 | 
							
								  const keys = Object.keys(pragmas);
							 | 
						||
| 
								 | 
							
								  const printedObject = keys
							 | 
						||
| 
								 | 
							
								    .map(key => printKeyValues(key, pragmas[key]))
							 | 
						||
| 
								 | 
							
								    .reduce((arr, next) => arr.concat(next), [])
							 | 
						||
| 
								 | 
							
								    .map(keyValue => start + ' ' + keyValue + line)
							 | 
						||
| 
								 | 
							
								    .join('');
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  if (!comments) {
							 | 
						||
| 
								 | 
							
								    if (keys.length === 0) {
							 | 
						||
| 
								 | 
							
								      return '';
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    if (keys.length === 1 && !Array.isArray(pragmas[keys[0]])) {
							 | 
						||
| 
								 | 
							
								      const value = pragmas[keys[0]];
							 | 
						||
| 
								 | 
							
								      return `${head} ${printKeyValues(keys[0], value)[0]}${tail}`;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  const printedComments =
							 | 
						||
| 
								 | 
							
								    comments
							 | 
						||
| 
								 | 
							
								      .split(line)
							 | 
						||
| 
								 | 
							
								      .map(textLine => `${start} ${textLine}`)
							 | 
						||
| 
								 | 
							
								      .join(line) + line;
							 | 
						||
| 
								 | 
							
								  return (
							 | 
						||
| 
								 | 
							
								    head +
							 | 
						||
| 
								 | 
							
								    line +
							 | 
						||
| 
								 | 
							
								    (comments ? printedComments : '') +
							 | 
						||
| 
								 | 
							
								    (comments && keys.length ? start + line : '') +
							 | 
						||
| 
								 | 
							
								    printedObject +
							 | 
						||
| 
								 | 
							
								    tail
							 | 
						||
| 
								 | 
							
								  );
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function printKeyValues(key, valueOrArray) {
							 | 
						||
| 
								 | 
							
								  return [].concat(valueOrArray).map(value => `@${key} ${value}`.trim());
							 | 
						||
| 
								 | 
							
								}
							 |