Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions .changeset/orange-regions-run.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@perfect-abstractions/compose-cli": patch
---

fix(cli): defer build freshness to framework compiler
38 changes: 5 additions & 33 deletions cli/src/modules/compile/module.ts
Original file line number Diff line number Diff line change
@@ -1,37 +1,9 @@
import fs from "node:fs";
import { IFrameworkAdapter } from "../../adapters/IFrameworkAdapter/interface";
import { getNewestSourceMtime, getOldestArtifactMtime } from "./utils";

export const CompileModule = {
areArtifactsStale(projectRoot: string, adapter: IFrameworkAdapter): boolean {
const artifactDir = adapter.getArtifactDir(projectRoot);

if (!fs.existsSync(artifactDir)) {
return true;
}

const sourceDir = adapter.getContractSourceRoot(projectRoot);
const newestSource = getNewestSourceMtime(sourceDir);

if (newestSource === null) {
return false;
}

const oldestArtifact = getOldestArtifactMtime(artifactDir);

if (oldestArtifact === null) {
return true;
}

return newestSource > oldestArtifact;
},

async compileIfNeeded(projectRoot: string, adapter: IFrameworkAdapter): Promise<void> {
if (!this.areArtifactsStale(projectRoot, adapter)) {
console.log("No file change")
return;
}

async compileProject(projectRoot: string, adapter: IFrameworkAdapter): Promise<void> {
// Let Foundry/Hardhat evaluate their complete incremental build graph,
// including deleted files, config changes, and imported package sources.
await adapter.compile(projectRoot);
}
}
},
};
46 changes: 0 additions & 46 deletions cli/src/modules/compile/utils.ts

This file was deleted.

2 changes: 1 addition & 1 deletion cli/src/pipelines/buildPipeline.ts
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ export const BuildPipeline = {
throw new Error(`${framework} adapter was not resolved.`);
}

await CompileModule.compileIfNeeded(projectRoot, adapter);
await CompileModule.compileProject(projectRoot, adapter);

return ctx;
},
Expand Down
15 changes: 15 additions & 0 deletions cli/test/modules/compile/module.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
import { describe, expect, it, vi } from "vitest";
import type { IFrameworkAdapter } from "../../../src/adapters/IFrameworkAdapter/interface";
import { CompileModule } from "../../../src/modules/compile/module";

describe("CompileModule.compileProject", () => {
it("delegates incremental freshness checks to the framework compiler", async () => {
const compile = vi.fn().mockResolvedValue(undefined);
const adapter = { compile } as unknown as IFrameworkAdapter;

await CompileModule.compileProject("/project", adapter);

expect(compile).toHaveBeenCalledOnce();
expect(compile).toHaveBeenCalledWith("/project");
});
});
Loading