// @ts-check import crypto from 'node:crypto'; import fs from 'node:fs'; import { join, resolve } from 'node:path'; const algorithm = 'sha256'; export const checksumFileName = `checksum.${algorithm}`; const createSHAHash = () => crypto.createHash(algorithm); /** * @param {string} distPath * @returns {Promise} */ export async function createBuildChecksumFile(distPath) { const paths = await getFilesInDirectory(distPath); const fileChecksums = await Promise.all(paths.map(async (path) => await getFileChecksum(path))); const buildChecksum = createSHAHash().update(fileChecksums.join('')).digest('hex'); await fs.promises.writeFile(join(distPath, checksumFileName), buildChecksum, { flag: 'w' }); } /** * @param {string} filePath * @returns {Promise} */ async function getFileChecksum(filePath) { return new Promise((resolve, reject) => { const hash = createSHAHash(); const stream = fs.createReadStream(filePath); stream.on('error', (err) => reject(err)); stream.on('data', (chunk) => hash.update(chunk)); stream.on('end', () => resolve(hash.digest('hex'))); }); } /** * @param {string} directoryPath * @returns {Promise} */ async function getFilesInDirectory(directoryPath) { const entries = await fs.promises.readdir(directoryPath, { withFileTypes: true }); const entriesPromises = entries.map(async (entry) => { const entryPath = resolve(directoryPath, entry.name); if (entry.isDirectory()) { return await getFilesInDirectory(entryPath); } return entryPath; }); return (await Promise.all(entriesPromises)).flat(20); }