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()); | ||
|  | } |