1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
|
import * as fs from 'fs';
import * as _ from 'lodash';
import * as path from 'path';
import { ContractSource } from '../types';
import { EnumerableResolver } from './enumerable_resolver';
const SOLIDITY_FILE_EXTENSION = '.sol';
export class NameResolver extends EnumerableResolver {
private _contractsDir: string;
constructor(contractsDir: string) {
super();
this._contractsDir = contractsDir;
}
public resolveIfExists(lookupContractName: string): ContractSource | undefined {
let contractSource: ContractSource | undefined;
const onFile = (filePath: string) => {
const contractName = path.basename(filePath, SOLIDITY_FILE_EXTENSION);
if (contractName === lookupContractName) {
const absoluteContractPath = path.join(this._contractsDir, filePath);
const source = fs.readFileSync(absoluteContractPath).toString();
contractSource = {
source,
path: filePath,
};
return true;
}
return undefined;
};
this._traverseContractsDir(this._contractsDir, onFile);
return contractSource;
}
public getAll(): ContractSource[] {
const contractSources: ContractSource[] = [];
const onFile = (filePath: string) => {
const contractName = path.basename(filePath, SOLIDITY_FILE_EXTENSION);
const absoluteContractPath = path.join(this._contractsDir, filePath);
const source = fs.readFileSync(absoluteContractPath).toString();
const contractSource = {
source,
path: filePath,
};
contractSources.push(contractSource);
};
this._traverseContractsDir(this._contractsDir, onFile);
return contractSources;
}
// tslint:disable-next-line:prefer-function-over-method
private _traverseContractsDir(dirPath: string, onFile: (filePath: string) => true | void): boolean {
let dirContents: string[] = [];
try {
dirContents = fs.readdirSync(dirPath);
} catch (err) {
throw new Error(`No directory found at ${dirPath}`);
}
for (const fileName of dirContents) {
const absoluteEntryPath = path.join(dirPath, fileName);
const isDirectory = fs.lstatSync(absoluteEntryPath).isDirectory();
const entryPath = path.relative(this._contractsDir, absoluteEntryPath);
let isComplete;
if (isDirectory) {
isComplete = this._traverseContractsDir(absoluteEntryPath, onFile);
} else if (fileName.endsWith(SOLIDITY_FILE_EXTENSION)) {
isComplete = onFile(entryPath);
}
if (isComplete) {
return isComplete;
}
}
return false;
}
}
|