diff --git a/tools/doc/type-parser.js b/tools/doc/type-parser.js index 7999d55d740719..ce12077c9af886 100644 --- a/tools/doc/type-parser.js +++ b/tools/doc/type-parser.js @@ -1,7 +1,7 @@ 'use strict'; -const nodeDocUrl = ''; + const jsDocPrefix = 'https://developer.mozilla.org/en-US/docs/Web/JavaScript/'; -const jsDocUrl = `${jsDocPrefix}Reference/Global_Objects/`; + const jsPrimitiveUrl = `${jsDocPrefix}Data_structures`; const jsPrimitives = { 'boolean': 'Boolean', @@ -12,6 +12,8 @@ const jsPrimitives = { 'symbol': 'Symbol', 'undefined': 'Undefined' }; + +const jsGlobalObjectsUrl = `${jsDocPrefix}Reference/Global_Objects/`; const jsGlobalTypes = [ 'Array', 'ArrayBuffer', 'AsyncFunction', 'DataView', 'Date', 'Error', 'EvalError', 'Float32Array', 'Float64Array', 'Function', 'Generator', @@ -21,7 +23,8 @@ const jsGlobalTypes = [ 'Uint16Array', 'Uint32Array', 'Uint8Array', 'Uint8ClampedArray', 'WeakMap', 'WeakSet' ]; -const typeMap = { + +const customTypesMap = { 'Iterable': `${jsDocPrefix}Reference/Iteration_protocols#The_iterable_protocol`, 'Iterator': @@ -95,41 +98,43 @@ const typeMap = { const arrayPart = /(?:\[])+$/; -module.exports = { - toLink: function(typeInput) { - const typeLinks = []; - typeInput = typeInput.replace('{', '').replace('}', ''); - const typeTexts = typeInput.split('|'); - - typeTexts.forEach(function(typeText) { - typeText = typeText.trim(); - if (typeText) { - let typeUrl = null; - - // To support type[], type[][] etc., we store the full string - // and use the bracket-less version to lookup the type URL - const typeTextFull = typeText; - typeText = typeText.replace(arrayPart, ''); - - const primitive = jsPrimitives[typeText.toLowerCase()]; - - if (primitive !== undefined) { - typeUrl = `${jsPrimitiveUrl}#${primitive}_type`; - } else if (jsGlobalTypes.indexOf(typeText) !== -1) { - typeUrl = jsDocUrl + typeText; - } else if (typeMap[typeText]) { - typeUrl = nodeDocUrl + typeMap[typeText]; - } - - if (typeUrl) { - typeLinks.push(` - <${typeTextFull}>`); - } else { - typeLinks.push(`<${typeTextFull}>`); - } +function toLink(typeInput) { + const typeLinks = []; + typeInput = typeInput.replace('{', '').replace('}', ''); + const typeTexts = typeInput.split('|'); + + typeTexts.forEach((typeText) => { + typeText = typeText.trim(); + if (typeText) { + let typeUrl = null; + + // To support type[], type[][] etc., we store the full string + // and use the bracket-less version to lookup the type URL + const typeTextFull = typeText; + typeText = typeText.replace(arrayPart, ''); + + const primitive = jsPrimitives[typeText.toLowerCase()]; + + if (primitive !== undefined) { + typeUrl = `${jsPrimitiveUrl}#${primitive}_type`; + } else if (jsGlobalTypes.includes(typeText)) { + typeUrl = `${jsGlobalObjectsUrl}${typeText}`; + } else if (customTypesMap[typeText]) { + typeUrl = customTypesMap[typeText]; } - }); - return typeLinks.length ? typeLinks.join(' | ') : typeInput; - } -}; + if (typeUrl) { + typeLinks.push( + `<${typeTextFull}>`); + } else { + typeLinks.push(`<${typeTextFull}>`); + } + } else { + throw new Error(`Empty type slot: ${typeInput}`); + } + }); + + return typeLinks.length ? typeLinks.join(' | ') : typeInput; +} + +module.exports = { toLink };