diff --git a/tasks/generate-index.js b/tasks/generate-index.js index 4c91f6f111..8d5dce47df 100644 --- a/tasks/generate-index.js +++ b/tasks/generate-index.js @@ -13,44 +13,41 @@ async function getSymbols() { } /** - * Generate a list of imports. - * @param {Array} symbols List of symbols. - * @return {Promise} A list of imports sorted by export name. + * Generate an import statement. + * @param {Object} symbol Symbol. + * @param {string} member Member. + * @return {string} An import statement. */ -function getImports(symbols) { - const imports = {}; - symbols.forEach(symbol => { - const defaultExport = symbol.name.split('~'); - const namedExport = symbol.name.split('.'); - if (defaultExport.length > 1) { - const from = defaultExport[0].replace(/^module\:/, './'); - const importName = from.replace(/[.\/]+/g, '$'); - const defaultImport = `import ${importName} from '${from}';`; - imports[defaultImport] = true; - } else if (namedExport.length > 1) { - const from = namedExport[0].replace(/^module\:/, './'); - const importName = from.replace(/[.\/]+/g, '_'); - const namedImport = `import * as ${importName} from '${from}';`; - imports[namedImport] = true; - } - }); - return Object.keys(imports).sort(); +function getImport(symbol, member) { + const defaultExport = symbol.name.split('~'); + const namedExport = symbol.name.split('.'); + if (defaultExport.length > 1) { + const from = defaultExport[0].replace(/^module\:/, './'); + const importName = from.replace(/[.\/]+/g, '$'); + return `import ${importName} from '${from}';`; + } else if (namedExport.length > 1 && member) { + const from = namedExport[0].replace(/^module\:/, './'); + const importName = from.replace(/[.\/]+/g, '_'); + return `import {${member} as ${importName}$${member}} from '${from}';`; + } } /** * Generate code to export a named symbol. - * @param {string} name Symbol name. + * @param {Object} symbol Symbol. * @param {Object} namespaces Already defined namespaces. + * @param {Object} imports Imports. * @return {string} Export code. */ -function formatSymbolExport(name, namespaces) { +function formatSymbolExport(symbol, namespaces, imports) { + const name = symbol.name; const parts = name.split('~'); const isNamed = parts[0].indexOf('.') !== -1; const nsParts = parts[0].replace(/^module\:/, '').split(/[\/\.]/); const last = nsParts.length - 1; const importName = isNamed ? - '_' + nsParts.slice(0, last).join('_') + '.' + nsParts[last] : + '_' + nsParts.slice(0, last).join('_') + '$' + nsParts[last] : '$' + nsParts.join('$'); let line = nsParts[0]; for (let i = 1, ii = nsParts.length; i < ii; ++i) { @@ -58,6 +55,7 @@ function formatSymbolExport(name, namespaces) { namespaces[line] = (line in namespaces ? namespaces[line] : true) && i < ii - 1; } line += ` = ${importName};`; + imports[getImport(symbol, nsParts.pop())] = true; return line; } @@ -69,12 +67,18 @@ function formatSymbolExport(name, namespaces) { * @param {Array} imports List of all imports. * @return {string} Export code. */ -function generateExports(symbols, namespaces, imports) { +function generateExports(symbols) { + const namespaces = {}; + const imports = []; let blocks = []; symbols.forEach(function(symbol) { const name = symbol.name; if (name.indexOf('#') == -1) { - const block = formatSymbolExport(name, namespaces); + const imp = getImport(symbol); + if (imp) { + imports[getImport(symbol)] = true; + } + const block = formatSymbolExport(symbol, namespaces, imports); if (block !== blocks[blocks.length - 1]) { blocks.push(block); } @@ -87,8 +91,8 @@ function generateExports(symbols, namespaces, imports) { nsdefs.push(`${ns[i]} = {};`); } } - blocks = imports.concat('\nvar ol = window[\'ol\'] = {};\n', nsdefs.sort()).concat(blocks.sort()); - blocks.push(''); + blocks = Object.keys(imports).concat('\nvar ol = {};\n', nsdefs.sort()).concat(blocks.sort()); + blocks.push('', 'export default ol;'); return blocks.join('\n'); } @@ -99,8 +103,7 @@ function generateExports(symbols, namespaces, imports) { */ async function main() { const symbols = await getSymbols(); - const imports = await getImports(symbols); - return generateExports(symbols, {}, imports); + return generateExports(symbols); }