@baseplate-dev/sync
Version:
Library for syncing Baseplate descriptions
47 lines • 2.04 kB
JavaScript
import { compareStrings, stringifyPrettyStable } from '@baseplate-dev/utils';
import { promises as fs } from 'node:fs';
import path from 'node:path';
import { TEMPLATES_INFO_FILENAME } from '../constants.js';
/**
* Groups files by their directory and collects their template infos
*/
function groupFilesByDirectory(files) {
const directoryMap = new Map();
for (const [filePath, fileData] of files) {
if (!fileData.options?.templateInfo) {
continue;
}
const dirPath = path.dirname(filePath);
const fileName = path.basename(filePath);
const existingTemplateInfoEntries = directoryMap.get(dirPath) ?? {};
existingTemplateInfoEntries[fileName] = fileData.options.templateInfo;
directoryMap.set(dirPath, existingTemplateInfoEntries);
}
return directoryMap;
}
/**
* Writes templates info files to each directory containing files with template metadata
*
* @param files - Map of file paths to file data
* @param outputDirectory - Base directory where files are being written
* @returns Promise that resolves when all templates info files are written
*/
export async function writeTemplateInfoFiles(files, outputDirectory) {
const directoryInfoMap = groupFilesByDirectory(files);
const writePromises = [];
for (const [dirPath, info] of directoryInfoMap) {
// Skip if no metadata to write
if (Object.keys(info).length === 0) {
continue;
}
const fullDirPath = path.join(outputDirectory, dirPath);
const infoPath = path.join(fullDirPath, TEMPLATES_INFO_FILENAME);
const sortedInfoEntries = Object.fromEntries(Object.entries(info).sort(([a], [b]) => compareStrings(a, b)));
// Ensure directory exists
writePromises.push(fs
.mkdir(fullDirPath, { recursive: true })
.then(() => fs.writeFile(infoPath, stringifyPrettyStable(sortedInfoEntries), 'utf8')));
}
await Promise.all(writePromises);
}
//# sourceMappingURL=write-template-info-files.js.map