/* * Copyright (C) 2021 StApps * This program is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the Free * Software Foundation, version 3. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License along with * this program. If not, see . */ import {readdirSync, statSync} from 'fs'; import path from 'path'; /** * Expand a path to a list of all files deeply contained in it */ export function expandPathToFilesSync(sourcePath: string, accept: (fileName: string) => boolean): string[] { const fullPath = path.resolve(sourcePath); const directory = statSync(fullPath); return directory.isDirectory() ? readdirSync(fullPath).flatMap(fragment => expandPathToFilesSync(path.resolve(sourcePath, fragment), accept), ) : [fullPath].filter(accept); } /** * Take a Windows path and make a Unix path out of it */ export function toUnixPath(pathString: string): string { return pathString.replaceAll(path.sep, path.posix.sep); } /** * Filters only defined elements */ export function rejectNil(array: Array): T[] { // eslint-disable-next-line unicorn/no-null return array.filter(it => it != null) as T[]; } /** * Map elements that are not null */ export function mapNotNil(array: readonly T[], transform: (element: T) => S | undefined | null): S[] { return rejectNil(array.map(transform)); } /** * Deletes all properties with the value 'undefined', [] or {} */ // eslint-disable-next-line @typescript-eslint/ban-types export function cleanupEmpty(object: T): T { const out = {} as T; for (const key in object) { const value = object[key]; // eslint-disable-next-line unicorn/no-null if (value != null && (typeof value !== 'object' || Object.values(value).length > 0)) { out[key] = value; } } return out; }