Skip to content

Commit f065ade

Browse files
feat: finish building blazebuild v2
1 parent ae17607 commit f065ade

17 files changed

+210
-102
lines changed

blaze/wrapper/blaze_wrapper.mjs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,11 @@ function getBunPath() {
9999
*/
100100
function execute(file, ...args) {
101101
const { status } = spawnSync(getBunPath(), [file, ...args], {
102-
stdio: process.env.BLAZE_QUIET === "1" ? "ignore" : "inherit"
102+
stdio: process.env.BLAZE_QUIET === "1" ? "ignore" : "inherit",
103+
env: {
104+
...process.env,
105+
PATH: `${process.env.PATH}:${path.resolve(process.cwd(), "node_modules/.bin")}`
106+
}
103107
});
104108

105109
if (status !== 0) {
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
/workspaces/sudobot/blazebuild

blazebuild/src/main/typescript/core/Blaze.ts

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,16 @@ class Blaze {
3333
}
3434

3535
public async boot() {
36+
process.on("uncaughtException", error => {
37+
IO.error(error);
38+
IO.exit(1);
39+
});
40+
41+
process.on("unhandledRejection", error => {
42+
IO.error(error);
43+
IO.exit(1);
44+
});
45+
3646
for (const manager of this.managers) {
3747
if (manager.boot) {
3848
await manager.boot();
@@ -46,7 +56,7 @@ class Blaze {
4656
await this.buildScriptManager.loadBuildScript();
4757
} catch (error) {
4858
if (error instanceof MissingBuildScriptError) {
49-
IO.println(error.message);
59+
IO.error(error.message);
5060
IO.buildFailed();
5161
IO.exit(1);
5262
}
@@ -63,7 +73,7 @@ class Blaze {
6373
}
6474
} catch (error) {
6575
if (error instanceof TaskNotFoundError) {
66-
IO.println(`Task '${error.getTaskName()}' could not be found!`);
76+
IO.error(error.message);
6777
IO.buildFailed();
6878
IO.exit(1);
6979
}

blazebuild/src/main/typescript/io/IO.ts

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -59,9 +59,11 @@ class IO {
5959

6060
public static buildSuccessful(): void {
6161
console.log(`\n${chalk.green.bold("BUILD SUCCESSFUL")} in ${this.timeDiffFromStartup()}`);
62-
console.log(
63-
`${Blaze.getInstance().taskManager.getExecutedTaskCount()} actionable tasks: ${Blaze.getInstance().taskManager.getExecutedTaskCount()} executed`
64-
);
62+
const actionableTasks = Blaze.getInstance().taskManager.getActionableTaskCount();
63+
const executedTasks = Blaze.getInstance().taskManager.getExecutedTaskCount();
64+
const upToDateTasks = Blaze.getInstance().taskManager.getUpToDateTasks();
65+
66+
console.log(`${actionableTasks} actionable tasks: ${executedTasks} executed`);
6567
}
6668

6769
public static buildFailed(): void {

blazebuild/src/main/typescript/tasks/AbstractTask.ts

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -193,7 +193,7 @@ abstract class AbstractTask<R = void> {
193193
taskObject = this.blaze.taskManager.resolveTask(dependency);
194194
}
195195

196-
taskObject.getDependencies(set);
196+
await taskObject.getDependencies(set);
197197
set.add(taskObject);
198198
}
199199

@@ -202,13 +202,25 @@ abstract class AbstractTask<R = void> {
202202

203203
public async execute(execDeps = true) {
204204
const name = this.determineName();
205+
206+
if (this.blaze.taskManager.executedTasks.has(name)) {
207+
return;
208+
}
209+
205210
const { call: callExecute } = this.findAction();
206211
const { call: callGenerateInput } = this.findInputGenerator();
207212
this._input = callGenerateInput ? new Set(await callGenerateInput()) : this._input;
208213

209214
if (await this.isUpToDate()) {
210215
IO.println(`> ${chalk.white.dim(`:${name}`)} ${chalk.green(`UP-TO-DATE`)}`);
216+
this.blaze.taskManager.upToDateTasks.add(name);
211217
return;
218+
} else {
219+
if (process.env.BLAZE_DEBUG === "1") {
220+
IO.println(`> ${chalk.white.dim(`:${name}`)} ${chalk.red(`OUT-OF-DATE`)}`);
221+
}
222+
223+
this.blaze.taskManager.upToDateTasks.delete(name);
212224
}
213225

214226
if (execDeps) {
@@ -223,6 +235,8 @@ abstract class AbstractTask<R = void> {
223235

224236
IO.println(`> ${chalk.white.dim(`:${name}`)}`);
225237
const result = await callExecute();
238+
239+
this.blaze.taskManager.executedTasks.add(name);
226240
const { call: callGenerateOutput } = this.findOutputGenerator();
227241

228242
this._output = callGenerateOutput

blazebuild/src/main/typescript/tasks/TaskManager.ts

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,8 @@ class TaskManager extends Manager {
77
private static readonly builtInTasks: Array<new (blaze: Blaze) => AbstractTask<any>> = [];
88
private readonly tasks = new Map<string, AbstractTask<any>>();
99
private readonly classToTaskMap = new Map<typeof AbstractTask<any>, AbstractTask<any>>();
10-
private readonly executedTasks = new Set<string>();
10+
public readonly executedTasks = new Set<string>();
11+
public readonly upToDateTasks = new Set<string>();
1112

1213
public override async boot() {
1314
for (const TaskClass of TaskManager.builtInTasks) {
@@ -28,7 +29,7 @@ class TaskManager extends Manager {
2829
: this.classToTaskMap.get(taskName);
2930

3031
if (!task) {
31-
throw new TaskNotFoundError(`Task ${taskName} not found!`).setTaskName(
32+
throw new TaskNotFoundError(`Task '${taskName}' could not be found!`).setTaskName(
3233
typeof taskName === "string" ? taskName : taskName.name
3334
);
3435
}
@@ -39,12 +40,19 @@ class TaskManager extends Manager {
3940
public async executeTask(taskName: string) {
4041
const task = this.resolveTask(taskName);
4142
await task.execute();
42-
this.executedTasks.add(taskName);
4343
}
4444

4545
public getExecutedTaskCount() {
4646
return this.executedTasks.size;
4747
}
48+
49+
public getUpToDateTasks() {
50+
return this.upToDateTasks.size;
51+
}
52+
53+
public getActionableTaskCount() {
54+
return this.upToDateTasks.size + this.executedTasks.size;
55+
}
4856
}
4957

5058
export default TaskManager;

blazew

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -276,7 +276,7 @@ blaze_cmd() {
276276
if [ ! -e "$projectdir/.blaze/build.d.ts" ]; then
277277
print 34 "info " "Creating $projectdir/.blaze/build.d.ts..."
278278
mkdir -p "$projectdir/.blaze"
279-
cp "$blaze_srcpath/templates/build.d.ts" "$projectdir/.blaze/build.d.ts"
279+
cp "$blaze_srcpath/src/main/typescript/types/build.d.ts" "$projectdir/.blaze/build.d.ts"
280280

281281
if [ $? -ne 0 ]; then
282282
print "1;31" "error " "Failed to create build.d.ts."
@@ -303,7 +303,7 @@ if [ $setup -eq 1 ]; then
303303
rm -rf "$projectdir/node_modules/blazebuild" || exit 1
304304
fi
305305

306-
ln -s "$(readlink -f "$blaze_srcpath")" "$projectdir/node_modules/blazebuild" || exit 1
306+
ln -s "$(readlink -f "$blaze_srcpath/src/main/typescript")" "$projectdir/node_modules/blazebuild" || exit 1
307307

308308
if [ -z "$has_bun" ]; then
309309
print 34 "info " "Building BlazeBuild (for node)..."

build.blaze.ts

Lines changed: 16 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -1,69 +1,21 @@
11
import "blazebuild/types/build.d";
22

3-
import AbstractTask from "blazebuild/tasks/AbstractTask";
4-
import { TaskAction } from "blazebuild/tasks/TaskAction";
5-
import { TaskDependencyGenerator } from "blazebuild/tasks/TaskDependencyGenerator";
6-
import { TaskInputGenerator } from "blazebuild/tasks/TaskInputGenerator";
7-
import { TaskOutputGenerator } from "blazebuild/tasks/TaskOutputGenerator";
8-
import { setOf } from "blazebuild/utils/collection";
9-
import { $ } from "bun";
10-
import { rm } from "fs/promises";
11-
12-
class CleanTask extends AbstractTask {
13-
@TaskOutputGenerator
14-
protected override generateOutput() {
15-
return setOf("tmp/test-report.txt", "tmp/output.txt");
16-
}
17-
18-
@TaskAction
19-
protected override async run() {
20-
await rm("tmp/test-report.txt", { force: true });
21-
await rm("tmp/output.txt", { force: true });
22-
}
23-
}
24-
class TestTask extends AbstractTask {
25-
@TaskOutputGenerator
26-
protected override generateOutput() {
27-
return setOf("tmp/test-report.txt");
28-
}
29-
30-
@TaskAction
31-
protected override async run() {
32-
console.log("Testing project...");
33-
await new Promise(resolve => setTimeout(resolve, 1000));
34-
Bun.write("tmp/test-report.txt", "report");
35-
}
36-
}
37-
38-
class BuildTask extends AbstractTask {
39-
@TaskInputGenerator
40-
protected override generateInput() {
41-
return setOf("tmp/input.txt");
42-
}
43-
44-
@TaskOutputGenerator
45-
protected override generateOutput() {
46-
return setOf("tmp/output.txt");
47-
}
48-
49-
@TaskDependencyGenerator
50-
protected override dependencies() {
51-
return setOf(TestTask);
52-
}
53-
54-
@TaskAction
55-
protected override async run() {
56-
console.log("Running task!");
57-
await new Promise(resolve => setTimeout(resolve, 2000));
58-
const inputFile = Bun.file("tmp/input.txt");
59-
const content = (await inputFile.exists())
60-
? "Copied: " + (await inputFile.text())
61-
: "Default content";
62-
Bun.write("tmp/output.txt", content);
63-
await $`echo "Build successful!"`;
64-
}
65-
}
66-
3+
import BuildTask from "@buildSrc/tasks/BuildTask";
4+
import CleanTask from "@buildSrc/tasks/CleanTask";
5+
import CompileTask from "@buildSrc/tasks/CompileTask";
6+
import CompileTypeScriptTask from "@buildSrc/tasks/CompileTypeScriptTask";
7+
import DependenciesTask from "@buildSrc/tasks/DependenciesTask";
8+
import LintTask from "@buildSrc/tasks/LintTask";
9+
import ProcessCoverageReportsTask from "@buildSrc/tasks/ProcessCoverageReportsTask";
10+
import RunTask from "@buildSrc/tasks/RunTask";
11+
import TestTask from "@buildSrc/tasks/TestTask";
12+
13+
tasks.register(DependenciesTask);
6714
tasks.register(CleanTask);
15+
tasks.register(CompileTypeScriptTask);
16+
tasks.register(CompileTask);
6817
tasks.register(TestTask);
6918
tasks.register(BuildTask);
19+
tasks.register(LintTask);
20+
tasks.register(ProcessCoverageReportsTask);
21+
tasks.register(RunTask);

build_src/src/main/typescript/tasks/BuildTask.ts

Lines changed: 9 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,17 @@
11
import AbstractTask from "blazebuild/tasks/AbstractTask";
22
import { TaskAction } from "blazebuild/tasks/TaskAction";
3-
import { TaskInputGenerator } from "blazebuild/tasks/TaskInputGenerator";
4-
import { TaskOutputGenerator } from "blazebuild/tasks/TaskOutputGenerator";
5-
import { Awaitable } from "blazebuild/types/utils";
6-
import { $ } from "bun";
7-
import { glob } from "glob";
8-
import path from "path";
3+
import { TaskDependencyGenerator } from "blazebuild/tasks/TaskDependencyGenerator";
4+
import CompileTask from "./CompileTask";
5+
import LintTask from "./LintTask";
6+
import TestTask from "./TestTask";
97

108
class BuildTask extends AbstractTask {
11-
@TaskInputGenerator
12-
protected override generateInput(): Awaitable<string[]> {
13-
return glob(path.resolve(process.cwd(), "src/**/*.ts"));
14-
}
15-
16-
@TaskOutputGenerator
17-
protected override generateOutput(): Awaitable<string[]> {
18-
return glob(path.resolve(process.cwd(), "build/out/**/*.js"));
19-
}
20-
219
@TaskAction
22-
protected override async run(): Promise<void> {
23-
await $`tsc`;
10+
protected override async run(): Promise<void> {}
11+
12+
@TaskDependencyGenerator
13+
protected override async dependencies() {
14+
return [CompileTask, LintTask, TestTask];
2415
}
2516
}
2617

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
import AbstractTask from "blazebuild/tasks/AbstractTask";
2+
import { TaskAction } from "blazebuild/tasks/TaskAction";
3+
import { TaskOutputGenerator } from "blazebuild/tasks/TaskOutputGenerator";
4+
import { rm } from "fs/promises";
5+
6+
class CleanTask extends AbstractTask {
7+
@TaskAction
8+
protected override async run(): Promise<void> {
9+
await rm("build", { recursive: true, force: true });
10+
}
11+
12+
@TaskOutputGenerator
13+
protected override async generateOutput() {
14+
return ["build"];
15+
}
16+
}
17+
18+
export default CleanTask;
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
import AbstractTask from "blazebuild/tasks/AbstractTask";
2+
import { TaskAction } from "blazebuild/tasks/TaskAction";
3+
import { TaskDependencyGenerator } from "blazebuild/tasks/TaskDependencyGenerator";
4+
import { TaskInputGenerator } from "blazebuild/tasks/TaskInputGenerator";
5+
import { TaskOutputGenerator } from "blazebuild/tasks/TaskOutputGenerator";
6+
import type { Awaitable } from "blazebuild/types/utils";
7+
import { glob } from "glob";
8+
import path from "path";
9+
import CompileTypeScriptTask from "./CompileTypeScriptTask";
10+
11+
class CompileTask extends AbstractTask {
12+
@TaskAction
13+
protected override async run(): Promise<void> {}
14+
15+
@TaskDependencyGenerator
16+
protected override async dependencies() {
17+
return [CompileTypeScriptTask];
18+
}
19+
20+
@TaskInputGenerator
21+
protected override generateInput(): Awaitable<string[]> {
22+
return glob(path.resolve(process.cwd(), "src/**/*.ts"));
23+
}
24+
25+
@TaskOutputGenerator
26+
protected override generateOutput(): Awaitable<string[]> {
27+
return glob(path.resolve(process.cwd(), "build/out/**/*.js"));
28+
}
29+
}
30+
31+
export default CompileTask;
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
import AbstractTask, { TaskResolvable } from "blazebuild/tasks/AbstractTask";
2+
import { TaskAction } from "blazebuild/tasks/TaskAction";
3+
import { TaskDependencyGenerator } from "blazebuild/tasks/TaskDependencyGenerator";
4+
import { TaskInputGenerator } from "blazebuild/tasks/TaskInputGenerator";
5+
import { TaskOutputGenerator } from "blazebuild/tasks/TaskOutputGenerator";
6+
import type { Awaitable } from "blazebuild/types/utils";
7+
import { $ } from "bun";
8+
import { glob } from "glob";
9+
import path from "path";
10+
import DependenciesTask from "./DependenciesTask";
11+
12+
class CompileTypeScriptTask extends AbstractTask {
13+
@TaskAction
14+
protected override async run(): Promise<void> {
15+
await $`tsc`;
16+
}
17+
18+
@TaskInputGenerator
19+
protected override generateInput(): Awaitable<string[]> {
20+
return glob(path.resolve(process.cwd(), "src/**/*.ts"));
21+
}
22+
23+
@TaskOutputGenerator
24+
protected override generateOutput(): Awaitable<string[]> {
25+
return glob(path.resolve(process.cwd(), "build/out/**/*.js"));
26+
}
27+
28+
@TaskDependencyGenerator
29+
protected override dependencies(): Awaitable<Iterable<TaskResolvable<any>>> {
30+
return [DependenciesTask];
31+
}
32+
}
33+
34+
export default CompileTypeScriptTask;
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
import AbstractTask from "blazebuild/tasks/AbstractTask";
2+
import { TaskAction } from "blazebuild/tasks/TaskAction";
3+
import { TaskInputGenerator } from "blazebuild/tasks/TaskInputGenerator";
4+
import { $ } from "bun";
5+
6+
class DependenciesTask extends AbstractTask {
7+
@TaskAction
8+
protected override async run(): Promise<void> {
9+
await $`bun install`;
10+
await $`test -e $(pwd)/node_modules/blazebuild && rm -r $(pwd)/node_modules/blazebuild || true`;
11+
await $`ln -s $(pwd)/blazebuild/src/main/typescript $(pwd)/node_modules/blazebuild`;
12+
}
13+
14+
@TaskInputGenerator
15+
protected override generateInput(): string[] {
16+
return ["node_modules"];
17+
}
18+
}
19+
20+
export default DependenciesTask;

0 commit comments

Comments
 (0)