@baseplate-dev/sync
Version:
Library for syncing Baseplate descriptions
51 lines • 1.77 kB
JavaScript
import pLimit from 'p-limit';
import { getGenerationConcurrencyLimit } from '#src/utils/concurrency.js';
import { PrepareGeneratorFilesError } from '../errors.js';
import { prepareGeneratorFile } from './prepare-generator-file.js';
/**
* Prepare generator files
*
* @param input - Prepare generator files input
* @returns Prepare generator files result
*/
export async function prepareGeneratorFiles({ files, context, }) {
const writeLimit = pLimit(getGenerationConcurrencyLimit());
const fileResults = await Promise.all(Array.from(files.entries(), ([filename, file]) => writeLimit(() => prepareGeneratorFile({
relativePath: filename,
data: file,
context,
}).catch((err) => ({
relativePath: filename,
cause: err,
})))));
const fileErrors = [];
const operationResults = [];
for (const result of fileResults) {
if ('cause' in result) {
fileErrors.push(result);
}
else {
operationResults.push(result);
}
}
if (fileErrors.length > 0) {
throw new PrepareGeneratorFilesError(fileErrors);
}
const fileIdToRelativePathMap = new Map();
for (const [relativePath, file] of files.entries()) {
if (fileIdToRelativePathMap.has(file.id)) {
throw new PrepareGeneratorFilesError([
{
relativePath,
cause: new Error(`File ID ${file.id} is already in use by file ${fileIdToRelativePathMap.get(file.id)}`),
},
]);
}
fileIdToRelativePathMap.set(file.id, relativePath);
}
return {
files: operationResults,
fileIdToRelativePathMap,
};
}
//# sourceMappingURL=prepare-generator-files.js.map