Я думаю, вы могли бы чрезмерно использовать Рамду здесь. Код немного сбивает с толку. Скорее всего, в будущем это будет легче читать и поддерживать, хотя он еще будет функционировать:
function getScripts() {
const tryRequire = tryCatch((path) => require(path).run, always(null));
const addPathAndRunProps = dir => {
const path = scriptsPath(dir.name, 'index.js')
return {
...dir,
path,
run: tryRequire(path),
}
}
return pipe(
map(addPathAndRunProps),
filter(x => typeof x.run === 'function'),
)(fs.readdirSync(SCRIPTS_PATH, { withFileTypes: true }))
}
Или, если вы действительно хотите сохранить эти установщики, попробуйте разделить вашу функцию addPathAndRunProps
на два установщика:
function getScripts() {
const tryRequire = tryCatch((path) => require(path).run, always(null));
const addPathProp = x => assoc('path', scriptsPath(x.name, 'index.js'), x)
const addRunProp = x => assoc('run', tryRequire(x.path), x)
return pipe(
map(addPathProp),
map(addRunProp),
filter(x => typeof x.run === 'function'),
)(fs.readdirSync(SCRIPTS_PATH, { withFileTypes: true }))
}
В обоих случаях я избавился от вашей функции addModuleRunAndFilterInvalid
. Ваша функция не добавляет ясности, чтобы разделить addModuleRunAndFilterInvalid
на ее собственную функцию, а возвращение результата конвейера проясняет назначение самой функции getScripts
.
Кроме того, в вашем код, вы продолжаете вызывать объект, на котором вы работаете dir
. Это сбивает с толку, поскольку подразумевает, что объект имеет одинаковую структуру при каждом вызове функции. Однако переменная, переданная в addRunProp
, не имеет той же структуры, что и переменная, переданная в addPathProp
(для переменной, переданной в addRunProp
, требуется дополнительная path
prop). Либо придумайте описательное имя, либо просто используйте x
. Вы можете думать о x
как о том, над чем работает ваша функция. Чтобы выяснить, что такое x
, посмотрите на имя функции (например, addRunProp
означает, что к x
добавлено свойство run).
Еще один потенциально полезный совет: I Мы установили соглашение о присвоении имен aug
(сокращенно от "augment") для добавления свойства или части информации к объекту. Поэтому я переименую вашу addPathProp
функцию augPath
и переименую вашу addRunProp
функцию augRun
. Поскольку я использую его последовательно, я знаю, что когда я вижу aug
в начале функции, он добавляет свойство.