Spaces:
Runtime error
Runtime error
// @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<void>} | |
*/ | |
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<string>} | |
*/ | |
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<string[]>} | |
*/ | |
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); | |
} | |