|
|
|
@ -4,39 +4,49 @@ const IMPORT_SOLIDITY_REGEX = /^\s*import(\s+).*$/gm; |
|
|
|
|
const SPDX_SOLIDITY_REGEX = /^\s*\/\/ SPDX-License-Identifier:.*$/gm; |
|
|
|
|
|
|
|
|
|
type Visited = { [key: string]: number } |
|
|
|
|
export function getDependencyGraph(ast: { [name: string]: CompilationSource }, target: string, remappings: string[]) { |
|
|
|
|
export function getDependencyGraph(ast: { [name: string]: CompilationSource }, target: string, remappings: string[], order: string[]) { |
|
|
|
|
const graph = tsort(); |
|
|
|
|
const visited = {}; |
|
|
|
|
visited[target] = 1; |
|
|
|
|
_traverse(graph, visited, ast, target, remappings); |
|
|
|
|
_traverse(graph, visited, ast, target, remappings, order); |
|
|
|
|
return graph; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
export function concatSourceFiles(files: any[], sources: any) { |
|
|
|
|
let concat = ''; |
|
|
|
|
export function concatSourceFiles(files: any[], sources: any, order: string[]) { |
|
|
|
|
let concat = '' |
|
|
|
|
order.reverse().forEach((importName) => { |
|
|
|
|
for (const file of files) { |
|
|
|
|
const source = sources[file].content; |
|
|
|
|
const sourceWithoutImport = source.replace(IMPORT_SOLIDITY_REGEX, ''); |
|
|
|
|
const sourceWithoutSPDX = sourceWithoutImport.replace(SPDX_SOLIDITY_REGEX, ''); |
|
|
|
|
concat += `\n// File: ${file}\n\n`; |
|
|
|
|
concat += sourceWithoutSPDX; |
|
|
|
|
if (file === importName) { |
|
|
|
|
const source = sources[file].content |
|
|
|
|
const sourceWithoutImport = source.replace(IMPORT_SOLIDITY_REGEX, '') |
|
|
|
|
const sourceWithoutSPDX = sourceWithoutImport.replace(SPDX_SOLIDITY_REGEX, '') |
|
|
|
|
concat += `\n// File: ${file}\n\n` |
|
|
|
|
concat += sourceWithoutSPDX |
|
|
|
|
} |
|
|
|
|
return concat; |
|
|
|
|
const source = sources[importName].content |
|
|
|
|
const sourceWithoutImport = source.replace(IMPORT_SOLIDITY_REGEX, '') |
|
|
|
|
const sourceWithoutSPDX = sourceWithoutImport.replace(SPDX_SOLIDITY_REGEX, '') |
|
|
|
|
concat += `\n// File: ${importName}\n\n` |
|
|
|
|
concat += sourceWithoutSPDX |
|
|
|
|
} |
|
|
|
|
}) |
|
|
|
|
return concat |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
function _traverse(graph: Graph, visited: Visited, ast: { [name: string]: CompilationSource }, name: string, remappings: string[]) { |
|
|
|
|
function _traverse(graph: Graph, visited: Visited, ast: { [name: string]: CompilationSource }, name: string, remappings: string[], order: string[]) { |
|
|
|
|
let currentAst = null |
|
|
|
|
currentAst = ast[name].ast |
|
|
|
|
const dependencies = _getDependencies(currentAst); |
|
|
|
|
for (const dependency of dependencies) { |
|
|
|
|
const path = resolve(name, dependency, remappings); |
|
|
|
|
if (path in visited) { |
|
|
|
|
// continue; // fixes wrong ordering of source in flattened file
|
|
|
|
|
continue; // fixes wrong ordering of source in flattened file
|
|
|
|
|
} |
|
|
|
|
visited[path] = 1; |
|
|
|
|
graph.add(name, path); |
|
|
|
|
_traverse(graph, visited, ast, path, remappings); |
|
|
|
|
_traverse(graph, visited, ast, path, remappings, order); |
|
|
|
|
} |
|
|
|
|
order.push(name) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
function _getDependencies(ast: AstNode) { |
|
|
|
|