diff --git a/packages/build-tools/src/build.ts b/packages/build-tools/src/build.ts index 0d2007b..2ae12ff 100644 --- a/packages/build-tools/src/build.ts +++ b/packages/build-tools/src/build.ts @@ -1,3 +1,4 @@ +import { readFile } from 'node:fs/promises'; import { calculateChecksum, fileExists, @@ -9,15 +10,16 @@ export function getBuildDataPath(src: string): string { } export async function ShouldComponentize( -src: string, outputPath: string, componentizeVersion: string, runtimeArgs: string, + src: string, outputPath: string, componentizeVersion: string, runtimeArgs: string, targetWitChecksum: string ) { - const sourceChecksum = await calculateChecksum(src); + const sourceChecksum = await calculateChecksum(await readFile(src)); const existingBuildData = await getExistingBuildData(getBuildDataPath(src)); if ( existingBuildData?.version == componentizeVersion && existingBuildData?.checksum === sourceChecksum && existingBuildData?.runtimeArgs === runtimeArgs && + existingBuildData?.targetWitChecksum === targetWitChecksum && (await fileExists(outputPath)) ) { return false; diff --git a/packages/build-tools/src/index.ts b/packages/build-tools/src/index.ts index 08cc9e4..24a87e9 100644 --- a/packages/build-tools/src/index.ts +++ b/packages/build-tools/src/index.ts @@ -23,15 +23,6 @@ async function main() { let outputPath = CliArgs.output; let runtimeArgs = CliArgs.debug ? '--enable-script-debugging' : ''; - // Small optimization to skip componentization if the source file hasn't changed - if (!(await ShouldComponentize(src, outputPath, componentizeVersion, runtimeArgs))) { - console.log( - 'No changes detected in source file. Skipping componentization.', - ); - return; - } - console.log('Componentizing...'); - // generate wit world string let wasiDeps = getPackagesWithWasiDeps(process.cwd(), new Set(), true); let { witPaths, targetWorlds } = processWasiDeps(wasiDeps); @@ -63,6 +54,16 @@ async function main() { 'combined-wit:combined-wit@0.3.0', ); + let inlineWitChecksum = await calculateChecksum(inlineWit); + // Small optimization to skip componentization if the source file hasn't changed + if (!(await ShouldComponentize(src, outputPath, componentizeVersion, runtimeArgs, inlineWitChecksum))) { + console.log( + 'No changes detected in source file and target World. Skipping componentization.', + ); + return; + } + console.log('Componentizing...'); + const source = await readFile(src, 'utf8'); const precompiledSource = precompile(source, src, true) as string; @@ -85,9 +86,10 @@ async function main() { // Save the checksum of the input file along with the componentize version await saveBuildData( getBuildDataPath(src), - await calculateChecksum(src), + await calculateChecksum(await readFile(src)), componentizeVersion, runtimeArgs, + inlineWitChecksum, ); console.log('Component successfully written.'); diff --git a/packages/build-tools/src/utils.ts b/packages/build-tools/src/utils.ts index dea5fdf..cfc26ea 100644 --- a/packages/build-tools/src/utils.ts +++ b/packages/build-tools/src/utils.ts @@ -4,18 +4,18 @@ import { access, writeFile } from 'node:fs/promises'; // Function to calculate file checksum -export async function calculateChecksum(filePath: string) { +export async function calculateChecksum(content: string | Buffer) { try { - const fileBuffer = await readFile(filePath); const hash = createHash('sha256'); - hash.update(fileBuffer); + hash.update(content); return hash.digest('hex'); } catch (error) { - console.error(`Error calculating checksum for file ${filePath}:`, error); + console.error(`Error calculating checksum:`, error); throw error; } } + // Function to check if a file exists export async function fileExists(filePath: string) { try { @@ -43,13 +43,14 @@ export async function getExistingBuildData(buildDataPath: string) { } export async function saveBuildData( -buildDataPath: string, checksum: string, version: string, runtimeArgs: string, + buildDataPath: string, checksum: string, version: string, runtimeArgs: string, targetWitChecksum: string ) { try { const checksumData = { version, checksum, runtimeArgs, + targetWitChecksum, }; await writeFile(buildDataPath, JSON.stringify(checksumData, null, 2)); } catch (error) {