renovate/lib/util/modules.ts
Rhys Arkins 6293edc19a
feat: replace datasource constants with IDs (#5595)
Co-Authored-By: Michael Kriese <michael.kriese@visualon.de>
2020-03-01 08:01:12 +01:00

46 lines
1.4 KiB
TypeScript

import fs from 'fs';
import { join, normalizeTrim } from 'upath';
function relatePath(here: string, there: string): string {
const thereParts = normalizeTrim(there).split(/[\\/]/);
const hereParts = normalizeTrim(here).split(/[\\/]/);
let idx = 0;
while (
typeof thereParts[idx] === 'string' &&
typeof hereParts[idx] === 'string' &&
thereParts[idx] === hereParts[idx]
) {
idx += 1;
}
const result = [];
for (let x = 0; x < hereParts.length - idx; x += 1) result.push('..');
for (let y = idx; y < thereParts.length; y += 1) result.push(thereParts[idx]);
return result.join('/');
}
export function loadModules<T>(
dirname: string,
validate?: (module: T, moduleName?: string) => boolean
): Record<string, T> {
const result: Record<string, T> = {};
const moduleNames: string[] = fs
.readdirSync(dirname, { withFileTypes: true })
.filter(dirent => dirent.isDirectory())
.map(dirent => dirent.name)
.filter(name => !name.startsWith('__'))
.sort();
for (const moduleName of moduleNames) {
const modulePath = join(relatePath(__dirname, dirname), moduleName);
const module = require(modulePath); // eslint-disable-line
// istanbul ignore if
if (!module || (validate && !validate(module, moduleName)))
throw new Error(`Invalid module: ${modulePath}`);
result[moduleName] = module as T;
}
return result;
}